2015-01-23 4 views
0

Я работаю над проектом, где мне нужно нарисовать 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); 
      } 
     }  
    } 
} 
+0

SO не является действительно поставщик услуг отладки ... Может быть, вы должны указать более подробно, где ошибка может быть, что другие решения вы пытались, и т.д. ... более * конкретный * – nem035

+3

Два круга пересекаются тогда и только тогда, когда расстояние между их центрами <= сумма их радиусов. –

+1

как насчет круга в круге, где периметры не пересекаются? – adidashawn6

ответ

1

В внутри for петли, вы только сравнения кругов i индекса с кругами с h индексом, а только те, с i < 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 
    { 
     ... 
+2

Достаточно сравнить окружности i = 0..19 с кругами j = i + 1..20, но это не должно сочетаться с их построением. Если сравнение i и j указывает на перекрытие, массив пересекает [i] и пересекает [j] должен быть установлен в true, и это должно использоваться для определения цвета. Неправильная практика сочетания оценки свойств с рендерингом. – laune

Смежные вопросы