尝试随机化节点的位置,而不重叠JavaFX

时间:2017-09-29 17:55:06

标签: java

我已经创建了一个for循环来将我的所有节点添加到根目录中,但由于它们的位置是随机的,因此它们中的一堆最终会重叠。

我添加了一个for循环来移动一个节点,如果它与另一个节点重叠,虽然它并没有真正解决问题,因为它可能只是与另一个重叠。

任何人都知道最终没有重叠节点的好方法吗?

这是我的代码:

for (int i = 0; i < citiesText.length; i++) {

citiesText[i] = new Text(cities[i][0]);
citiesText[i].setFont(Font.font("Impact", 40));
citiesText[i].setFill(Color.WHITE);
citiesText[i].setStrokeWidth(2); 
citiesText[i].setStroke(Color.BLACK); 

double height = citiesText[i].getBoundsInParent().getHeight();
double width = citiesText[i].getBoundsInParent().getWidth();
double maxX = 1000 - width;
double maxY = 550 - height;

root.getChildren().add(citiesText[i]);
citiesText[i].relocate(Math.random()*maxX, Math.random()*maxY);

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

if (citiesText[i].getBoundsInParent().intersects(citiesText[j].getBoundsInParent()))
    citiesText[i].relocate(Math.random()*maxX, Math.random()*maxY); 
}   

}

1 个答案:

答案 0 :(得分:0)

你可以添加一个标志,当标志为真时保持循环,直到没有重叠。这可能不是最有效的方法,但应该有效。即。

boolean overlap = true;
while(overlap){
     overlap = false;
     for (int j = 0; j < citiesText.length; j++) {

         if(citiesText[i].getBoundsInParent().intersects(citiesText[j].getBoundsInParent())){
             citiesText[i].relocate(Math.random()*maxX, Math.random()*maxY); 
             overlap = true;
         }

     }   
}