Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java测试圆是否重叠_Java - Fatal编程技术网

Java测试圆是否重叠

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.

我有一个程序可以画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.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+r2
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
的成本相当高,因此,如果您只需要一个数字的平方,请将其替换为更简单的版本。
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
的成本相当高,因此如果您只需要一个数字的平方,请用更简单的版本替换它