我有一个程序可以用随机的 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/