2016-12-08 7 views
0

私は現在javaFXでゲームを作っており、ボードは六角形の形をしています。ポリラインを使って、以下に示すように固定小数点を与えました。ポリライン形状をグリッド化することは可能ですか?

// Create a hexagon 
    Polyline hexagon = new Polyline(400.0,600.0, 
            700.0,600.0, 
            800.0,400.0, 
            700.0,200.0, 
            400.0,200.0, 
            300.0,400.0, 
            400.0,600.0 
            ); 
     hexagon.setFill(Color.BLACK); 
     hexagon.setStroke(Color.BLACK); 

私は私が午前問題は、グリッドにこの形状をしようとしている。この出力

output

を取得します。誰かが私にポリラインのインポートをグリッドする方法を教えてもらえますか?または、グリッドを組み込んだforループから六角形を作成する方が良いでしょうか?もしそうなら、forループから六角形を作ることを可能にする最良の方法を教えてください。ありがとう。

答えて

2

ポリゴンの高さがあるので、あなたは決してすべての値は、一体によ

(width * sqrt(3))/2 
は、しかし、それはあなたが作成したら、明らかになった1、あなたの形状が正六角形のように見えるかもしれ

ではありません それらの図形からのグリッド。

これを作成する最も簡単な方法は、ポリゴンの中心に原点を持つ極座標を使用し、それらをデカルト座標に変換することです。さらに、Polylineの代わりにPolygonを使用することをお勧めします。この形状は自動的に閉じられます。

グリッド位置を計算するには、六角形を垂直方向の六角形の高さ(radius * sqrt(3))に等しいオフセットで置きます。水平方向では、x座標の差は(3/2) * radiusです。これは、次の六角形の左端の点が前の六角形の右下または右上の点に揃えられているためです。 y座標は、六角形の高さの半分(上下に交互に)変更されます。

private final static double HEX_RAD_DELTA = Math.PI/3; 

public static Polygon createHexagon(double centerX, double centerY, double radius, Paint fill) { 
    Polygon hex = new Polygon(); 

    // comparing to 6 is enough to ensure every angle is used once here 
    // since (5/6) * 2 * PI < 6 < 2 * PI 
    for (double rad = 0; rad < 6; rad += HEX_RAD_DELTA) { 
     hex.getPoints().addAll(Math.cos(rad) * radius + centerX, Math.sin(rad) * radius + centerY); 
    } 

    hex.setFill(fill); 
    hex.setStroke(Color.BLACK); 
    return hex; 
} 

@Override 
public void start(Stage primaryStage) { 
    Color[] fills = new Color[] { 
     Color.RED, 
     Color.BLUE, 
     Color.LIME, 
     Color.ORANGE, 
     Color.TURQUOISE, 
     Color.BROWN, 
     Color.YELLOW 
    }; 

    final double radius = 50; 
    final double dY = radius * Math.sqrt(3)/2; 

    Pane root = new Pane(); 
    for (int y = 0, colorIndex = 0; y < 10; y++) { 
     double offsetY = 2 * dY * y + 50; 
     for (int x = 0; x < 10; x++, colorIndex = (colorIndex + 1) % fills.length) { 
      root.getChildren().add(createHexagon(
        1.5 * radius * x + 50, 
        (x & 1) == 0 ? offsetY : offsetY + dY, 
        radius, 
        fills[colorIndex])); 
     } 
    } 

    Scene scene = new Scene(root); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 
+0

ありがとうございました。私は4ループの周りで頭を上げようと努力しています。私は本当に助けに感謝します。 – enat

関連する問題