turbo30067
turbo30067

Reputation: 1

Java Test if circles overlap

I have a program to draw 20 circles w/ random rad x and y. After, I need to test which circles are overlapping and if they are, set them cyan, if not set them black. heres what I have so far, the problem, is it always sets it to cyan overlapping or not.

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;
}

}

Upvotes: 0

Views: 957

Answers (2)

user4668606
user4668606

Reputation:

isOverLapping is incorrect implemented. Two circles intersect, if the distance between their centers is smaller than the sum of their radii. So:

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;

Apart from that you'll have to ensure you don't compare a circle with itself. And finally: Math.pow is rather costly, so replace it with the simpler version, if you only want the square of a number.

Upvotes: 1

Jack
Jack

Reputation: 133669

You need to exclude the current Circle from the comparison, since a circle trivially overlaps itself.

You could go with an easy check as long as you just have one instance of each Circle:

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

In addition you are checking if the difference of radii between two circles squared by two is greater than the distance of the two centres? Shouldn't you check for the sum of the radii, eg:

r1 + r2 <= distance(c1, c2)

Upvotes: 3

Related Questions