当前位置: 首页 > 知识库问答 >
问题:

画任意的圆,将不与另一个圆相交的圆涂成红色

魏安然
2023-03-14

我有一个Java Swing任务,目标如下:

  1. 当程序启动时,它会绘制20个未填充的圆,每个圆的半径和位置随机确定。
  2. 如果一个圆的周长线不与任何其他圆相交,则用红色画出该圆的轮廓。如果它至少与另一个圆相交,请用黑色绘制它。
  3. 添加一个JButton,每次按下JButton,就会创建一组新的圆,如上所述。
  1. 这些圆相距太远,不能共享一个周长点,即它们中心之间的距离大于它们半径的和(d>r1+r2)。示例。
  2. 一个圆完全在另一个圆内,它们的周长不接触,即它们中心之间的距离小于它们半径之间的差(d 示例。<>

到目前为止我得到的是:

  1. 要比较圆,必须在绘制它们之前指定它们,所以我使用了一个for-loop将中心坐标(int[]x,int[]y)和半径(Double[]radius)的20个值存储在数组中。
  2. 接下来,我使用嵌套的for-loops在数组中进行迭代,比较两个圆,但将一个圆与其自身进行比较时除外(索引j=索引k)。如果圆相交,则g.setColor(color.red)。如果不是,则g.setColor(color.black)。
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JButton;

public class ButtonFrame extends JFrame 
{
    private final JButton resetButton = new JButton("Reset");

    public ButtonFrame()
    {
        super("Drawing Random Circles");
        setLayout(new BorderLayout());

        IntersectingCircles intersectingCircles = new IntersectingCircles();

        this.add(intersectingCircles, BorderLayout.CENTER);
        this.add(resetButton, BorderLayout.SOUTH);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setSize(1400, 1400);

        ButtonHandler handler = new ButtonHandler();
        resetButton.addActionListener(handler);
    }

    private class ButtonHandler implements ActionListener
    {       
        @Override
        public void actionPerformed(ActionEvent event)
        {
            reset();
        }
    }

    public static void main(String[] args)
    {
        ButtonFrame buttonFrame = new ButtonFrame();
        buttonFrame.setVisible(true);
    }

    public void reset()
    {
        ButtonFrame buttonFrame = new ButtonFrame();
        buttonFrame.setVisible(true);
    }
}

class IntersectingCircles extends JPanel
{   
    private static final JButton resetButton = new JButton("Reset Circles");
    private static final JFrame frame = new JFrame("Intersecting Circles");

    @Override
    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
        this.setBackground(Color.WHITE);

        int[] x = new int[20];
        int[] y = new int[20];
        int[] diameter = new int[20];
        double[] radius = new double[20]; 

        for (int i = 0; i < 20; i++)
        {
            int xCoord = (int)(Math.random() * 600);
            int yCoord = (int)(Math.random() * 600);
            int circleSize = (int)(Math.random() * 550);
            x[i] = xCoord;
            y[i] = yCoord;
            diameter[i] = circleSize;
            radius[i] = circleSize / 2.0;
        }

        for (int j = 0; j < 20; j++)
        {   
            for (int k = 0; k < 20; k++)
            {   
                if (k != j)
                {
                    if (((Math.sqrt((x[k] - x[j]) * (x[k] - x[j]) + (y[k] - y[j])
                        * (y[k] - y[j]))) > (radius[j] + radius[k])) ||
                        ((Math.sqrt((x[k] - x[j]) * (x[k] - x[j]) + (y[k] - y[j])
                        * (y[k] - y[j]))) < (Math.abs(radius[j] - radius[k]))))
                        g.setColor(Color.RED);
                    else
                        g.setColor(Color.BLACK);

                g.drawOval(x[j], y[j], diameter[j], diameter[j]);
                }
                else
                    continue;
            }
        }
    }
}

共有1个答案

归翔
2023-03-14

循环中的if语句有逻辑错误-可以设置黑色,然后为其他对循环恢复为红色。可能的解决方案草案:

  for (int j = 0; j < 20; j++)
    {   
        g.setColor(Color.RED);  //set non-intersect state
        for (int k = j + 1; k < 20; k++)  //avoid excessive work
        {   
                if (intersect test)
                  {
                    g.setColor(Color.BLACK);
                    break; //can stop here
                  };
            g.drawOval(x[j], y[j], diameter[j], diameter[j]);
        }
}
 类似资料:
  • 我需要找到从圆和矩形的交点创建的最大弧线。我有了圆心,半径和矩形的坐标,我需要找到与圆心交点的角。 我有一个可以工作的代码,但它是通过迭代圆周上的点来计算解的,我想知道是否有更优雅的方法来使用三角学而不是“蛮力”来计算解。 这是我的代码:

  • 本文向大家介绍javascript实现画不相交的圆,包括了javascript实现画不相交的圆的使用技巧和注意事项,需要的朋友参考一下 效果 html代码 javascript代码 以上所述就是本文的全部内容了,希望能够对大家熟练掌握javascript有所帮助。

  • 问题内容: 我正在使用上述算法来测试圆和直线之间的交点。有时它工作正常,但有时却失败。该代码表示​​方程,该方程是从同时求解圆和线方程和时得到的。有谁知道我在数学上或其他地方哪里出错了? 问题答案: 您的计算似乎很长,我看不到您测试的不同案例的使用。无论如何,由于我发现了有趣的问题,所以我尝试自己解决该问题,并提出了以下解决方案。随意更换的,并使用S,但是要知道,你每次投,如评论,一点效果都没有准

  • 问题内容: 我有点麻烦。我有一项作业,要求我找出第二个圆圈是否重叠,内部是否重叠或两者都不存在。但是,我在检查重叠以及第二个圆是否在第一个圆内时遇到了麻烦。 (使用的变量为x1,x2,y1,y2,r1,r2,距离) 这是我所拥有的: 我担心问题在于重叠和内部检查,但是我无法弄清楚如何正确设置它,因此我可以可靠地检查第二个圆是否在第一个圆的内部。 当我尝试了多种方法时,任何帮助或建议都将不胜感激,但

  • 我到底需要在椭圆形矩形中设置什么,以及如何计算起始角和扫掠角? 我尝试了下面的代码:

  • 我正在寻找一些解决方案,如果给定一组具有2D中心点和半径的圆,则在中返回一个最小子集,该子集完全覆盖具有2D中心点和半径的特定圆。最后一个圆圈不在中。 我已经选择了圆形,但如果我们把它们改成正方形、六边形等也没关系。