Algorithme d'Angres et dégradé chromatique

Le problème exposé dans ce sujet a été résolu.

Alors si je ne me trompe pas :

  1. Mes angles vont de $[0 ; 2 \pi ]$ (le tour d'un cercle)

  2. Si j'applique le décalage, j'ajoute le degré donc l'intervalle est : $[angleDecalage ; 2 \pi + angleDecalage]$

  3. Ma fonction de dégradé prend des valeurs entre $[0 ; w]$ ($w$ : distance totale sur laquelle appliquer le dégradé), donc entre $[0 ; 2\pi]$ ici puisqu'il s'agit de colorier un cercle

Désolé de sembler assisté, je suis juste pas super à l'aise avec les maths… merci de prendre le temps de m'aider en tout cas =/

+0 -0

Pour le premier point, je dirais plutôt $\left] -\pi , \pi \right]$, vu que c'est l'intervalle des valeurs de retour de la fonction atan2 (mais ça marche aussi si tu transformes tes valeurs négatives de façon à avoir un angle compris dans l'intervalle $\left] 0 , 2\pi \right]$, qui sera plus simple à manipuler pour la suite).

A priori, ton angle restera dans cet intervalle d'amplitude $2\pi$. Donc si tu choisis d'appliquer un décalage sur l'angle, il faudra le faire modulo $2\pi$ afin de conserver l'amplitude.

Et cet intervalle est le même que celui des valeurs d'entrée de ton dégradé, donc tu n'as plus aucune transformation à appliquer sur tes valeurs.

Ahah oui mais j'ai déjà ajouté $\pi$ , c'est pour ça que j'ai donné l'intervalle $[0 ; 2\pi]$.

A priori, ton angle restera dans cet intervalle d'amplitude 2π. Donc si tu choisis d'appliquer un décalage sur l'angle, il faudra le faire modulo 2π afin de conserver l'amplitude.

Heum tu veux plutôt dire qu'il faut que l'intervalle reste $[0 ; 2\pi]$ non ? Car je dois bien ajouter $angleDecalage$ ?

Et cet intervalle est le même que celui des valeurs d'entrée de ton dégradé, donc tu n'as plus aucune transformation à appliquer sur tes valeurs.

On est d'accord que c'est parce qu'il s'agit d'un cercle ? ^^'

Ma fonction de dégradé prend des valeurs entre $[0 ; w]$ ($w$ : distance totale sur laquelle appliquer le dégradé)

Lern-X

Je ne comprends pas bien ce qui pourrait justifier un tel choix. Il me semblerait plus judicieux d'avoir une fonction qui prend des valeurs de l'intervalle $[0,1]$ et les deux couleurs extrêmes de ton dégradé et qui te renvoie la couleur du point, puis envelopper cette fonction dans une fonction plus abstraite qui accepte un point $x$ d'un intervalle quelconque $[a,b]$ et appelle la première fonction en lui donnant $\frac{x-a}{b-a}$ comme point de $[0,1]$.

Ce serait beaucoup plus modulaire de cette façon.

Ça ne change en rien ce que te dit entwanne par ailleurs.

Ahah oui mais j'ai déjà ajouté $\pi$ , c'est pour ça que j'ai donné l'intervalle $[0 ; 2\pi]$.

Lern-X

Oui, donc tu as déjà effectué un décalage d'un demi-tour.

Heum tu veux plutôt dire qu'il faut que l'intervalle reste $[0 ; 2\pi]$ non ? Car je dois bien ajouter $angleDecalage$ ?

Lern-X

C'est ce que je dis, il me semble, oui.

On est d'accord que c'est parce qu'il s'agit d'un cercle ? ^^'

Lern-X

Non, c'est parce que tu as choisi d'avoir $\left [ 0 , 2\pi \right ]$ comme intervalle de valeurs pour ta fonction de dégradé.

Je ne comprends pas bien ce qui pourrait justifier un tel choix. Il me semblerait plus judicieux d'avoir une fonction qui prend des valeurs de l'intervalle $[0,1]$ et les deux couleurs extrêmes de ton dégradé et qui te renvoie la couleur du point,

adri1

Je lui conseillais en page précédente, mais ça ne semble pas avoir pris.

Alors oui en effet j'ai bien prévu de rendre l'implémentation de cette méthode plus élégante, en rendant la fonction plus modulaire comme tu le dis adri1 de sorte que je puisse la ré-utiliser plus simplement dans d'autres projets. Mais je voudrais faire ça dans un second temps plutôt, préférant me concentrer sur un problème à la fois :p

Du coup, ceci semble marcher mais en effet je constate que j'ai déjà fait un demi-tour :

1
PhotoRetouchingFormulas.chromatic_gradation((Math.atan2(octant_1_y - y0, octant_1_x - x0) + Math.PI + circle_gradation_beginning)%(2*Math.PI), w);

Si je veux éviter de faire ce demi-tour, il faudrait :

  1. Que j'enlève le + Math.PI

  2. L'intervalle deviendrait alors : $[-\pi+angleDecalage;\pi+angleDecalage]$ (le retour de atan2 étant compris entre $-\pi et \pi$ et devant ajouter le décalage).

  3. L'amplitude restant de $2\pi$, je garde le modulo $2\pi$

  4. Le souci qu'il y a, c'est que mon intervalle n'est pas $[0;2\pi]$ (celui de ma fonction) ; mais du coup… Si je veux les égaliser, je suis obligé de faire un demi-tour ? Ou est-ce que je dois changer l'intervalle de ma fonction ?

+0 -0

Ton problème, c'est que tu obtiens des valeurs négatives pour des angles, alors que tu n'en voudrais que tes positives.

Mais les angles s'expriment aussi avec un modulo, un angle $\theta$ est équivalent à $\theta + 2k \pi$ (avec $k$ entier relatif). Si tu ajoutes $2\pi$ à tes angles compris entre $-\pi$ et $0$, tu obtiendras des valeurs équivalentes positives pour ces angles.
Tu peux donc appliquer un angle = (angle + 2 * pi) % 2 * pi pour transformer les angles de $] -\pi , \pi ]$ en $[0, 2\pi ]$.

un angle θ est équivalent à θ+2kπ (avec k entier relatif)

Parce que ça correspond à retrouver cet angle en faisant un tour de cercle ?

Tu peux donc appliquer un angle = (angle + 2 * pi) % 2 * pi pour transformer les angles de ]−π,π] en [0,2π].

Oui du coup ça me semble logique. Cela donne :

chromatic_gradation((Math.atan2(octant_1_y - y0, octant_1_x - x0) + 2*Math.PI + circle_gradation_beginning)%(2*Math.PI), w);

Par contre j'ai remarqué que le dégradé se décale vers la gauche, comment ça se fait et comment peut-on changer ça ? N'est-ce pas à cause du signe + précédent circle_gradation_beginning (je demande ça car hier j'ai réfléchi à une situation semblable mais en raisonnant sur les pixels, quand j'essayais de mettre en place une rotation de cercle, et je m'étais aperçu, si je ne me trompe pas, que soustrait ou ajouter permet de changer le sens de "propagation" du dégradé) ?

Ça veut dire quoi « vers la gauche » ? On parle d'un cercle, il n'y a pas de rotation vers la gauche ou vers la droite.

Les angles sont mesurés dans le sens normal (anti-horaire). Si tu décales ton dégradé de 90°, le point du cercle correspondant à l'angle 0° sera coloré comme s'il était celui d'angle 90°, donc il sera vert plutôt que rouge. Et le point de couleur rouge se trouvera en -90° (270°).

Si tu veux un décalage opposé, tu décales avec un angle opposé.

D'accord, du coup le + devant l'angle de décalage de vient un - puisque je prends l'opposé.

Le souci c'est que justement j'ai testé ça mais une fois que j'ai fait un demi-tour de décalage (donc un décalage de 180°), j'obtiens du noir : le modulo n'était pas censé empêcher ça (ce qu'il fait bien quand l'angle de décalage est positif) ?

Du coup ça donne ça :

1
GraphicEngine.chromatic_gradation((Math.atan2(octant_4_y - y0, octant_4_x - x0) + 2*Math.PI - circle_gradation_beginning)%(2*Math.PI), w);

Autre question : vu que mon niveau est carrément médiocre, quelqu'un a des livres de trigonométrie à me conseiller ?

+0 -0

Le souci c'est que justement j'ai testé ça mais une fois que j'ai fait un demi-tour de décalage (donc un décalage de 180°), j'obtiens du noir : le modulo n'était pas censé empêcher ça (ce qu'il fait bien quand l'angle de décalage est positif) ?

Lern-X

Avec ton décalage négatif, tu passes à nouveau sous la barre de zéro, et le modulo n'y change rien. Ta fonction de dégradé doit ensuite te retourner du noir quand tu lui donnes un paramètre négatif.

Pourquoi ne pas appliquer systématiquement un décalage positif ?

Ah je pensais que le modulo aurait permis d'avoir l'angle positif équivalent au négatif :(

Alors du coup si je comprends bien tu me conseilles d'utiliser l'angle négatif équivalent à l'angle positif (donc j'ai bien un décalage/angle positif dans la formule) ? Du coup le modulo doit changer si je ne me trompe pas ?

J'ai de plus en plus de mal à comprendre tes questions. Je te conseille de ne faire que des décalages positifs, de façon à ne pas avoir à traiter de nombres négatifs.

Si tu fais un décalage avec un pas négatif, tu te retrouves obligé d'ajouter $2\pi$ pour ne pas obtenir de résultats négatifs, ça revient donc au même que d'avoir la valeur positive correspondante au décalage.

Que veux-tu changer dans le modulo ? L'amplitude reste la même.

Tourner de 90° dans un sens ou de 270° dans l'autre, ça revient au même.

Donc tu ne fera que des rotations dans le sens anti-horaire, mais qui tomberont sur les mêmes positions que si tu avais fait ta rotation dans le sens horaire.

Oui je comprends bien ce que tu dis.

Mais en fait j'ai un nouveau problème dont je n'ai pas parlé, et qui explique pourquoi je m'intéresse au sens de rotation.

En effet, quand trace mon cercle avec les équations et que je donne un décalage de 75°, j'obtiens cela :

Equations paramétriques

Tandis qu'avec l'algorithme d'Andres, j'ai :

Andres

On remarque donc que la rotation ne s'est pas faite dans le même sens, et j'aimerais bien arranger ça en modifiant celui donné au dégradé utilisé avec Andres en fait.

Mais apparemment ce ne serait pas une histoire de sens ?

Mais en quoi est-ce un problème ? C'est juste que dans un cas tu effectues une rotation sur les points de ton cercle, et dans l'autre tu ne t'occupes que de décaler le dégradé (ce second cas semble plus logique).

Si vraiment ça te gêne, tu peux changer le comportement en effectuant des rotations de $2\pi - \theta$ plutôt que $\theta$ dans un cas ou dans l'autre.

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte