2010-12-01 27 views
0

これは私が宿題で達成したいことです:ランダムに決定された各円の半径と位置で円を描画するプログラムを設計して実装します。円が他の円と重なっていない場合は、その円を黒で描画します。円が1つ以上の円と重なっている場合は、それをシアンで描画します。配列を使用して各円の表現を保存し、各円の色を決定します。中心点間の距離が半径の合計よりも小さい場合は、2つの円が重なります。ランダムな円を描き、配列内に座標を格納する

私は本当に近いですが、重なり合う円の半径を比較してシアンの円を再描画するために、sqrtの式を使用する方法を理解できません。私はここに他の2つの投稿:drawing random circles, storing their coorindates in an arrayとここに:draw random circles, first storing the points in an arrayでこれを調べようとしました。私はいくつかのポインタを持っているので、私のforループを使ってMath.sqrt関数を適切に使って半径を比較し、シアンの重複円を再描画する方法を理解するための具体的なポインタを誰にでも教えてもらえますか?どうもありがとうございました。

更新:Math.sqrt forumlaが動作していますが、重複する円を塗りつぶすためにforループを構造化する方法がわかりません。入れ子にして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

(a * a)の代わりにMath.powを使用すると、読むのが簡単になります。Math.sqrt(Math.pow(x1-x2,2)+ Math.pow(y1-y2,2) ) – Ralph

+1

であるが、(a * a)の方がより速い。 –

+1

@Ralph:True ...一般的なpow()関数は整数指数に対して最適化されていない可能性があるため、多くのパフォーマンスクリティカルな浮動小数点コードを書く人は明示的な乗算を使用する傾向があります。この場合、明快さはおそらくパフォーマンスよりも重要です。 –

関連する問題