Java测试圆是否重叠
我有一个程序可以画20个圆,随机半径为x和y。之后,我需要测试哪些圆重叠,如果重叠,将它们设置为青色,如果不重叠,将它们设置为黑色。到目前为止,问题是它总是将其设置为青色重叠或不重叠Java测试圆是否重叠,java,Java,我有一个程序可以画20个圆,随机半径为x和y。之后,我需要测试哪些圆重叠,如果重叠,将它们设置为青色,如果不重叠,将它们设置为黑色。到目前为止,问题是它总是将其设置为青色重叠或不重叠 public class AppletP5 extends JApplet{ MyCircle[] circle = new MyCircle[20]; public AppletP5(){ for(int i = 0; i<20; i++){ int x0= (int) (Math.
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;
}
公共类AppletP5扩展了JApplet{
MyCircle[]circle=新MyCircle[20];
公共应用程序p5(){
对于(int i=0;i,您需要从比较中排除当前的圆
,因为一个圆本身很少重叠
只要每个圆只有一个实例,您就可以进行简单的检查:
for (MyCirlce c : circles) {
if (c != this && ...)
此外,您正在检查两个圆的半径之差是否大于两个中心的距离?您不应该检查半径之和,例如:
r1 + r2 <= distance(c1, c2)
r1+r2您需要将当前的圆
从比较中排除,因为一个圆本身很少重叠
只要每个圆只有一个实例,您就可以进行简单的检查:
for (MyCirlce c : circles) {
if (c != this && ...)
此外,您正在检查两个圆的半径之差是否大于两个中心的距离?您不应该检查半径之和,例如:
r1 + r2 <= distance(c1, c2)
r1+r2isOverLapping
执行不正确。
如果两个圆的中心距离小于其半径之和,则两个圆相交。因此:
int radSum = c.rad + rad;
int radDif = c.rad - rad;
int distX = c.x - x + radDif;
int distY = c.y - y + radDif;
if(radSum * radSum < distX * distX + distY * distY)
return true;
int radSum=c.rad+rad;
int radDif=c.rad-rad;
int distX=c.x-x+radDif;
int distY=c.y-y+radDif;
if(radSum*radSum
除此之外,您还必须确保不要将圆与自身进行比较。最后:Math.pow
的成本相当高,因此,如果您只需要一个数字的平方,请将其替换为更简单的版本。isOverLapping
是不正确的。
如果两个圆的中心距离小于其半径之和,则两个圆相交。因此:
int radSum = c.rad + rad;
int radDif = c.rad - rad;
int distX = c.x - x + radDif;
int distY = c.y - y + radDif;
if(radSum * radSum < distX * distX + distY * distY)
return true;
int radSum=c.rad+rad;
int radDif=c.rad-rad;
int distX=c.x-x+radDif;
int distY=c.y-y+radDif;
if(radSum*radSum
除此之外,您还必须确保不要将圆与自身进行比较。最后:Math.pow
的成本相当高,因此如果您只需要一个数字的平方,请用更简单的版本替换它