Java 绘制随机圆,将其坐标日期存储在数组中

Java 绘制随机圆,将其坐标日期存储在数组中,java,arrays,drawing,Java,Arrays,Drawing,这就是我想要完成的家庭作业:设计并实现一个画圆的程序,每个圆的半径和位置是随机确定的。如果一个圆不与任何其他圆重叠,请用黑色绘制该圆。如果一个圆与一个或多个圆重叠,请用青色绘制。使用数组存储每个圆的表示形式,然后确定每个圆的颜色。如果两个圆的中心点之间的距离小于其半径之和,则两个圆重叠 我真的很接近,但我不知道如何使用sqrt公式来比较重叠圆的半径,然后用青色重新绘制该圆。我已经在这里的另外两篇文章中尝试了这一点:这里:。我有一些指针,所以有谁能给我一些具体的指针,让我知道如何让for循环正确地

这就是我想要完成的家庭作业:设计并实现一个画圆的程序,每个圆的半径和位置是随机确定的。如果一个圆不与任何其他圆重叠,请用黑色绘制该圆。如果一个圆与一个或多个圆重叠,请用青色绘制。使用数组存储每个圆的表示形式,然后确定每个圆的颜色。如果两个圆的中心点之间的距离小于其半径之和,则两个圆重叠

我真的很接近,但我不知道如何使用sqrt公式来比较重叠圆的半径,然后用青色重新绘制该圆。我已经在这里的另外两篇文章中尝试了这一点:这里:。我有一些指针,所以有谁能给我一些具体的指针,让我知道如何让for循环正确地使用Math.sqrt函数来比较半径,然后用青色重新绘制一个重叠的圆?多谢各位

更新:我已经让Math.sqrt forumla工作了,但是我不知道如何构造for循环,以便只填充重叠的圆。我试着使用一个嵌套的for循环来完成这个任务,其中包含一个布尔值,但这会让所有的圆都填满。谢谢你迄今为止的建议

以下是我目前掌握的代码:

 import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.*;
import java.awt.event.*;
import java.math.*;

public class RandomCircles extends JPanel
{
    private int[] sizeArray = new int [5];  // radius of each circle
    private int[] xArray = new int [5]; //array to store x coordinates of circles
    private int[] yArray = new int [5]; //array to store y coordinates of circles
    private int x1, x2, y1, y2;
    private boolean overlap = false;


    public RandomCircles()
    {
        Random r = new Random();

        for (int i = 0; i<xArray.length; i++){
            //random numbers from 1 to 20;
            xArray[i] = r.nextInt(200) + 1;
        }
        for (int i = 0; i<yArray.length; i++){
            yArray[i] = r.nextInt(200) + 1;
        }
        for (int i = 0; i<sizeArray.length; i++){
            sizeArray[i] = r.nextInt(100) +1;
        }

        setBackground (Color.blue);
        setPreferredSize (new Dimension(300, 200));
    }
    //  generates all of the circles stored in the array.

    public void paintComponent (Graphics page)
    {
        super.paintComponent(page);
        for (int i = 0 ;i<xArray.length; i++) //this is an iterator that draws the circles and checks for overlapping radii
            for (int j = 0 ;j<xArray.length; j++)
            {
                //boolean overlap = false;
                //is supposed to compare radii of circles to check if they overlap
                {
                    if (Math.sqrt((xArray[i]-xArray[j])*(xArray[i]-xArray[j])+(yArray[i]-yArray[j])*(yArray[i]-yArray[j])) >sizeArray[i]-sizeArray[j]);

                    boolean overlap = true;
                    page.fillOval(xArray[i], yArray[i], sizeArray[i], sizeArray[i]);
                    page.setColor (Color.cyan);
                    repaint();


                } //draws the circles that are stored in the array
                page.drawOval(xArray[i], yArray[i], sizeArray[i], sizeArray[i]);//outer for loop
            }
    }
    public static void main (String[] args)
    {
        JFrame frame = new JFrame ("Circles");
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);

        frame.getContentPane().add (new RandomCircles());

        frame.pack();
        frame.setVisible(true);
    }
}
import java.util.Random;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入java.awt.*;
导入java.awt.event.*;
导入java.math.*;
公共类扩展JPanel
{
private int[]sizerray=new int[5];//每个圆的半径
private int[]xArray=new int[5];//用于存储圆的x坐标的数组
private int[]yArray=new int[5];//用于存储圆的y坐标的数组
专用int x1、x2、y1、y2;
私有布尔重叠=假;
公众圈子()
{
随机r=新随机();
对于(int i=0;i
应该是

Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))
(需要取X和Y距离平方和的平方根,而不是差。)

更新:

重叠检测有几个问题。如果 它们的半径之和大于它们中心之间的距离,但是 取半径的差值,检查它是否小于 中心之间的距离

此外,只要
i==j
,您就应该跳过重叠检查(因为每个圆都重叠)
你只对不同圆之间的重叠感兴趣。)

你可以使用Math.pow而不是(a*a)使它更容易阅读:Math.sqrt(Math.pow(x1-x2,2)+Math.pow(y1-y2,2))但是(a*a)速度快了一个数量级。@拉尔夫:是的……尽管编写大量性能关键型浮点代码的人往往倾向于使用显式乘法,因为广义的pow()函数可能不会针对整数指数进行优化。在这种情况下,清晰度可能比性能更重要。您是对的:因此让我们以一种快速易读的方式进行:final int divX=x1-x2;final int divY=y1-x2;doulbe distance=Math.sqrt(divXdivX+divYdivY);我的for循环的结构看起来是否在正确的轨道上?这正是让我绊倒的主要原因。
Math.sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))