是否可以对折线形状javaFX进行网格化

时间:2016-12-08 09:45:15

标签: for-loop javafx grid

所以我现在正在使用javaFX制作一个游戏,并且该板具有六边形的形状。我使用折线并给出了固定点,如下所示。

Colour - red / blue / yellow / navy

我得到了这个输出

output

我遇到的问题是尝试对此形状进行网格化。有人可以告诉我如何格式化折线导入?或者我会更好地从内置网格的for循环创建一个六边形?如果是这样,你能告诉我从for循环制作六边形的最佳方法吗?谢谢。

1 个答案:

答案 0 :(得分:2)

由于多边形的高度为

,因此永远不会将所有值都设为整数
(width * sqrt(3)) / 2

你的形状可能看起来像一个普通的六边形,但它不是一个,一旦你从这些形状创建网格就会变得明显。

最简单的创建方法是使用极坐标,其原点位于多边形的中心,并将它们转换为笛卡尔坐标。此外,我建议使用Polygon代替Polyline,因为此形状会自动关闭。

为了计算网格位置,请注意您可以将六边形放在彼此下方,其垂直方向的偏移量等于六边形的高度(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();
}