2010-12-01 2 views
0

Это то, что я хочу выполнить для домашней работы: проектируйте и реализуйте программу, которая рисует круги, с радиусом и расположением каждого круга, определенным случайным образом. Если круг не пересекается с каким-либо другим кругом, нарисуйте этот круг черным цветом. Если круг перекрывает один или несколько кругов, нарисуйте его синим цветом. Используйте массив для хранения представления каждого круга, а затем определите цвет каждого круга. Два круга перекрываются, если расстояние между их центральными точками меньше суммы их радиусов.рисование случайных кругов, сохранение их коориндатов в массиве

Я действительно близко, но я просто не могу понять, как использовать формулу sqrt, чтобы сравнить радиусы окружностей, которые пересекаются, а затем перерисовать этот круг в голубом. Я попытался понять это в двух других сообщениях здесь: drawing random circles, storing their coorindates in an array и здесь: draw random circles, first storing the points in an array. У меня есть некоторые указатели, так может ли кто-нибудь дать мне конкретные указатели, чтобы выяснить, как заставить мой цикл использовать функцию Math.sqrt правильно, чтобы сравнить радиусы, а затем перерисовать перекрывающий круг в голубом? Большое спасибо.

UPDATE: Я получил работу Math.sqrt forumla, но не могу понять, как структурировать цикл 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); 
    } 
} 

ответ

1
//Math.sqrt((x1-x2)*(x1-x2)-(y1-y2)*(y1-y2)), go back and read chapter 7 

должен быть

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

(Вы должны взять квадратный корень из суммы от квадрата X и Y, а не разность.)

Вверх дата:

Есть пара проблем с обнаружением перекрытия. Две окружности пересекаются, если сумма их радиусов больше, чем расстояние между их центрами, но вы принимаете разницу радиусов и проверки, если это менее расстояние между центрами.

Кроме того, вы должны пропустить проверку перекрытия при i == j (так как каждый круг пересекает с собой, вас интересуют только совпадения между разными кругами).

+1

Вы можете использовать Math.pow вместо (a * a), чтобы сделать его более легким для чтения: Math.sqrt (Math.pow (x1-x2,2) + Math.pow (y1-y2,2)) – Ralph 2010-12-01 22:25:37

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