检查arraylist中是否存在具有特定坐标的圆圈?

时间:2017-02-02 17:00:02

标签: java arraylist geometry

我的应用中有一个圈子的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);
            }
        });
    }

}

2 个答案:

答案 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;
    }