Salut à tous,
J'utilise l'algorithme d'Andres fourni par Wikipédia pour tracer un cercle de largeur x
. D'ailleurs j'ai à peu près compris son fonctionnement : on découpe le cercle en huit parties qu'on dessine en même temps et chacune de ces parties est la symétrique de l'autre par rapport au centre du cercle. Bon après j'avoue que l'aspect mathématique m'échappe complètement…
En tout cas, afin de permettre à l'utilisateur-final de créer des cercles de différentes largeurs, j'ai très légèrement adapté cet algorithme. Je l'ai en fait placé dans une boucle for
qui permet de le lancer autant de fois que nécessaire (ie. : un cercle par unité de largeur, ie. : une exécution de l'algo par unité de largeur).
Et j'ai également modifié l'initialisation de deux variables, ce qui donne :
1 2 | y = (int) (radius + current_thickness); double d = radius + current_thickness - 1; |
Le problème, c'est que je suis censé obtenir un pavage sans aucun trou d'après Wikipédia et pourtant ce n'est pas ce que je constate : en effet, il y a deux ou trois pixels blancs sur le pourtour du cercle (je précise que c'est un cercle non-plein) lorsque ce dernier a une largeur de 5 par exemple.
J'ai pensé à une imprécision due aux types mais a priori ce n'est pas ça (à un moment donné, j'avais déclaré d
comme étant int
et avais donc fait un cast : je l'ai changé en double
mais les points sont toujours présents).
Voici l'algo :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | for(double current_thickness = 0; current_thickness < this.thickness; current_thickness++) { x = 0; y = (int) (radius + current_thickness); double d = radius + current_thickness - 1; while (y >= x) { max_counter++; updates.add(new Pixel(x0 + x, y0 + y, Color.BLACK)); // octant n°1 updates.add(new Pixel(x0 + y, y0 + x, Color.RED)); updates.add(new Pixel(x0 - x, y0 + y, Color.BLUE)); updates.add(new Pixel(x0 - y, y0 + x, Color.ORANGE)); // octant n°4 updates.add(new Pixel(x0 + x, y0 - y, Color.YELLOW)); // octant n°5 updates.add(new Pixel(x0 + y, y0 - x, Color.GREEN)); updates.add(new Pixel(x0 - x, y0 - y, Color.VIOLET)); updates.add(new Pixel(x0 - y, y0 - x, Color.DARKGRAY)); // octant n°8 if (d >= 2 * x) { d -= 2 * x + 1; x++; } else if (d < 2 * (radius - y)) { d += 2 * y - 1; y--; } else { d += 2 * (y - x - 1); y--; x++; } } } |
Merci d'avance !