2017-09-09 8 views
0

割り当てのために、私は六角形のグリッドを描いていました。私はそれを得ることができましたが、ウインドウは水平方向に上位2行(7つのうち)しか表示しませんでしたが、すべて垂直に表示しませんでした。グリッドがウィンドウに完全に表示されていないので、なぜそれがそれをしているのだろうかと思っています。Javaグラフィックスウィンドウ/キャンバスが垂直方向に完全な六角形のグリッドを表示しない

import java.awt.*; 
import java.awt.event.*; 
import static java.lang.Math.sqrt; 

public class hex extends Frame { 

    public static void main(String[] args) { 
     new hex(); 
    } 

    public hex(){ //the class for the frame, also to close the application 
     super("hex"); 
     addWindowListener(new WindowAdapter(){ 
      public void windowClosing(WindowEvent e){ 
       System.exit(0);} 
     }); 
     setSize(600,400); 
     add("Center", new CvHex()); 
     show(); 
    } 
} 

class CvHex extends Canvas{ 
    int centerX, centerY; 
    float pixelSize, rWidth = 10.0F, rHeight = 10.0F, xP = 1000000, yP; 

    CvHex() { 
     addMouseListener(new MouseAdapter(){ 
      public void mousePressed(MouseEvent evt){ 
       xP = fx(evt.getX()); yP = fy(evt.getY()); 
       repaint(); 
      } 
     }); 
    } 

    void initgr(){ 
     Dimension d = getSize(); 
     int maxX = d.width-1, maxY = d.height-1; 
     pixelSize = Math.max(rWidth/maxX, rHeight/maxY); 
     centerX = maxX/2; centerY = maxY/2; 
    } 
    int iX(float x){ return 
      Math.round(centerX + x/pixelSize);} //114 

    float fx(int x){  
     return (x-centerX)*pixelSize;} 

    int iY(float y){ 
     return Math.round(centerY - y/pixelSize);} 

    float fy(int y){  
     return (centerY - y)*pixelSize; } 

    public void paint(Graphics g){ 
     initgr(); 
     int left = iX(-rWidth/2), right = iX(rWidth/2), bottom = iY(-rHeight/2), 
       top = iY(rHeight/2), xMiddle = iX(0), yMiddle = iY(0); 

     //to rotate to flat 
     right = ((right - xMiddle)/2) + xMiddle; 
     left = ((xMiddle - left)/2) + left; 
     top = ((yMiddle - top)/2) + top; 
     bottom = ((bottom - yMiddle)/2) + yMiddle; 

     int side = (right - xMiddle)/2; 

     int rightmost = (int)sqrt((side * side) + (yMiddle * yMiddle)); 
     rightmost = (rightmost/2) + right; 
     int leftmost = side; 
     leftmost = left - (2*leftmost); 

     int totalL = rightmost - leftmost; 

     //for the offset (side) hexagon 
      int lM, rM, sTop, sBottom, sY, sLeft, sRight; 
      sTop = yMiddle; //should be good 
      sBottom = yMiddle * 2; //should be good 
      lM = right; //good 
      sY = bottom; //good 
      sLeft = rightmost; //good 

      sRight = rightmost + (4*side); 

      int length = sLeft - lM; 
      rM = sRight + length; 

      for (int i = 0; i < 7; i++){ 

      //first hexagon 
      g.drawLine(right, top, rightmost, yMiddle); 
      g.drawLine(right, bottom, rightmost, yMiddle); 
      g.drawLine(left, top, leftmost, yMiddle); 
      g.drawLine(left, bottom, leftmost, yMiddle); 
      g.drawLine(left, bottom, right, bottom); //x, y, w, h 
      g.drawLine(right, top, left, top); 

      //for the bottom hexagon 
      int dMiddle = yMiddle * 2; 
      int dTop = bottom; 
      int dBottom = bottom * 2; 

      g.drawLine(right, dTop, rightmost, dMiddle); 
      g.drawLine(right, dBottom, rightmost, dMiddle); 
      g.drawLine(left, dTop, leftmost, dMiddle); 
      g.drawLine(left, dBottom, leftmost, dMiddle); 
      g.drawLine(left, dBottom, right, dBottom); //x, y, w, h 
      g.drawLine(right, dTop, left, dTop); 

      //offset right 
      leftmost = rightmost + (4*side); 
      left = right + totalL; 
      right = left + (4*side); 
      rightmost = right + length; 
     } 

    //for the offset side column 
     for (int j = 0; j < 7; j++){ 

      g.drawLine(sRight, sTop, rM, sY); 
      g.drawLine(sRight, sBottom, rM, sY); 
      g.drawLine(sLeft, sTop, lM, sY); 
      g.drawLine(sLeft, sBottom, lM, sY); 
      g.drawLine(sLeft, sBottom, sRight, sBottom); //x, y, w, h 
      g.drawLine(sRight, sTop, sLeft, sTop); 

      int oY = sY * 2; 
      int oTop = sBottom; 
      int oBottom = sBottom * 2; 

      g.drawLine(sRight, oTop, rM, oY); 
      g.drawLine(sRight, oBottom, rM, oY); 
      g.drawLine(sLeft, oTop, lM, oY); 
      g.drawLine(sLeft, oBottom, lM, oY); 
      g.drawLine(sLeft, oBottom, sRight, oBottom); //x, y, w, h 
      g.drawLine(sRight, oTop, sLeft, oTop); 

      //offset right 
      lM = rM + (4*side); 
      sLeft = sRight + totalL; 
      sRight = sLeft + (4*side); 
      rM = sRight + length; 
     } 

    } 
} 

これは私が話しているものです。正規 :私はここで見てきたstretched vertically but nothing changes except that it scales the original window instead of fitting all the shapes as I want it to

:私はにそれをしたいと、それはしかし、すべての形状を示すべきではないとしてacross

縦に伸ばし、普通のスケール:Regular pop-out

が張らそれを救うことができる何かが、私が見つけた解決策は、Graphics2dとスイング、jFrameなどです。私が慣れていないこと。

答えて

0

スケーリングコードには、ライン描画フェーズで特に目を通すことが多すぎます。私はそれを実行し、x値が非常に小さいので完全に変形するので、完全に書き直すことなく修正することはできません。

いくつかのヒント:。

  • 六角形がを計算し、そこから行くその後、対称的でなければならない限り、あなたは独立のx距離とyの距離をスケーリングていることを確認します
  • 対称/無限グリッドが必要な場合を除いて、中心を使用しないでください。画面全体をX列とY行に分割し、幅/長さとして使用します。
  • あなたは幅&長さと左上隅を持ったら、あなただけの左上隅からそこからヒントについて

    top-left + width/3 
    top-left + 2*width/3 
    top-left + width + height/2, etc 
    
+0

おかげで、六角形を作るが、あなたが意味することができますx距離とy距離スケールを独立にすると、私はmaxXとmaxyを意味しますか?窓から独立していますか? – CodingNoob

+0

私はpixelScale値を意味します。六角形のグリッドが画面に正確に収まるようにするには、六角の幅が画面の幅に一致する必要があります。あなたはあなたの要求を詳しく述べる必要があります。 –

関連する問題