【问题标题】:Check if a circle with certain coordinates exists in arraylist?检查arraylist中是否存在具有特定坐标的圆?
【发布时间】:2017-06-19 20:50:48
【问题描述】:

我的应用中有一个圆圈数组列表。基本上,我正在绘制一个由六边形瓷砖制成的游戏板。我想在每个瓷砖的每个角上画圆圈。我将所有图块存储在一个 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);
            }
        });
    }

}

【问题讨论】:

  • 圈内还是圈外?因为内圈永远不会到达六边形的角
  • 外面。圆的中心与六边形的角相同。

标签: java arraylist geometry


【解决方案1】:

你正在使用的Circle类可以实现equals方法,由于Collection类在方法contains(Object o)中使用的逻辑:

(o == null ? e == null: o.equals(e));

其中e 是列表中的当前对象,o 是要比较的对象。

因此,您的 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;
    }
}

【讨论】:

  • 我认为您的意思是 instanceof 而不是 instance of
  • 哦,我的错,是错字。谢谢
【解决方案2】:

经过一番思考,我意识到塞巴斯蒂安的答案行不通,因为每个“交叉点”都有 1 个像素的偏移量。我编写的下面的代码运行良好。我只是遍历了 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;
    }

【讨论】:

  • 由于 2 个圆是相同的当且仅当它们具有相同的中心和半径时,当您移动中心时,您实际上有一个不同的圆 - 所以它们不应该相等。如果六边形交叉点是可能的中心,并且您知道所有圆的半径,则可以使用@Sebastian 的解决方案来检查您是否已经创建了每个圆。
猜你喜欢
  • 2012-08-29
  • 2011-10-06
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多