所以我现在正在使用javaFX制作一个游戏,并且该板具有六边形的形状。我使用折线并给出了固定点,如下所示。
Colour - red / blue / yellow / navy
我得到了这个输出
我遇到的问题是尝试对此形状进行网格化。有人可以告诉我如何格式化折线导入?或者我会更好地从内置网格的for循环创建一个六边形?如果是这样,你能告诉我从for循环制作六边形的最佳方法吗?谢谢。
答案 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();
}