2010-11-13 59 views
0

J'ai créé 5 cercles avec des coordonnées x et y aléatoires et des rayons en utilisant 3 tableaux (pour les tailles x, y et rayon). Cependant, j'ai besoin que les cercles changent dynamiquement de couleur selon qu'ils se chevauchent ou non avec un autre cercle. Donc, si l'un des 5 cercles ne se chevauche pas du tout, il doit être coloré en noir. Les cercles qui se chevauchent devraient être cyan. Deux cercles sont considérés comme se chevauchant si la distance entre leurs points centraux est inférieure à la somme de leurs rayons.Comment détecter les cercles qui se chevauchent et remplir la couleur en conséquence?

C'est ce que j'ai écrit jusqu'à maintenant pour la classe des cercles. Le code suivant dessine avec succès les 5 cercles dans une fenêtre d'applet, et les distances sont calculées avec succès, mais le problème est avec la coloration. Il semble y avoir une erreur de logique dans le remplissage des couleurs et je ne vois pas le problème ici. Aucune suggestion? Merci beaucoup.

public class Circles extends Applet { 

public void paint(Graphics page) 
{ 
    Random locator = new Random(); 
    int [] xpt = new int [5]; 
    int [] ypt = new int [5]; 
    int [] rad = new int [5]; 

    setPreferredSize (new Dimension(300, 300)); 
    for (int i = 0; i < xpt.length; i++){ 

     xpt[i] = locator.nextInt(100); //need to set a number or it goes into millions, cannot set it in Random() 
     ypt[i] = locator.nextInt(100); 
     rad[i] = locator.nextInt(100); 
     System.out.println("The #" + i + " x-point: " + xpt[i] + " y-point: " + ypt[i] + " radius: " + rad[i]); //for debugging purposes 

     for (int j = 0; j < xpt.length; j++){ 
      double xpoint1 = xpt[i]+rad[i]; 
      double ypoint1 = ypt[i]+rad[i]; 
      double xpoint2 = xpt[j]+rad[j]; 
      double ypoint2 = ypt[j]+rad[j]; 
      double radius1 = rad[i]; 
      double radius2 = rad[j]; 
      double theDistance = distance(xpoint1,ypoint1,xpoint2,ypoint2); 
      System.out.println("Comparing " + i + " to " + j); //for debugging and logic checking 
      if (i==j) 
       ; 
      else if (theDistance <= (radius1+radius2)) 
      { 
       page.setColor(Color.cyan); 
       page.fillOval(xpt[i], ypt[i], rad[i], rad[i]); 
       //page.fillOval(xpt[j], ypt[j], rad[j], rad[j]); 
       System.out.println("Overlap occurred. Colored " + i + " and " + j + " cyan."); 
       System.out.println("Center points: ("+ xpoint1 +", "+ ypoint1 +") and ("+ xpoint2 + ", "+ ypoint2 + ")."); 
      } 
      else 
      { 
       page.setColor(Color.black); 
       page.fillOval(xpt[i], ypt[i], rad[i], rad[i]); 
       //page.fillOval(xpt[j], ypt[j], rad[j], rad[j]); 
       System.out.println("No overlap. Made " + i + " and " + j + " black."); 
      } 
     } 
    } 
} 

public static double distance(
     double x1, double y1, double x2, double y2) { 
    return Math.sqrt((x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1)); 

} 
} 

Répondre

1

Pourquoi avez-vous +rad[] ici? Vous n'avez pas besoin d'ajouter le rayon pour comparer la distance.

 double xpoint1 = xpt[i]+rad[i]; 
     double ypoint1 = ypt[i]+rad[i]; 
     double xpoint2 = xpt[j]+rad[j]; 
     double ypoint2 = ypt[j]+rad[j]; 
[...] 
     double theDistance = distance(xpoint1,ypoint1,xpoint2,ypoint2); 
[...] 
     page.fillOval(xpt[i], ypt[i], rad[i], rad[i]); 

Vous devez utiliser xpt/ypt pour la distance. pas xpoint1 et utiliser - pour la valeur et 2 * rayon pour la taille ...... i.e. .:

 double xpoint1 = xpt[i]-rad[i]; 
     double ypoint1 = ypt[i]-rad[i]; 
     double xpoint2 = xpt[j]-rad[j]; 
     double ypoint2 = ypt[j]-rad[j]; 
[...] 
     double theDistance = distance(xpt[i],ypt[i],xpt[j],ypt[j]); 
[...] 
     page.fillOval(xpoint1 , ypoint1, 2*rad[i], 2*rad[i]); 
+0

Mais lorsque vous utilisez '' 'page.fillOval (xpt [i], ypt [i], rad [i], rad [i]),' '' il tire de le coin supérieur gauche du coin, donc j'ai dû ajouter la longueur du rayon aux coordonnées x et y afin de trouver le centre du cercle dessiné – sxflynn

+0

Non, vous me comprenez mal. J'ai mis à jour la réponse avec le code pour clarifier. –

4

Le xpoint, ypoint, etc. lignes ne sont pas en train de faire ce que vous pensez.

Si vous souhaitez déterminer si deux cercles se chevauchent, vous devez déterminer si la distance entre les centres des cercles est supérieure ou inférieure à la somme de leurs rayons.

Alors:

function circlesCollide(x1, y1, r1, x2, y2, r2){ 
    return (distance(x1, y1, x2, y2) <= (r1 + r2)); 
} 
+0

Je pense que je fais cela ici - sinon if (theDistance <= (radius1 + radius2)) – sxflynn

+0

Les lignes xpoint, ... sont en train de fausser vos données, ma fonction est _all_ que vous avez à faire. –