For loop 可以为多段线形状javaFX设置网格吗

For loop 可以为多段线形状javaFX设置网格吗,for-loop,javafx,grid,For Loop,Javafx,Grid,因此,我目前正在用javaFX制作一个游戏,棋盘的形状为六边形。我使用了多段线并给它固定点,如下所示 // Create a hexagon Polyline hexagon = new Polyline(400.0,600.0, 700.0,600.0, 800.0,400.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);
我得到这个输出


我遇到的问题是尝试将此形状网格化。有人能告诉我如何网格化多段线导入吗?或者我最好从内置网格的for循环创建一个六边形?如果是这样的话,你能告诉我用for循环制作六边形的最佳方法吗?谢谢

由于多边形的高度为

(width * sqrt(3)) / 2
您的形状可能看起来像一个正六边形,但它不是一个,这在您从这些形状创建网格后变得很明显

最简单的创建方法是使用原点位于多边形中心的极坐标,并将其转换为笛卡尔坐标。此外,我建议使用
多边形
而不是
多段线
,因为此形状是自动闭合的

要计算网格位置,请注意,您只需将六边形放置在彼此下方,垂直方向上的偏移量等于六边形的高度(
radius*sqrt(3)
)。在水平方向上,x坐标的差值为
(3/2)*半径
,因为下一个六边形的最左侧点与上一个六边形的右下或右上点对齐。y坐标改变为六边形高度的一半(上下交替)

private final static double HEX_RAD_DELTA=Math.PI/3;
公共静态多边形createHexagon(双中心X、双中心Y、双半径、绘制填充){
多边形十六进制=新多边形();
//与6相比足以确保每个角度在此处使用一次
//自(5/6)*2*PI<6<2*PI
对于(双rad=0;rad<6;rad+=HEX_rad_DELTA){
hex.getPoints().addAll(数学cos(rad)*半径+中心x,数学sin(rad)*半径+中心y);
}
十六进制设置填充(填充);
六角调整行程(颜色为黑色);
返回十六进制;
}
@凌驾
公共无效开始(阶段primaryStage){
颜色[]填充=新颜色[]{
颜色,红色,
颜色,蓝色,
颜色,石灰,
颜色,橙色,
颜色:青绿色,
颜色:棕色,
颜色:黄色
};
最终双半径=50;
最终双dY=半径*数学sqrt(3)/2;
窗格根=新窗格();
对于(int y=0,colorIndex=0;y<10;y++){
双偏置=2*dY*y+50;
对于(int x=0;x<10;x++,colorIndex=(colorIndex+1)%fills.length){
root.getChildren().add(createHexagon(
1.5*半径*x+50,
(x&1)==0?偏置:偏置+dY,
半径
填充[颜色索引]);
}
}
场景=新场景(根);
初级阶段。场景(场景);
primaryStage.show();
}

由于多边形的高度为

(width * sqrt(3)) / 2
您的形状可能看起来像一个正六边形,但它不是一个,这在您从这些形状创建网格后变得很明显

最简单的创建方法是使用原点位于多边形中心的极坐标,并将其转换为笛卡尔坐标。此外,我建议使用
多边形
而不是
多段线
,因为此形状是自动闭合的

要计算网格位置,请注意,您只需将六边形放置在彼此下方,垂直方向上的偏移量等于六边形的高度(
radius*sqrt(3)
)。在水平方向上,x坐标的差值为
(3/2)*半径
,因为下一个六边形的最左侧点与上一个六边形的右下或右上点对齐。y坐标改变为六边形高度的一半(上下交替)

private final static double HEX_RAD_DELTA=Math.PI/3;
公共静态多边形createHexagon(双中心X、双中心Y、双半径、绘制填充){
多边形十六进制=新多边形();
//与6相比足以确保每个角度在此处使用一次
//自(5/6)*2*PI<6<2*PI
对于(双rad=0;rad<6;rad+=HEX_rad_DELTA){
hex.getPoints().addAll(数学cos(rad)*半径+中心x,数学sin(rad)*半径+中心y);
}
十六进制设置填充(填充);
六角调整行程(颜色为黑色);
返回十六进制;
}
@凌驾
公共无效开始(阶段primaryStage){
颜色[]填充=新颜色[]{
颜色,红色,
颜色,蓝色,
颜色,石灰,
颜色,橙色,
颜色:青绿色,
颜色:棕色,
颜色:黄色
};
最终双半径=50;
最终双dY=半径*数学sqrt(3)/2;
窗格根=新窗格();
对于(int y=0,colorIndex=0;y<10;y++){
双偏置=2*dY*y+50;
对于(int x=0;x<10;x++,colorIndex=(colorIndex+1)%fills.length){
root.getChildren().add(createHexagon(
1.5*半径*x+50,
(x&1)==0?偏置:偏置+dY,
半径
填充[颜色索引]);
}
}
场景=新场景(根);
初级阶段。场景(场景);
primaryStage.show();
}

非常感谢,这很好地解释了这是一个工作过程,试图让我的头脑绕过4个循环。我真的很感谢你的帮助。非常感谢,这是一个很好的解释,这是一个工作的进展,试图让我的头左右4环。我真的很感谢你的帮助。