Salut à tous,
Ce que je voudrais faire
Je dispose de l'algorithme de tracé de cercle d'Andres et d'un algorithme permettant de créer un dégradé chromatique (ie. : arc-en-ciel). Je souhaiterais mettre en relation ces deux algorithmes, c'est-à-dire tout simplement tracer un dégradé chromatique rendu circulaire en utilisant Andres. J'ai déjà fait ça mais en utilisant la formule des équations paramétriques.
Problème
Le souci c'est que je ne vois pas quelles données envoyer de l'algo d'Andres vers l'algo de dégradé. Ce dernier accepte 2 entrées :
- L'avancement (pour un dégradé rectangulaire de la gauche vers la droite, ça correspond aux différentes abscisses) ;
- Le maximum (dans ce même exemple, ça correspond à la largeur totale du rectangle).
Je précise également deux choses :
- Il faut tracer un cercle de largeur au moins égale à 1 (pour ce faire, je trace plusieurs cercles qui s'emboîtent, chacun de largeur 1) ;
- Je ne comprends pas l'algorithme d'Andres, je vois juste qu'il trace 8 octants, par symétrie.
Voilà, je vous remercie d'avance zestueusement !
Sources
Algorithme d'Andres
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | for(double current_thickness = 0; current_thickness < this.thickness; current_thickness++) { w = thickness - current_thickness; x = 0; y = (int) (radius + current_thickness); double d = radius + current_thickness - 1; while (y >= x) { int octant_1_x = x0 + x, octant_1_y = y0 + y; int octant_2_x = x0 + y, octant_2_y = y0 + x; int octant_3_x = x0 - x, octant_3_y = y0 + y; int octant_4_x = x0 - y, octant_4_y = y0 + x; int octant_5_x = x0 + x, octant_5_y = y0 - y; int octant_6_x = x0 + y, octant_6_y = y0 - x; int octant_7_x = x0 - x, octant_7_y = y0 - y; int octant_8_x = x0 - y, octant_8_y = y0 - x; max_counter++; double[] rgb_gradation_octant_1 = PhotoRetouchingFormulas.chromatic_gradation(d - this.circle_gradation_beginning, w - this.circle_gradation_beginning); updates.add(new Pixel(octant_1_x, octant_1_y, Color.color(rgb_gradation_octant_1[0], rgb_gradation_octant_1[1], rgb_gradation_octant_1[2]))); // octant n°1 double[] rgb_gradation_octant_2 = PhotoRetouchingFormulas.chromatic_gradation(d - this.circle_gradation_beginning, w - this.circle_gradation_beginning); updates.add(new Pixel(octant_2_x, octant_2_y, Color.color(rgb_gradation_octant_2[0], rgb_gradation_octant_2[1], rgb_gradation_octant_2[2]))); double[] rgb_gradation_octant_3 = PhotoRetouchingFormulas.chromatic_gradation(d - this.circle_gradation_beginning, w - this.circle_gradation_beginning); updates.add(new Pixel(octant_3_x, octant_3_y, Color.color(rgb_gradation_octant_3[0], rgb_gradation_octant_3[1], rgb_gradation_octant_3[2]))); double[] rgb_gradation_octant_4 = PhotoRetouchingFormulas.chromatic_gradation(d - this.circle_gradation_beginning, w - this.circle_gradation_beginning); updates.add(new Pixel(octant_4_x, octant_4_y, Color.color(rgb_gradation_octant_4[0], rgb_gradation_octant_4[1], rgb_gradation_octant_4[2]))); // octant n°4 double[] rgb_gradation_octant_5 = PhotoRetouchingFormulas.chromatic_gradation(d - this.circle_gradation_beginning, w - this.circle_gradation_beginning); updates.add(new Pixel(octant_5_x, octant_5_y, Color.color(rgb_gradation_octant_5[0], rgb_gradation_octant_5[1], rgb_gradation_octant_5[2]))); // octant n°5 double[] rgb_gradation_octant_6 = PhotoRetouchingFormulas.chromatic_gradation(d - this.circle_gradation_beginning, w - this.circle_gradation_beginning); updates.add(new Pixel(octant_6_x, octant_6_y, Color.color(rgb_gradation_octant_6[0], rgb_gradation_octant_6[1], rgb_gradation_octant_6[2]))); double[] rgb_gradation_octant_7 = PhotoRetouchingFormulas.chromatic_gradation(d - this.circle_gradation_beginning, w - this.circle_gradation_beginning); updates.add(new Pixel(octant_7_x, octant_7_y, Color.color(rgb_gradation_octant_7[0], rgb_gradation_octant_7[1], rgb_gradation_octant_7[2]))); double[] rgb_gradation_octant_8 = PhotoRetouchingFormulas.chromatic_gradation(d - this.circle_gradation_beginning, w - this.circle_gradation_beginning); updates.add(new Pixel(octant_8_x, octant_8_y, Color.color(rgb_gradation_octant_8[0], rgb_gradation_octant_8[1], rgb_gradation_octant_8[2]))); // octant n°8 if (d >= 2 * x) { d -= 2 * x + 1; x++; } else if (d < 2 * (radius + thickness - y)) { d += 2 * y - 1; y--; } else { d += 2 * (y - x - 1); y--; x++; } } } gui.getImageAnimation().setMax(max_counter*8); break; |
Algorithme du dégradé chromatique
(sera rendu un petit peu plus lisible très prochainement)
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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | /** * Makes a chromatic gradation * @param x can be a distance or an angle, it is the progress * @param w can be a distance or an angle, it is the maximum * @return an array containing the coloured pixel's red 0.0 - 1.0, green 0.0 - 1.0 and blue 0.0 - 1.0 */ static double[] chromatic_gradation(double x, double w) { double[] rgb = new double[3]; if(x >= 0 && x < w/6) { rgb[0] = 1; rgb[1] = 6*x/w; } if(x >= 0 && x < 2*w/6) { rgb[2] = 0; } if(x >= 2*w/6 && x < 3*w/6) { rgb[2] = 6*x/w - 2; } if(x >= 3*w/6 && x < 5*w/6) { rgb[2] = 1; } if(x >= 5*w/6 && x <= w) { rgb[2] = -6*x/w + 6; } if (x >= w/6 && x < 3*w/6) { rgb[1] = 1; } if(x >= 3*w/6 && x < 4*w/6) { rgb[1] = -6*x/w + 4; } if(x >= 4*w/6 && x <= w) { rgb[1] = 0; } if(x >= w/6 && x < 2*w/6) { rgb[0] = -6*x/w + 2; } if(x >= 2*w/6 && x < 4*w/6) { rgb[0] = 0; } if(x >= 4*w/6 && x < 5*w/6) { rgb[0] = 6*x/w - 4; } if(x >= 5*w/6 && x <= w) { rgb[0] = 1; } return rgb; } |
+0
-0