Java 如何检测重叠圆并相应地填充颜色?

Java 如何检测重叠圆并相应地填充颜色?,java,colors,distance,collision,geometry,Java,Colors,Distance,Collision,Geometry,我使用3个数组(用于x、y和半径大小)创建了5个具有随机x和y坐标和半径的圆。但是,我需要这些圆根据它们是否与另一个圆重叠来动态更改颜色。因此,如果5个圆中有一个完全不重叠,它应该被涂成黑色。重叠圆应为青色。如果两个圆的中心点之间的距离小于其半径之和,则认为两个圆重叠 这是我到目前为止为circles课程所写的内容。 以下代码将在小程序窗口中成功绘制5个圆,并成功计算距离,但问题在于颜色。颜色填充似乎有逻辑错误,我看不出这里有什么问题。有什么建议吗?非常感谢你 public class Circ

我使用3个数组(用于x、y和半径大小)创建了5个具有随机x和y坐标和半径的圆。但是,我需要这些圆根据它们是否与另一个圆重叠来动态更改颜色。因此,如果5个圆中有一个完全不重叠,它应该被涂成黑色。重叠圆应为青色。如果两个圆的中心点之间的距离小于其半径之和,则认为两个圆重叠

这是我到目前为止为circles课程所写的内容。 以下代码将在小程序窗口中成功绘制5个圆,并成功计算距离,但问题在于颜色。颜色填充似乎有逻辑错误,我看不出这里有什么问题。有什么建议吗?非常感谢你

public class Circles extends Applet {

public void paint(Graphics page)
{
    Random locator = new Random();
    int [] xpt = new int [5];
    int [] ypt = new int [5];
    int [] rad = new int [5];

    setPreferredSize (new Dimension(300, 300));
    for (int i = 0; i < xpt.length; i++){

        xpt[i] = locator.nextInt(100); //need to set a number or it goes into millions, cannot set it in Random()
        ypt[i] = locator.nextInt(100);
        rad[i] = locator.nextInt(100);
        System.out.println("The #" + i +  " x-point: " + xpt[i] + " y-point: " + ypt[i] + " radius: " + rad[i]);  //for debugging purposes

        for (int j = 0; j < xpt.length; j++){
            double xpoint1 = xpt[i]+rad[i];
            double ypoint1 = ypt[i]+rad[i];
            double xpoint2 = xpt[j]+rad[j];
            double ypoint2 = ypt[j]+rad[j];
            double radius1 = rad[i];
            double radius2 = rad[j];
            double theDistance = distance(xpoint1,ypoint1,xpoint2,ypoint2); 
            System.out.println("Comparing " + i + " to " + j); //for debugging and logic checking
            if (i==j)
                ;
            else if (theDistance <= (radius1+radius2))
            {
                page.setColor(Color.cyan);
                page.fillOval(xpt[i], ypt[i], rad[i], rad[i]);
                //page.fillOval(xpt[j], ypt[j], rad[j], rad[j]);
                System.out.println("Overlap occurred. Colored " + i + " and " + j + " cyan.");
                System.out.println("Center points: ("+ xpoint1 +", "+ ypoint1 +") and ("+ xpoint2 + ", "+ ypoint2 + ").");
            }
            else  
            {
                page.setColor(Color.black);
                page.fillOval(xpt[i], ypt[i], rad[i], rad[i]);
                //page.fillOval(xpt[j], ypt[j], rad[j], rad[j]);
                System.out.println("No overlap. Made " + i + " and " + j + " black.");
            }
        }
    }
}

public static double distance(
        double x1, double y1, double x2, double y2) {
    return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1));

}
}
public类扩展Applet{
公共空间绘制(图形页)
{
随机定位器=新随机();
int[]xpt=新的int[5];
int[]ypt=新int[5];
int[]rad=新的int[5];
setPreferredSize(新尺寸(300300));
对于(int i=0;i否则如果(距离为什么在这里
+rad[]
),则不必添加半径来比较距离

        double xpoint1 = xpt[i]+rad[i];
        double ypoint1 = ypt[i]+rad[i];
        double xpoint2 = xpt[j]+rad[j];
        double ypoint2 = ypt[j]+rad[j];
 [...]
        double theDistance = distance(xpoint1,ypoint1,xpoint2,ypoint2); 
 [...]
        page.fillOval(xpt[i], ypt[i], rad[i], rad[i]);
您应该使用
xpt
/
ypt
表示距离。而不是
xpoint1
,使用
-
表示值,使用2*半径表示大小……即:

        double xpoint1 = xpt[i]-rad[i];
        double ypoint1 = ypt[i]-rad[i];
        double xpoint2 = xpt[j]-rad[j];
        double ypoint2 = ypt[j]-rad[j];
 [...]
        double theDistance = distance(xpt[i],ypt[i],xpt[j],ypt[j]); 
 [...]
        page.fillOval(xpoint1 , ypoint1, 2*rad[i], 2*rad[i]);

为什么要在这里
+rad[]
?不必添加半径来比较距离

        double xpoint1 = xpt[i]+rad[i];
        double ypoint1 = ypt[i]+rad[i];
        double xpoint2 = xpt[j]+rad[j];
        double ypoint2 = ypt[j]+rad[j];
 [...]
        double theDistance = distance(xpoint1,ypoint1,xpoint2,ypoint2); 
 [...]
        page.fillOval(xpt[i], ypt[i], rad[i], rad[i]);
您应该使用
xpt
/
ypt
表示距离。而不是
xpoint1
,使用
-
表示值,使用2*半径表示大小……即:

        double xpoint1 = xpt[i]-rad[i];
        double ypoint1 = ypt[i]-rad[i];
        double xpoint2 = xpt[j]-rad[j];
        double ypoint2 = ypt[j]-rad[j];
 [...]
        double theDistance = distance(xpt[i],ypt[i],xpt[j],ypt[j]); 
 [...]
        page.fillOval(xpoint1 , ypoint1, 2*rad[i], 2*rad[i]);

xpoint、ypoint等行没有按照您的想法执行

如果要确定两个圆是否重叠,则需要确定圆心之间的距离是否大于或小于其半径之和

因此:

函数循环碰撞(x1、y1、r1、x2、y2、r2){

return(距离(x1,y1,x2,y2)xpoint,ypoint等。行没有按照您的想法执行

如果要确定两个圆是否重叠,则需要确定圆心之间的距离是否大于或小于其半径之和

因此:

函数循环碰撞(x1、y1、r1、x2、y2、r2){

返回(距离(x1,y1,x2,y2),但当使用“page.fillOval”(xpt[i]、ypt[i]、rad[i]、rad[i])“它是从角的左上角绘制的,所以我必须将半径长度添加到x和y坐标中才能找到绘制的圆的中心。你误解了我。我用代码更新了答案以澄清。但是当你使用”page.fillOval(xpt[I],ypt[I],rad[I],rad[I])时“它从角的左上角开始绘制,所以我必须将半径长度添加到x和y坐标中,以找到绘制的圆的中心。你误解了我。我用代码更新了答案以澄清。我想我在这里这样做-否则如果(xpoint的距离,…行扭曲了数据,我的函数就是你要做的一切。我想我在这里就是这么做的——否则,如果(xpoint的距离,…行扭曲了数据,我的函数就是你要做的一切。)。