我的应用中有一个圈子的arraylist。基本上,我正在画一个由六边形瓷砖制成的游戏板。我想在每个瓷砖的每个角上画圆圈。我将所有瓷砖存储在Tile对象数组中。每个图块都有一个构成图块的点阵列。所以我基本上遍历每个瓷砖和瓷砖的每个角落。我的问题是大多数瓷砖共用交叉点。因此,为共享该交集的每个图块绘制一个圆。但我只想在每个十字路口画一个。我需要做的是检查数组中是否存在具有特定坐标集的圆。如果确实存在,请不要绘制圆圈。我知道ArrayList.contains(),但不知道如何将它用于我的目的。有什么想法吗?
for (int t = 0; t < tiles.length; t++) {
//Loop through the vertices of the current tile
for (int v = 0; v < tiles[t].vertices.length; v++) {
final double x = tiles[t].vertices[v].x;
final double y = tiles[t].vertices[v].y;
Platform.runLater(() -> {
//This if statement doesn't work because the arraylist contains shapes, not points!
if(!highlightedVertices.contains(new Point((int)x, (int)y))){
Circle cir = new Circle();
cir.setFill(Color.web("rgba(255, 235, 138, .3)"));
cir.setCenterX(x);
cir.setCenterY(y);
cir.setRadius(windowHeight * .025);
highlightedVertices.add(cir);
wrapperPane.getChildren().add(cir);
}
});
}
}
答案 0 :(得分:1)
您使用的Circle
类可以实现方法equals
,因为Collection
类在方法contains(Object o)
中使用逻辑:
(o == null ? e == null: o.equals(e));
其中e
是列表中的当前对象,o
是要比较的对象。
所以,你的Circle
课程将是:
Class Circle
public class Circle {
private double centerX; //Asumming is a double
private double centerY; //Asumming is a double
private double radius;
// +getters and setters
@Override
public boolean equals(Object o) {
if (o == null)
return false;
if (o instance of Circle) {
Circle paramCircle = (Circle) o;
if (paramCircle.getCenterX() == this.centerX && paramCircle.getCenterY() == this.centerY && paramCircle.getRadius() == this.radius) {
return true;
}
return false;
}
}
答案 1 :(得分:0)
经过一番思考后,我意识到塞巴斯蒂安的答案是行不通的,因为每个“十字路口”都有一个像素的偏移量。我写的下面的代码工作得很好。我只是绕过了arraylist中的每个圆圈,并确定它们是否都包含新圆圈的原点。
private boolean CircleExists(Point origin, ArrayList<Circle> circles){
boolean output = false;
for(int i = 0; i < circles.size(); i++){
Circle cir = circles.get(i);
if(cir.contains(origin.x, origin.y)){
output = true;
}
}
return output;
}