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));
}
}
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
Non, vous me comprenez mal. J'ai mis à jour la réponse avec le code pour clarifier. –