Java 绘制随机圆,将其坐标日期存储在数组中
这就是我想要完成的家庭作业:设计并实现一个画圆的程序,每个圆的半径和位置是随机确定的。如果一个圆不与任何其他圆重叠,请用黑色绘制该圆。如果一个圆与一个或多个圆重叠,请用青色绘制。使用数组存储每个圆的表示形式,然后确定每个圆的颜色。如果两个圆的中心点之间的距离小于其半径之和,则两个圆重叠 我真的很接近,但我不知道如何使用sqrt公式来比较重叠圆的半径,然后用青色重新绘制该圆。我已经在这里的另外两篇文章中尝试了这一点:这里:。我有一些指针,所以有谁能给我一些具体的指针,让我知道如何让for循环正确地使用Math.sqrt函数来比较半径,然后用青色重新绘制一个重叠的圆?多谢各位 更新:我已经让Math.sqrt forumla工作了,但是我不知道如何构造for循环,以便只填充重叠的圆。我试着使用一个嵌套的for循环来完成这个任务,其中包含一个布尔值,但这会让所有的圆都填满。谢谢你迄今为止的建议 以下是我目前掌握的代码:Java 绘制随机圆,将其坐标日期存储在数组中,java,arrays,drawing,Java,Arrays,Drawing,这就是我想要完成的家庭作业:设计并实现一个画圆的程序,每个圆的半径和位置是随机确定的。如果一个圆不与任何其他圆重叠,请用黑色绘制该圆。如果一个圆与一个或多个圆重叠,请用青色绘制。使用数组存储每个圆的表示形式,然后确定每个圆的颜色。如果两个圆的中心点之间的距离小于其半径之和,则两个圆重叠 我真的很接近,但我不知道如何使用sqrt公式来比较重叠圆的半径,然后用青色重新绘制该圆。我已经在这里的另外两篇文章中尝试了这一点:这里:。我有一些指针,所以有谁能给我一些具体的指针,让我知道如何让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))