Java 测试圆圈是否重叠

标签 java

我有一个程序可以用随机的 rad x 和 y 绘制 20 个圆。之后,我需要测试哪些圆圈重叠,如果重叠,则将它们设置为青色,如果不重叠,则将它们设置为黑色。这就是我到目前为止所遇到的问题,它总是将其设置为青色重叠或不重叠。

public class AppletP5 extends JApplet{
MyCircle[] circle = new MyCircle[20];
public AppletP5(){
    for(int i = 0; i<20; i++){
        int x0= (int) (Math.random()*500);
        int y0= (int) (Math.random()*500);
        int rad0= (int) (30 + Math.random()*70);
        circle[i] = new MyCircle(x0,y0,rad0);
    }   
}
public void paint(Graphics g){
    for(int i = 0; i<20; i++){
        if(circle[i].isOverlapping(circle) == true){
            g.setColor(Color.CYAN);
            g.drawOval(circle[i].x,circle[i].y,circle[i].rad*2,circle[i].rad*2);
        } else if(circle[i].isOverlapping(circle) == false){
                g.setColor(Color.BLACK);
                g.drawOval(circle[i].x,circle[i].y,circle[i].rad*2,circle[i].rad*2);
            }
        }
    }
}


public class MyCircle {
protected int x, y, rad;
public MyCircle(int x, int y, int rad){
    this.x = x;
    this.y = y;
    this.rad = rad;
}
public boolean isOverlapping(MyCircle[] circles){
    for(MyCircle c : circles){
        if(Math.pow(c.rad  - rad , 2) >= Math.sqrt(Math.pow(x - c.x, 2) + Math.pow(y - c.y , 2))){
            return true;
        }
    }
    return false;
}

}

最佳答案

您需要从比较中排除当前的,因为圆本身很容易重叠。

只要每个Circle只有一个实例,您就可以进行简单的检查:

for (MyCirlce c : circles) {
  if (c != this && ...)

此外,您正在检查两个圆之间的半径差乘以二是否大于两个圆心的距离?你不应该检查半径的总和,例如:

r1 + r2 <= distance(c1, c2)

关于Java 测试圆圈是否重叠,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30494818/

相关文章:

java - 如何修复此递归代码的执行?

java - 在android中给数组赋值时出现异常

java - 按下按钮时退出 fragment 或 Activity

java - 液位动画(电池医生)

java - 查询jsf应用程序的版本信息

Java RMI 无法从外部客户端连接到主机

java - 需要有关设计的建议 与用户角色保持一致

java - xml 消息的队列服务器

java - 在多级继承的情况下如何在java中覆盖具有通用返回类型的方法

java - 使用 BigDecimals 计算 p 的 n 次方根