Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Discussion :

Passer d'un rendu RGB par calculs à un rendu RYB par une table


Sujet :

Traitement d'images

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 444
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 444
    Points : 12 000
    Points
    12 000
    Par défaut Passer d'un rendu RGB par calculs à un rendu RYB par une table
    Bonjour,

    je ne sais pas si le titre est bien clair, alors voici d'abord une petite image RGB, avec à droite un dégradé classique généré par calcul, et à gauche en utilisant une conversion HSL_to_RGB pour avoir le cercle (c'est pratique, un cercle a 360° et le "H" de HSL travaille aussi sur 360°) :
    Note : les images sont réduites de moitié.
    Nom : rgb_d+c.png
Affichages : 195
Taille : 19,7 Ko

    C'est très moche mais c'est très fonctionnel.
    La chose se complique sérieusement si on cherche un rendu RYB, beaucoup plus esthétique à l'utilisation, mais qui va être très laid lui aussi en utilisant du calcul pur et dur :
    Nom : ryb_d+c.png
Affichages : 185
Taille : 28,7 Ko

    Il sera considérablement amélioré par l'utilisation d'une table permettant de générer 24 couleurs de base dégradées de bas en haut de noir à blanc en passant par "couleur" sur 256 pas :
    Nom : ryb_dmap2.png
Affichages : 186
Taille : 26,6 Ko

    Ce beau rectangle a donc été généré depuis un bête bitmap de 24x256, qui a ensuite été "stretchdrawed" vers un composant d'affichage (un TImage, je suis sous Lazarus / FreePascal) avec une bonne dose de flou pour uniformiser tout ça et hop !

    La question c'est : comment faire pour avoir un cercle RYB avec la même douceur que le rectangle ?
    J'avoue que je donne ma langue au chat, je ne sais pas convertir en utilisant ma map linéaire vers un cercle...

    Une idée ?
    Merci,

    ANNEXE : la map des 24 couleurs
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    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
          if x =  0 then begin r:=243; g:=029; b:=016; end;//1  R
          if x =  1 then begin r:=245; g:=058; b:=013; end;//1
          if x =  2 then begin r:=246; g:=088; b:=011; end;//2  or foncé
          if x =  3 then begin r:=247; g:=116; b:=009; end;//2
          if x =  4 then begin r:=248; g:=144; b:=007; end;//3  Orange
          if x =  5 then begin r:=250; g:=169; b:=006; end;//3
          if x =  6 then begin r:=250; g:=193; b:=005; end;//4  J
          if x =  7 then begin r:=250; g:=220; b:=012; end;//4
          if x =  8 then begin r:=250; g:=246; b:=019; end;//5  vert-jaune
          if x =  9 then begin r:=203; g:=233; b:=023; end;//5
          if x = 10 then begin r:=156; g:=220; b:=027; end;//6  vert clair
          if x = 11 then begin r:=103; g:=199; b:=037; end;//6
          //
          if x = 12 then begin r:=051; g:=175; b:=047; end;//7  V
          if x = 13 then begin r:=035; g:=164; b:=112; end;//7
          if x = 14 then begin r:=020; g:=153; b:=178; end;//8  cyan
          if x = 15 then begin r:=021; g:=114; b:=198; end;//8
          if x = 16 then begin r:=023; g:=075; b:=219; end;//9  B
          if x = 17 then begin r:=048; g:=054; b:=194; end;//9
          if x = 18 then begin r:=074; g:=033; b:=169; end;//10 mauve
          if x = 19 then begin r:=101; g:=027; b:=165; end;//10
          if x = 20 then begin r:=129; g:=021; b:=161; end;//11 Magenta
          if x = 21 then begin r:=157; g:=019; b:=133; end;//11
          if x = 22 then begin r:=184; g:=017; b:=106; end;//12 pourpre
          if x = 23 then begin r:=220; g:=008; b:=052; end;//12
    Et ces couleurs ne sont pas tombées du ciel, je suis parti de color wheels trouvées sur le web, collectionnées au fur et à mesure, en 12 couleurs en général (parfois 16 mais ça ne va pas pour le jaune, qui ne tombe plus en place à 120°), analysées au color picker pour en faire une moyenne que j'ai ensuite bricolée pour avoir les 12 autres valeurs intermédiaires, en terminant par un ajustement "à l'œil".
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  2. #2
    Membre éprouvé
    Profil pro
    chercheur
    Inscrit en
    avril 2004
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : avril 2004
    Messages : 795
    Points : 1 293
    Points
    1 293
    Par défaut
    Peux-tu mieux définir les concepts de laideur et de douceur ? C'est peut-être ce qui te bloque.
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  3. #3
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 444
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 444
    Points : 12 000
    Points
    12 000
    Par défaut
    Citation Envoyé par Nebulix Voir le message
    Peux-tu mieux définir les concepts de laideur et de douceur ? C'est peut-être ce qui te bloque.
    L'image RGB présente des artefacts visuels au milieu horizontal, comme un trait plus lumineux, et les couleurs sont trop marquées, on dirait une suite de VVV.

    Et pour le cercle RYB, on voit bien ce trait cyan épouvantablement agressif, perdu tout seul au milieu des autres couleurs, plus étalées.

    Mais ce n'est pas ça qui me bloque. C'est plutôt comment transformer ce rectangle où le noir est en bas en un cercle où le noir serait la circonférence, et le centre blanc.
    "Lancer de rayons" ? Je connais les mots mais ne sait pas ce que ça veut dire concrètement, même si ça me fait penser à ma question. EDIT : mais ça n'a rien à voir, j'ai jeté un œil.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  4. #4
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : mai 2002
    Messages : 2 911
    Points : 4 782
    Points
    4 782
    Par défaut
    salut

    si tu veux passer du RGB a RYB il existe des fonction de conversion
    du genre

    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    TRyb = Record 
      R : integer;
      Y : integer;
      B : integer;
    end; 
     
    // Convert a red-green-blue system to a red-yellow-blue system.
    Function rgb2ryb(aRed, aGreen, aBlue : Integer) :  TRyb
    var
      iWhite : Integer ;
      iRed, iGreen,  iBlue : Real ;
      iMaxGreen,iYellow,iMaxYellow : Real ;
      iN : Real ;
    Begin
      // suppression de la couleur claire.
      iWhite := min(aRed, aGreen, aBlue)	
      iRed   := aRed   - iWhite;
      iGreen := aGreen - iWhite;
      iBlue  := aBlue  - iWhite;
     
      iMaxGreen := Math.max(iRed, iGreen, iBlue);
      // Get the yellow out of the red+green
      iYellow  := Math.min(iRed, iGreen);
      iRed     := iRed   - iYellow;
      iGreen  := iGreen - iYellow;
     
      // Si malencontreusement  cette conversion associe le bleu et le vert, coupez-les en deux pour préserver la plage maximale de la valeur. 
      if ((iBlue > 0) and (iGreen > 0)) Then 
      begin
    	iBlue  := iBlue  / 2;
    	iGreen := iGreen / 2;
      end;
     
     
      // Redistribution du vert retenue
      iYellow := iYellow + iGreen;
      iBlue   := iBlue   + iGreen;
     
      // Normalize to values.
      iMaxYellow = Math.max(iRed, iYellow, iBlue);
      if (iMaxYellow > 0) Then 
      begin 
        iN := iMaxGreen / iMaxYellow;
        iRed    := iRed    * iN;
        iYellow := iYellow * iN;
        iBlue   := iBlue   * iN;
      end;
     
      # on rajoute la couleur claire.
      iRed    := iRed    + iWhite;
      iYellow := iYellow + iWhite;
      iBlue   := iBlue   + iWhite;
     
      //# And return back the ryb typed accordingly.
      Result.r := Math.floor(iRed); 
      Result.y := Math.floor(iYellow);
      Result.b := Math.floor(iBlue);
    end;
    une autre méthode est aussi possible

    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    ... 
      iWhite := Min(aRed,aGreen,aBlue);
      IRed    := aRed   - iWhite;
      IGreen  := aGreen - iWhite;
      IBlue   := aBlue  - iWhite;
     
      iMinRG := Math.min(iRed, iGreen);
      SRed    :=  IRed-iMinRG
      SYellow := (IGreen+iMinRG)/2;
      SBlue   := (IBlue+IGreen-iMinRG)/2;
      SMax := max(SRed,SYellow,SBlue) / max(iRed,iGreen,IBlue);
     
      SRB := SRed   /SMax; 
      SYB := SYellow/SMax;
      SBB := SBlue  /SMax;
     
      iMin := Min(1-aRed,1-aGreen,1-aBlue);
     
      SRT      :=  SRB+iMin;
      SYT      :=  SYB+iMin;
      SBT      :=  SBB+iMin; 
     
      //# And return back the ryb typed accordingly.
      Result.r := Math.floor(SRT); 
      Result.y := Math.floor(SYT);
      Result.b := Math.floor(SBT);
    end;
    d’après ce lien la
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 444
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 444
    Points : 12 000
    Points
    12 000
    Par défaut
    Yop !
    Citation Envoyé par anapurna Voir le message
    salut

    si tu veux passer du RGB à RYB il existe des fonctions de conversion
    Merci, je les connais depuis un bon bout de temps, et elles ne peuvent pas s'appliquer à mon problème (et en plus leur rendu est moche, comme expliqué dans mon premier post).

    Ce qu me fait penser que j'ai dû mal m'exprimer, mal décrire mon problème : je veux "simplement" (pas sûr que ça soit simple) dessiner dans le cercle avec les couleurs du rectangle -- et à la limite, qu'il s'agisse d'un rendu RYB, on s'en contre-fiche.

    En fait, il "suffirait" de partir des points blancs en haut du rectangle et de tous les regrouper au centre du cercle pour de là, dessiner 360 arcs-de-cercle remplis chacun d'une couleur représentée par une "colonne" du rectangle.

    Un peu comme ça, quoi, en prenant en compte le fait qu'il s'agit de dégradés de blanc->couleur[n]->noir :

    Nom : exemple.png
Affichages : 121
Taille : 15,4 Ko
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Membre éprouvé
    Profil pro
    chercheur
    Inscrit en
    avril 2004
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : avril 2004
    Messages : 795
    Points : 1 293
    Points
    1 293
    Par défaut
    Pour chaque pixel de ton cercle, tu calcule un rayon R (distance au centre) et une phase P (angle du rayon = arc tangente(y/x). Dans ce pixel tu mets la couleur aux coordonnées P,R de ton rectangle.
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  7. #7
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    mai 2002
    Messages
    2 911
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Arts - Culture

    Informations forums :
    Inscription : mai 2002
    Messages : 2 911
    Points : 4 782
    Points
    4 782
    Par défaut
    salut

    tu as un tres bon exemple ici
    Nous souhaitons la vérité et nous trouvons qu'incertitude. [...]
    Nous sommes incapables de ne pas souhaiter la vérité et le bonheur, et sommes incapables ni de certitude ni de bonheur.
    Blaise Pascal
    PS : n'oubliez pas le tag

  8. #8
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 444
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 444
    Points : 12 000
    Points
    12 000
    Par défaut
    Yop !
    Citation Envoyé par anapurna Voir le message
    tu as un très bon exemple ici
    Ah, efg !
    Oui, 25 ans que je connais, et c'est d'ailleurs grâce à lui (et à son exemple que j'ai tordu dans tous les sens) qu'on peut admirer le rendu RGB dans le premier post.
    Excellentes sources, excellentes études, mais une misère sans nom à convertir en projet Lazarus pour Linux (exemple avec Chromaticity, je n'y suis pas arrivé... )
    Bon, de toute façon, ça ne pouvait pas s'appliquer, lui se base sur des calculs pour obtenir ses couleurs, quand moi, j'ai une matrice de couleurs "maîtres" à explorer.

    Vais plutôt creuser cette direction :
    Citation Envoyé par Nebulix Voir le message
    Pour chaque pixel de ton cercle, tu calcules un rayon R (distance au centre) et une phase P (angle du rayon = arc tangente(y/x). Dans ce pixel tu mets la couleur aux coordonnées P,R de ton rectangle.
    mais pas cet après-midi, pas dispo.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  9. #9
    Membre chevronné

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    décembre 2010
    Messages
    959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2010
    Messages : 959
    Points : 1 831
    Points
    1 831
    Billets dans le blog
    5
    Par défaut Passer d'un rendu RGB par calculs à un rendu RYB par une table
    Bonjour,

    Je crois que tu rencontres plusieurs sortes de difficultés, dans la réalisation de ton projet.

    1°) Les diagrammes de chromaticité sont certes très beaux, mais la manipulation des fonctions couleur risque de te conduire devant des obstacles très difficiles, sinon insurmontables.
    Ces fonctions sont destinées à la restitution des couleurs des radiations monochromatiques de longueur d'onde (λ) donnée, approximativement comprise entre 400 et 800 nm, et le spectre obtenu est relativement plus étalé du côté du rouge - d'où le décalage vers la droite des couleurs centrales (jaune et vert) que tu as noté.
    Une palette de couleurs doit-elle s'astreindre à un modèle aussi complexe ? D'autant que des difficultés supplémentaires ne manquent pas de surgir lorsque l'on veut passer au cercle des couleurs ...

    2°) Le passage du diagramme rectangulaire au cercle chromatique est lié à un changement de système de coordonnées, comme cela t'a été expliqué:

    Nom : Cercle_Coord Polaires.png
Affichages : 102
Taille : 16,5 Ko

    L'angle polaire correspond à la teinte exprimée en degrés, et pour les calculs la conversion en radians ne pose pas de difficultés:
    trad = (2*Pi/360)*(x - 1)/(La - 1)
    (La) représentant la largeur de l'image, et (x) l'abscisse du pixel considéré, variant de (0) à (La - 1).

    Les relations en cause sont bien présentées dans cet article:
    Nom : Transformations TSV-RVB.png
Affichages : 117
Taille : 50,6 Ko


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  10. #10
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 444
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 444
    Points : 12 000
    Points
    12 000
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    Bonjour,
    Ah, quand même !
    Tu en as mis du temps,
    Content de te voir par ici,

    Bonsoir,
    Citation Envoyé par wiwaxia Voir le message
    1°) Les diagrammes de chromaticité sont certes très beaux,
    et c'est bien le but recherché.

    J'ai beaucoup lu (et testé) depuis nos conversations d'il y a qq années, il en ressort que le modèle RGB est très bien pour piloter du hardware (les 3 canons d'un téléviseur cathodique, par ex.), mais esthétiquement ce n'est pas ça, et le modèle RYB serait beaucoup plus adapté.

    C'est ce qui m'a orienté dans cette direction, et c'est juste pour finir le projet que je voudrais un cercle construit avec les teintes du rectangle RYB, ce qui sera sans doute un peu compliqué, mais j'ai bon espoir (malgré mes faibles notions de math).

    Et comme ça je pourrai continuer à discuter avec mes relations de "barbouilleurs" à coups de pinceaux et autres gouaches sans passer pour un irréductible technocrate,

    Un peu de lecture ?
    avec un beau dessin
    le wiki
    Kandisky, ben oui
    et encore wiki, surtout le point 1.3

    Citation Envoyé par wiwaxia Voir le message
    2°) Le passage du diagramme rectangulaire au cercle chromatique est lié à un changement de système de coordonnées, comme cela t'a été expliqué:

    Image non valide, me dit le fofo.

    Citation Envoyé par wiwaxia Voir le message
    Les relations en cause sont bien présentées dans cet article
    Oui, mais là aussi ça cause de RGB,

    Oubliez le mot "conversion", il faut penser "dessin du rectangle dans un cercle". Je vais creuser l'idée de Nebulix.
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  11. #11
    Membre chevronné

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    décembre 2010
    Messages
    959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2010
    Messages : 959
    Points : 1 831
    Points
    1 831
    Billets dans le blog
    5
    Par défaut Passer d'un rendu RGB par calculs à un rendu RYB par une table
    Bonjour,

    Je crois que tu rencontres plusieurs sortes de difficultés, dans la réalisation de ton projet.

    1°) Les diagrammes de chromaticité sont certes très beaux, mais la manipulation des fonctions couleur risque de te conduire devant des obstacles très difficiles, sinon insurmontables.
    Ces fonctions sont destinées à la restitution des couleurs des radiations monochromatiques de longueur d'onde (λ) donnée, approximativement comprise entre 400 et 800 nm, et le spectre obtenu est relativement plus étalé du côté du rouge - d'où le décalage vers la droite des couleurs centrales (jaune et vert) que tu as noté.
    Une palette de couleurs doit-elle s'astreindre à un modèle aussi complexe ? D'autant que des difficultés supplémentaires ne manquent pas de surgir lorsque l'on veut passer au cercle des couleurs ...

    2°) Le passage du diagramme rectangulaire au cercle chromatique est lié à un changement de système de coordonnées, comme cela t'a été expliqué:

    Nom : Cercle_Coord Polaires.png
Affichages : 116
Taille : 16,5 Ko

    L'angle polaire correspond à la teinte exprimée en degrés, et pour les calculs la conversion en radians ne pose pas de difficultés:
    trad = (2*Pi/360)*(x - 1)/(La - 1)
    (La) représentant la largeur de l'image, et (x) l'abscisse du pixel considéré, variant de (0) à (La - 1).

    Les relations en cause sont bien présentées dans cet article:
    Nom : Transformations TSV-RVB.png
Affichages : 117
Taille : 50,6 Ko

    C'est en y regardant de près que l'on s'aperçoit que les choses sont moins simples en ce qui concerne l'expression du rayon (r); chaque diagramme comporte en fait deux parties, à la frontière desquelles la saturation (S) prend sa valeur maximale (Smax = 1):
    Nom : TSL_03.png
Affichages : 114
Taille : 77,2 Ko
    Nom : Cercle chromatique_02.png
Affichages : 112
Taille : 86,0 Ko

    Sur la partie la plus claire dont la teinte va des couleurs pures au blanc, la lumière (Value) est constante et maximale (V = 255) - c'est l'inconvénient des notions trop rudimentaires du système (HSV); cela correspond à la partie supérieure du domaine rectangulaire (2*y >= Ha), et pour le diagramme circulaire le rayon correspondant varie de zéro à un seuil (R1) ici approximatif: on pourrait envisager la relation:
    r = R1*S = R1*(2*y - Ha + 1)/(Ha - 1)

    Sur la partie la plus sombre (2*y < Ha et r > R1), la lumière varie (0 <= V <= 255) et l'on a probablement:
    r = R2 - (R2 - R1)*V = R1 + (R2 - R1)*y/(Ha - 1) .

    L'écart (R2 - R1) est relativement faible, parce que les couleurs sombres sont laides (moches est un terme tout à fait approprié), et qu'il faut éviter les images déprimantes.

    Je dois m'arrêter, j'ai eu des ennuis de connexion, et je vois que tu as déjà répondu ... Je poursuivrai plus tard.

    PS: Un peu laborieux, ce message, je le reconnais.
    Les expressions de (r), écrites à la volée, sont à vérifier.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  12. #12
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 444
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 444
    Points : 12 000
    Points
    12 000
    Par défaut
    Bonsoir,

    j'ai dû mal capter quelque chose :

    Nom : img1er_essai.png
Affichages : 106
Taille : 46,9 Ko

    On n'est pas très loin (le vert c'est presque ça : il démarre un peu trop bas mais il finit bien -- EDIT : si l'on fait abstraction du fait qu'il n'est pas à la bonne place : il devrait être à 9 h et là où il se trouve devrait être l'orange, en fait on tourne à l'envers), un matheux verra tout de suite où ça coince, moi je vais avoir du mal...
    Et c'est long : presque 15 secondes pour construire cette image (mais c'est peut-être lié à l'appel connu pour être loooong de bmp.Canvas.Pixels, voir le code)...
    Citation Envoyé par Nebulix Voir le message
    une phase P (angle du rayon = arc tangente(y/x).
    j'ai traduit "arc tangente(y/x)" par arctan2(y, x); sous Lazarus, c'est correct ?

    Sinon, pour tester, il faut un TImage de 360x360 et un TButton avec
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    uses Math;
    procedure TForm1.Button5Click(Sender: TObject);
    var
      d,radius,w,h: integer;
      ray: integer;
      phase: integer;
      cl, ct: integer; // cl=centre left, ct=centre top
      aBmp:TBitmap;
      degrade:TBitmap; // pour charger la map
      pb: pRGBQuad; // sans doute pRGBTriple sous Windows
      r,g,b: byte;
    begin
      degrade:=TBitmap.Create;
      degrade.LoadFromFile('/chemin/mapdegrRYB360.bmp');
      d := 360;
      radius := d div 2;
      cl := d div 2; ct := d div 2;
     
      // construction du bmp :
      aBmp:=TBitmap.Create;
      with aBmp do begin PixelFormat:=pf24bit; Width:=d; Height:=d; end;
     
      // parcours du carré dans lequel est inscrit le bmp :
      aBmp.BeginUpdate();
      for h := 0 to d-1 do begin
        pb := pRGBQuad(aBmp.RawImage.GetLineStart(h));
        for w := 0 to d-1 do begin
          if ((w-cl)*(w-cl) + (h-ct)*(h-ct)) <= radius*radius then begin
            // on est "dans" le cercle
            ray := (w div 2) + ct;
            phase := round(arctan2(h-ct,w-cl));
            //RedGreenBlue(degrade.canvas.Pixels[phase,ray], r,g,b);
    // on notera que je n'utilise pas ray et phase car c'est une catastrophe
            RedGreenBlue(degrade.canvas.Pixels[w,256-h], r,g,b); // 256-h pour centre blanc et bord noir
            pb[w].rgbRed   := r; // ajouter un "t" sous Windows : rgbt
            pb[w].rgbGreen := g;
            pb[w].rgbBlue  := b;
            pb[w].rgbReserved:= 255; // supprimer sous Windows
          end;
        end;
      end;
      aBmp.EndUpdate();
      image2.Picture.Bitmap.Assign(aBmp);
      aBmp.Free;
    end;
    Le fichier de map : mapdegrRYB360.zip
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  13. #13
    Membre chevronné

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    décembre 2010
    Messages
    959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2010
    Messages : 959
    Points : 1 831
    Points
    1 831
    Billets dans le blog
    5
    Par défaut Passer d'un rendu RGB par calculs à un rendu RYB par une table
    Intéressante, la documentation sur l'échelle RJB.

    Voici à toutes fins utiles un code de la fonction donnant l'argument d'un point quelconque (x, y), variant arbitrairement entre 0 et 360° et donnant directement la variable Teinte (Hue):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
     CONST H_Pi = Pi / 2; H3_Pi = 3 * H_Pi;
           D_Pi = 2 * Pi; Krad_deg = 180 / Pi;
     
     FUNCTION ArcT2(x, y: Reel): Reel;                // Cas o— Abs(y) < Abs(x)
       VAR Arad, At: Reel;
       BEGIN
         IF (y=0) THEN IF (x>0) THEN Arad:= 0
                                ELSE Arad:= Pi        // x <> 0
                  ELSE BEGIN
                         At:= ArcTan(y / x);
                         IF (x<0) THEN Arad:= Pi + At
                                  ELSE IF (y<0) THEN Arad:= D_Pi + At
                                                ELSE Arad:= At
                       END;
         Result:= Arad
       END;
     
     FUNCTION ArcT1(x, y: Reel): Reel;                // Cas o— Abs(y) > Abs(x)
       VAR Arad, At: Reel;
       BEGIN
         IF (x=0) THEN IF (y>0) THEN Arad:= H_Pi
                                ELSE Arad:= H3_Pi     // y <> 0
                  ELSE BEGIN
                         At:= ArcTan(x / y);
                         IF (y>0) THEN Arad:= H_Pi - At
                                  ELSE Arad:= H3_Pi - At
                       END;
         Result:= Arad
       END;
     
     FUNCTION ArgXY2(X_, Y_: Reel): Reel;  // Argument du point (x, y) variant de 0 … 360ø
       VAR At, Ax, Ay: Reel;
       BEGIN
         Ax:= Abs(X_); Ay:= Abs(Y_);
         IF (Ay>Ax) THEN At:= ArcT1(X_, Y_)
                    ELSE IF (Ay<Ax) THEN At:= ArcT2(X_, Y_)
                                    ELSE At:= 0;
         Result:= Krad_deg * At
       END;;
    Comme on n'est jamais trop prudent, je l'ai testé numériquement sur [0 ; 2*Pi[:

    Nom : Fonction ArgXY2.png
Affichages : 100
Taille : 35,6 Ko

    # Remarque mesquine, comme d'habitude: si le vert est au milieu, c'est que tu est parti de l'échelle (RVB) - et non pas (RJB)


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  14. #14
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 444
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 444
    Points : 12 000
    Points
    12 000
    Par défaut
    Bonjour,

    Citation Envoyé par wiwaxia Voir le message
    Intéressante, la documentation sur l'échelle RJB.
    Hé oui...

    Citation Envoyé par wiwaxia Voir le message
    Voici à toutes fins utiles
    c'est très gentil mais je ne vois pas du tout à quoi ça va pouvoir me servir...
    Je te rappelle que mes connaissances en maths sont plus que sommaires car je n'ai pas cette bosse qui permet de conceptualiser ces choses abstraites.
    En gros, ça ne me "parle pas", et il faudrait me l'expliquer comme à un gamin de 5 ans.

    En attendant, j'ai repris attentivement la manière de Nebulix, et j'arrive à ça :

    Nom : nouveau_calcul.png
Affichages : 101
Taille : 21,1 Ko

    J'ai dû me gourrer quelque part, mais où ? En tout cas c'est beau c'est propre, donc on n'est pas très loin.

    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
      // je rappelle que cl c'est center-left et ct center-top, les offsets du centre
      // car les parcours avec Scanline interdisent les indices négatifs pour accéder
      // aux pixels.
      // j'ai viré arctan2 pour utiliser arctan :
      for h := 0 to d-1 do begin
        pb := pRGBQuad(aBmp.RawImage.GetLineStart(h));
        for w := 0 to d-1 do begin
          if ((w-cl)*(w-cl) + (h-ct)*(h-ct)) <= radius*radius then begin
            // on est "dans" le cercle
            distance := round(sqrt((w-cl)*(w-cl) + (h-ct)*(h-ct)));
            phase := round(arctan((h-ct)/(w-cl)));
            RedGreenBlue(degrade.canvas.Pixels[phase,distance], r,g,b);
            pb[w].rgbRed   := r;
            pb[w].rgbGreen := g;
            pb[w].rgbBlue  := b;
            pb[w].rgbReserved:= 255;
          end;
        end;
      end;

    Et cet aprème je ne suis pas dispo, désolé.

    Citation Envoyé par wiwaxia Voir le message
    # Remarque mesquine, comme d'habitude: si le vert est au milieu, c'est que tu es parti de l'échelle (RVB) - et non pas (RJB)
    Ça, c'est juste pas possible puisque je balaye le bitmap RYB, celui que j'ai mis dans le zip en pj ! C'est tout simplement que je ne dois pas être au bon endroit dans ce bitmap,

    EDIT :
    Une intuition m'est venue en lisant l'aide de ArcTan, et je me suis souvenu avoir vu et utilisé dans mes vieux codes une fonction
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function ToDegrees(radians: double): double;
    begin
      result := radians * 57.2957795130823; // radians * (180.0 / Math.PI)
    end;

    alors hop ! :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //        phase := round(arctan(h/w));
            phase := round(ToDegrees(arctan((h-ct)/(w-cl))));

    et ça donne ça :

    Nom : en_degrés.png
Affichages : 99
Taille : 33,7 Ko

    On s'approche, on s'approche...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  15. #15
    Membre chevronné

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    décembre 2010
    Messages
    959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2010
    Messages : 959
    Points : 1 831
    Points
    1 831
    Billets dans le blog
    5
    Par défaut Passer d'un rendu RGB par calculs à un rendu RYB par une table
    Pas mal, le ballon de plage . Si tu voulais bien prendre la peine de t'attarder sur le fait que la fonction Arctan(y/x) ne peut être employée sans réserve, tu comprendrais que ce qui est proposé en est l'adaptation.
    Et tu peux l'intégrer directement dans ton code source: il a été écrit pour ça.

    Voici un codage des intensités relatives des composantes fondamentales (r, v, b) permettant d'obtenir une palette (RJB); cela doit correspondre à vue d'oeil à ce qui a été donné par anapurna.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
     FUNCTION Rrjb(t: Reel): Byte;
       VAR r: Reel; T0256, T23, T34, T45: Bool;
       BEGIN
         T0256:= ((0<=t) AND (t<120)) OR ((300<=t) AND (t<360));
         T23:= (120<=t) AND (t<180);
         T34:= (180<=t) AND (t<240);
    //     T45:= (240<=t) AND (t<300);
         IF T0256 THEN r:= 1
                  ELSE IF T23 THEN r:= 3 - (t/60)
                              ELSE IF T34 THEN r:= 0
                                          ELSE r:= (t/60) - 4;  // T45 vraie
         Result:= Round(255 * r)
       END;
     
     FUNCTION Vrjb(t: Reel): Byte;
       VAR r: Reel; T02, T23, T34, T46: Bool;
       BEGIN
         T02:= (  0<=t) AND (t<120);
         T23:= (120<=t) AND (t<180);
         T34:= (180<=t) AND (t<240);
    //     T46:= (240<=t) AND (t<360);
         IF T02 THEN r:= t / 120
                ELSE IF T23 THEN r:= 1
                            ELSE IF T34 THEN r:= 4 - (t/60)
                                        ELSE r:= 0;             // T46 vraie
         Result:= Round(255 * r)
       END;
     
     FUNCTION Brjb(t: Reel): Byte;
       VAR r: Reel; T03, T34, T45, T56: Bool;
       BEGIN
         T03:= (  0<=t) AND (t<180);
         T34:= (180<=t) AND (t<240);
         T45:= (240<=t) AND (t<300);
    //     T56:= (300<=t) AND (t<360);
         IF T03 THEN r:= 0
                ELSE IF T34 THEN r:= (t/60) - 3
                            ELSE IF T45 THEN r:= 1
                                        ELSE r:= 6 - (t/60);    // T56 vraie
         Result:= Round(255 * r)
       END;
    Code à vérifier, bien sûr .

    PS: ArcTan2(Y, X) donne effectivement le même résultat.


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  16. #16
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 444
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 444
    Points : 12 000
    Points
    12 000
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    -- snip --
    Nom : proc_wiwaxia.png
Affichages : 98
Taille : 16,6 Ko
    C'est assez psychédélique, faudra ralentir l'acide, quand même,
    ou me montrer comment tu les utilises (les fonctions, pas les buvards, )

    Moi j'ai fait comme ça :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    function changeRGBtoRYB(aRGB: TColor): TColor;
    var
      r,g,b: Real;
      rryb,yryb,bryb: byte;
    begin
      r :=  aRGB and $FF;
      g := (aRGB shr  8) and $FF;
      b := (aRGB shr 16) and $FF;
      rryb := Rrjb(r);
      yryb := Vrjb(g);
      bryb := Brjb(b);
      Result := (bryb shl 16) or (yryb shl 8) or rryb;
    end;

    et dans la proc qui appelle (extrait -- c'est rigolo, je retrouve des choses de Nebulix, et ça doit venir de chez efg...) :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
        for j := 0 to aWidth-1 do begin
          x := j-cx; y := i-cy;
          distanceSquared := x*x + y*y;
          if (distanceSquared <= radiusSquared) then begin // in circle
            h := ToDegrees(Math.Arctan2(x, y)) + 150.0; // Angle -- orig 180
            s := 1.0;
            l := 1.0 - (1.0/radiusSquared*distanceSquared); // 1 - (distance normalized)
            // dessus = construction de h, s et l pour générer un objet HSL
            RGBcolor := HSLtoRGB(h, s, l); // objet transformé en TColor
     
    // transformer rgb en ryb : une ligne nouvelle
    ////        RYBcolor := ComputeRGBtoColorRYB(ExtractColToRGB(RGBcolor));
    // dessous nouvelle fonction pour les routines wiwaxia : RYBcolor est un TColor
            RYBcolor := ChangeRGBtoRYB(RGBcolor);
     
            ColorToRGB(RYBcolor, R,G,B); // besoin des bytes R G B pour insertion dans pRGBQuad qui va remonter dans le TImage d'affichage
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  17. #17
    Membre éprouvé
    Profil pro
    chercheur
    Inscrit en
    avril 2004
    Messages
    795
    Détails du profil
    Informations personnelles :
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : chercheur

    Informations forums :
    Inscription : avril 2004
    Messages : 795
    Points : 1 293
    Points
    1 293
    Par défaut
    Il faudrait que tu regardes de près la fonction arc tangente que tu utilises. D'abord vérifier si elle te renvoie un angle en degrés ou en radians. Ensuite comment elle gère les différents quadrants.
    Ce qui s'énonce clairement se conçoit bien ( Le hautbois)

  18. #18
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 444
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 444
    Points : 12 000
    Points
    12 000
    Par défaut
    Citation Envoyé par Nebulix Voir le message
    Il faudrait que tu regardes de près la fonction arc tangente que tu utilises. D'abord vérifier si elle te renvoie un angle en degrés ou en radians.
    C'est écrit dans l'aide :
    Citation Envoyé par aide lazarus
    The resulting angle is in radial units.
    Comme dit précédemment, c'est ce qui m'a fait tilter et rechercher cette fonction de conversion ToDegrees.

    Citation Envoyé par Nebulix Voir le message
    Ensuite comment elle gère les différents quadrants.
    Mais il n'y a rien de plus dans l'aide ! Je suis sous Lazarus, l'aide c'est le parent pauvre, la misère noire,
    Juste ça, au début de la rubrique :
    Citation Envoyé par aide lazarus
    Calculate inverse tangent
    Ça te parle ? Moi pas, comme je l'ai souvent dit. À ce niveau je suis nul et je fais confiance à celui qui me dit quoi utiliser et comment.

    Alors, oui, je pourrais aller voir le code source mais je ne sais pas où c'est exactement caché, je tombe sur un truc ésotérique dans un fichier et je n'avance pas plus profondément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    { FPU functions }
       fpc_in_arctan_real      = 130;
    Et en exécutant le prog en pas-à-pas, on ne rentre pas dans cette fonction.
    À partir de là je suis comme une poule qui aurait trouvé un couteau,

    - - -
    Citation Envoyé par wiwaxia Voir le message
    PS: ArcTan2(Y, X) donne effectivement le même résultat.


    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            phase := round(ToDegrees(arctan ((h-ct) / (w-cl)))); // les quartiers rouge-orange déjà vus
            phase := round(ToDegrees(arctan2((h-ct) , (w-cl)))); // ci-dessous :
    Nom : arctan2.png
Affichages : 102
Taille : 36,7 Ko

    On est de + en + près : en fait ce qu'on voit devrait être en haut par effet miroir au lieu de en bas, et il manque donc le bas (bleu, mauve, etc.) et l'étape couleur vers noir.

    Citation Envoyé par wiwaxia Voir le message
    Pas mal, le ballon de plage . Si tu voulais bien prendre la peine de t'attarder sur le fait que la fonction Arctan(y/x) ne peut être employée sans réserve, tu comprendrais que ce qui est proposé en est l'adaptation.
    ne peut être employée sans réserve
    Qu'est-ce que tu entends par là (explication comme pour un minot de 5 ans qui aurait traversé l'Afrique à pied et la Meditteranée à la nage) ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  19. #19
    Membre chevronné

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    décembre 2010
    Messages
    959
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Formation: Chimie et Physique (structure de la matière)
    Secteur : Enseignement

    Informations forums :
    Inscription : décembre 2010
    Messages : 959
    Points : 1 831
    Points
    1 831
    Billets dans le blog
    5
    Par défaut Passer d'un rendu RGB par calculs à un rendu RYB par une table
    Citation Envoyé par wiwaxia Voir le message
    ... PS: ArcTan2(Y, X) donne effectivement le même résultat.
    Je le croyais bêtement, et les commentaires de Virtual Pascal ne sont pas plus explicites que les tiens.

    Je viens de modifier le petit programme précédent, qui révèle que la fonction Arctan2(y, x) balaie sur un tour le
    domaine semi-ouvert [-Pi ; +Pi[
    ce qui n'est pas pratique, dans le cas présent.

    Nom : Fonction Arctan2.png
Affichages : 97
Taille : 42,5 Ko

    Mais cela n'explique qu'en partie les résultats obtenus.

    La fonction Arctan(x, y) balaie le semi-ouvert [0 ; 360°[ ; peux-tu l'essayer ?

    PS: J'ai l'impression que tu y es presque arrivé.
    Tu pourrais plus simplement insérer la rustine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF (Angle<0) THEN Angle:= Angle + (2*Pi)


    Le français, notre affaire à tous
    Grand Dictionnaire Terminologique

  20. #20
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    8 444
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 8 444
    Points : 12 000
    Points
    12 000
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    La fonction Arctan(x, y) balaie le semi-ouvert [0 ; 360°[ ; peux-tu l'essayer ?
    Ou je n'ai pas compris la question, ou ça donne ça :

    Nom : arctan.png
Affichages : 97
Taille : 40,2 Ko
    On notera que le quart inférieur droit est correct (sauf l'absence du noir...)

    Citation Envoyé par wiwaxia Voir le message
    PS: J'ai l'impression que tu y es presque arrivé.
    Tu pourrais plus simplement insérer la rustine:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF (Angle<0) THEN Angle:= Angle + (2*Pi)
    Les grands esprits se rencontrent, je suis parti sur ça : if phase > 360 then phase := phase - 360; mais je n'ai pas noté de différence flagrante, à croire qu'on ne dépasse pas les bornes.

    Par contre, j'ai modifié un autre point :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            //RedGreenBlue(degrade.canvas.Pixels[phase,distance], r,g,b);
            RedGreenBlue(degrade.canvas.Pixels[360-phase,distance], r,g,b);
    et la moitié du boulot inférieur est faite !

    Nom : demi-cercle_inférieur.png
Affichages : 95
Taille : 42,9 Ko

    La moitié car on va de blanc à couleur et il manque couleur à noir.

    Quant à la partie supérieure, si on ne trouve pas avec les mathématiques, je sens que je vais prendre dans un bitmap temporaire le demi-cercle rouge-jauve-vert, lui appliquer un effet miroir et le coller au-dessus de celui-ci et ça ira bien.

    Nom : cercle_blanc2couleur.png
Affichages : 97
Taille : 26,9 Ko
    image réduite de moitié
    Ah bah nan, y a un ch'tit défaut au raccord à droite rouge du haut avec rouge du bas mais ça devrait pouvoir se rattraper en changeant les valeurs dans la map, ça,

    Bon, va falloir que je me déconnecte...


    EDIT : une illumination, vit' vit' avant de partir :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    //RedGreenBlue(degrade.canvas.Pixels[360-phase,distance], r,g,b); // original
    RedGreenBlue(degrade.canvas.Pixels[360-phase,distance*2], r,g,b); // enfin le blanc->coul->noir !
    Nom : avec_mul2.png
Affichages : 94
Taille : 25,9 Ko

    Voilà, ça vous fait de la matière pour gamberger c't'aprème,
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 17 1234511 ... DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 07/06/2007, 11h40
  2. [SQL] calcul de plusieurs variables dans une table
    Par kaolivier dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/03/2006, 21h53
  3. Etat bloqué par une table
    Par aujero dans le forum Access
    Réponses: 4
    Dernier message: 06/02/2006, 17h53
  4. Réponses: 12
    Dernier message: 21/10/2005, 14h35
  5. Réponses: 4
    Dernier message: 13/10/2005, 14h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo