【问题标题】:Determine if circles intersect判断圆是否相交
【发布时间】:2015-01-23 18:04:02
【问题描述】:

我正在做一个项目,我必须绘制 20 个具有随机起点和随机大小的圆圈。然后我必须确定是否有任何圆圈相交。如果一个圆圈与另一个圆圈相交,我必须将该圆圈涂成绿色。如果圆圈不与另一个圆圈相交,则颜色需要为红色。我有所有的代码......我想......但是当我运行它时,我仍然得到一些应该是绿色的圆圈,而是红色的。这是我的代码。任何帮助将不胜感激。

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


public class IntersectingCircles extends JPanel
{
    private int[] xAxis = new int [20]; // array to hold x axis points
    private int[] yAxis = new int [20]; // array to hold y axis points
    private int[] radius = new int [20]; // array to hold radius length


    public static void main (String[] args)
    {
        JFrame frame = new JFrame("Random Circles");
        frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add (new IntersectingCircles());

        frame.pack();
        frame.setVisible(true);
    }

    public IntersectingCircles()
    {
        setPreferredSize(new Dimension(1300, 800)); // set window size
        Random random = new Random();

        for (int i = 0; i < 20; i++)
        {
            xAxis[i] = random.nextInt(800) + 100;
            yAxis[i] = random.nextInt(500) + 100;
            radius[i] = random.nextInt(75) + 10;
        }
    }

    public void paintComponent(Graphics g)
    {   
        for (int i = 0; i < 20; i++)
        {   
            int color = 0;

            for (int h = 0; h < 20; h++)
            {               
                if(i < h)
                {
                    double x1 = 0, x2 = 0, y1 = 0, y2 = 0, d = 0;


                    x1 = (xAxis[i] + radius[i]);
                    y1 = (yAxis[i] + radius[i]);
                    x2 = (xAxis[h] + radius[h]);
                    y2 = (yAxis[h] + radius[h]);

                    d = (Math.sqrt(((x2 - x1) * (x2 - x1)) + ((y2 - y1)*(y2 - y1))));

                    if (d > radius[i] + radius[h] || d < (Math.abs(radius[i] - radius[h])))
                    {
                        color = 0;
                    }

                    else
                    {
                        color = 1;
                        break;
                    }
                }
            }

            if (color == 0)
            {
                g.setColor(Color.RED);
                g.drawOval(xAxis[i], yAxis[i], radius[i] * 2, radius[i] * 2);
            }

            else
            {
                g.setColor(Color.GREEN);
                g.drawOval(xAxis[i], yAxis[i], radius[i] * 2, radius[i] * 2);
            }
        }       
    }
}

【问题讨论】:

  • SO 并不是真正的调试服务提供商...也许您应该更详细地指出错误可能在哪里,您尝试了哪些其他解决方案等等...更具体 /i>
  • 两个圆相交当且仅当它们的中心之间的距离是
  • 周长不相交的圆内的圆呢?
  • @adidashawn6 对于圆中的圆,那么它们的中心距离必须在它们的半径之和与差之间
  • 您在内部循环中使用if(i &lt; h),因此仅将i 与更高的h 索引进行比较。这可能是问题吗?你可能想要i != h

标签: java swing


【解决方案1】:

在内部for 循环中,您仅将i 索引的圆圈与具有h 索引的圆圈进行比较,但仅比较具有i &lt; h 的圆圈,因为条件:

for (int h = 0; h < 20; h++)
{               
    if(i < h)
    {
        ...

因此,您应该将每个 i 圈子与每个 h 圈子进行比较,除非它们相同。你想要:

for (int h = 0; h < 20; h++)
{               
    if(i != h) //note the change here
    {
        ...

【讨论】:

  • 将圆圈 i=0..19 与圆圈 j=i+1..20 进行比较就足够了,但这不能与绘制它们结合使用。如果比较 i 和 j 表示重叠,则数组 intersects[i] 和 intersects[j] 应设置为 true,这应用于确定颜色。将属性评估与渲染结合起来并不是一个好习惯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 2011-04-06
  • 1970-01-01
相关资源
最近更新 更多