IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Traitement d'images Discussion :

Uniformisation de couleurs dans un dégradé : comment faire ?


Sujet :

Traitement d'images

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Interpolation linéaire :
    comprendre ces 2 mots, ou ne pas les comprendre, ce n'est pas des maths mais du français.
    C'est ce que j'ai passé mon temps à rabâcher à mes gamins, mais je constate que ça fonctionne tant qu'on n'a pas besoin du dictionnaire, genre les problèmes de plombier avec la baignoire qui se remplit d'un côté et se vide de l'autre.
    Mais "interpolation", si déjà t'as du mal à comprendre le mot, automatiquement quand tu le vois dans une phrase tu zappes -- enfin, moi !

    Citation Envoyé par foetus Voir le message
    Moi, je vois 1 grosse cou^lle dans le potage , mais chacun son point de vue.
    Tu as tout dit, et je le mets en gras, car moi je ne vois rien...
    Question de points de vue, de la même manière que je vois des fautes d'orthographe horribles là où d'autres ne voient rien et cliquent allègrement sur "Envoyer la réponse".

    C'est comm' ça, ainsi vont le monde et la vie.

    Merci pour les explications,
    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. #62
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    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 : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut De quelques considérations générales autour d'un potage.
    Citation Envoyé par foetus Voir le message
    Et ouais Parce que je vois tous les calculs fait à base de racine carrée, de nombre magique (1,45), de fonctions mathématiques (2.5*W1 / (1 + 1.5*W1)) juste pour faire 1 ligne droite (et ceci pendant des jours et des jours) ...
    La dernière fonction proposée (F(g, w) = g*w/(1 + (g-1)*w) ) s'éloigne progressivement du segment de droite ( F(1, w) = w ) et permet de modifier plus facilement les étendues des diverses teintes(1).

    Nom : ggg_0.0256.jpg
Affichages : 327
Taille : 7,4 Ko Nom : ggg_0.0640.jpg
Affichages : 324
Taille : 7,9 Ko Nom : ggg_0.1600.jpg
Affichages : 324
Taille : 8,5 Ko Nom : ggg_0.4000.jpg
Affichages : 318
Taille : 8,7 Ko Nom : ggg_2.5.jpg
Affichages : 328
Taille : 8,9 Ko Nom : ggg_6.0.jpg
Affichages : 311
Taille : 8,4 Ko Nom : ggg_16.jpg
Affichages : 325
Taille : 7,7 Ko Nom : ggg_40.jpg
Affichages : 343
Taille : 7,1 Ko

    Tu as toi-même vaguement évoqué ce procédé
    Si tu veux un autre arc-en-ciel, tu changes les couleurs et/ ou les parties de ton dégradé.
    Après, cela peut être tendu (?) ... ou peut-être des dégradés avec lesquels des interpolations linéaires ne suffissent pas.
    sans proposer d'ailleurs quelqu'exemple que ce soit (on aurait été intéressé).

    Si tu t'étais donné la peine de consulter les pages précédentes, cela t'aurait évité de revenir à des points déjà largement évoqués et de conduire les échanges à l'enlisement (je m'abstiendrai d'ajouter: dans le potage , parce qu'en bonne compagnie, il faut savoir se tenir).

    Quand le débat se met à tourner en rond, cela conduit à cela:


    Une extrapolation intervient lorsqu'on ne peut pas relier tous les points par des lignes droites sans qu'il y ait des cassures.
    Donc, on calcule une fonction mathématique qui va passer proche de tous les points.
    L'extrapolation consiste à prolonger une relation linéaire (éventuellement approchée) en dehors ou à la limite de son domaine de définition, c.a.d. de l'intervalle où la grandeur considérée est (numériquement ou physiquement) accessible.
    Exemple: quand (x) tend vers zéro, sin(x)/x ~ 1 - u/6 , en posant u = x2 .
    tbc92 a dit l'essentiel à ce sujet:
    De la même façon extrapolation linéaire, ce sont les points de cette droite AB, mais qui sont à l'extérieur du segment AB (quand on rallonge la droite)
    Il n'est pas interdit de consulter un dictionnaire.

    (1) @ Jipété : un beau profil de bateau en perspective, avec cette série de dégradés pour g = (0.0256 , 0.064 , 0.16 , 0.4 , 2.5 , 6 , 16 , 40)
    - après coup, cela aurait été mieux avec des valeurs plus rapprochées.


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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Bonsoir,

    je reviens 30 secondes sur un point qui me rend perplexe : sur tes images le graphique est en bas et le dégradé en haut, et chez moi c'est l'inverse

    Je viens encore de relire attentivement tes proc's CalcMat_Im01 et CalcMat_Im02 (publiées dans ce post) et de les comparer avec les miennes, au niveau du calcul de K1 elles sont rigoureusement identiques...
    Une idée du pourquoi du comment de cette inversion de rendu ?
    Et j'ai testé sous Windows, le problème est identique, c'est donc bien lié à mon code.

    Merci (je verrai le reste plus tard)...
    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. #64
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    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 : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Jipété Voir le message
    ... je reviens 30 secondes sur un point qui me rend perplexe : sur tes images le graphique est en bas et le dégradé en haut, et chez moi c'est l'inverse ...
    En effet, je l'avais déjà constaté sur quelques unes de tes images

    Nom : JPT [2016-11-08#09H05] Spectre.jpg
Affichages : 328
Taille : 10,8 Ko

    mais n'avais pas cru devoir intervenir sur ce qui me paraissait un point secondaire, dans la mesure où tout était visible et cohérent ...

    Et cela ramène à une question que j'ai failli poser à la suite d'une autre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Et quel sont d'ailleurs les indices du premier pixel dans la variable 'bmp' traitée par la procédure de Lazarus ? (0, 0) ou (1, 1)?
    à savoir: où se trouve le premier pixel (0, 0) ? À gauche en bas ou en haut ? Dans ce dernier cas, ne verrait-on pas l'image renversée ?
    Pour le dégradé rien de changé, mais les graphes, par contre, ne correspondent plus aux maximums des couleurs principales.

    Essaye de rajouter le tracé en blanc d'un trait oblique dans CalcMat_Im02 en rajoutant après le tracé du dégradé (cela viendra par-dessus), donc après les instructions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            FOR y:= K1 TO Ha DO
                Ma[x, y]:= Px;
    le groupe suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
              Px[1]:= m; Px[2]:= m;
              Px[3]:= m; Ma[x, 1 + Round(x / 4)]:= Px;        // droite d'équation y = 1 + (x / 4)
    Je n'aime pas ce style, mais c'est du provisoire. Il faut une image suffisamment haute (Ha >= La / 4).


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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    Je n'aime pas ce style, mais c'est du provisoire. Il faut une image suffisamment haute (Ha >= La / 4).
    Bah, pourquoi pas, pour voir où on en est ?

    Code remis en page pour une meilleure lisibilité et donc une meilleure compréhension :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
              Px[1]:= m; Px[2]:= m; Px[3]:= m; 
              Ma[x, 1 + Round(x / 4)] := Px;        // droite d'équation y = 1 + (x / 4)
    Oui, je pinaille,

    Citation Envoyé par wiwaxia Voir le message
    Pour le dégradé rien de changé, mais les graphes, par contre, ne correspondent plus aux maximums des couleurs principales
    Peut-être que je les ai adaptés pour les faire rentrer là où ils devaient aller ?...
    Mais je ne vois pas en quoi le fait de croiser les trois couleurs et leurs pixels les auraient fait passer de bas en haut, et le dégradé de haut en bas
    D'autant plus que pour m'éviter des sacs de nœuds, j'ai toujours travaillé avec une seule proc à la fois (d'où ma méprise à un moment et ce remplacement erroné de 0.45 par 0.9, rapidement annulé)


    Citation Envoyé par wiwaxia Voir le message
    où se trouve le premier pixel (0, 0) ? À gauche en bas ou en haut ? Dans ce dernier cas, ne verrait-on pas l'image renversée ?
    À mon avis il est en haut à gauche. D'ailleurs, dans un autre projet, j'avais noté ça, concernant le bitmap de travail :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      ------------------------
      |0,0           1535,0  |
      |                      |
      |                      |
      |0,255         1535,255|
      ------------------------
    Citation Envoyé par wiwaxia Voir le message
    Et cela ramène à une question que j'ai failli poser à la suite d'une autre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Et quel sont d'ailleurs les indices du premier pixel dans la variable 'bmp' traitée par la procédure de Lazarus ? (0, 0) ou (1, 1)?
    Question à laquelle j'avais répondu mais effectivement elle est incomplète, donc ma réponse aussi -- Bon, c'est répondu complètement plus haut.

    Allez, les images parce que, oui, t'en as deux pour le prix d'une ! La seconde, je me suis contenté de générer un dégradé noir-->gris pour voir dans quel sens la chose évoluait, basé sur Px[1]:= x div 6; Px[2]:= x div 6; Px[3]:= x div 6; et l'on voit (devine, plutôt) que le noir démarre en haut à gauche :
    Nom : droiteblancheoblique.jpg
Affichages : 333
Taille : 14,1 Ko
    Nom : droitegriseoblique.jpg
Affichages : 342
Taille : 13,5 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. #66
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    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 : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Uniformisation de couleurs dans un dégradé
    Bonjour,

    Où se trouve le premier pixel (0, 0) ?
    La réponse est désormais sans appel
    À mon avis il est en haut à gauche.

    ------------------------
    |0,0 1535,0 |
    | |
    | |
    |0,255 1535,255|
    ------------------------
    Le logiciel te fournit les images la tête en bas, le système de coordonnées utilisées (x, y) est semblable à celui de l'écran-texte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      O
      + - - - - - - - - - ->  X
      ¦
      ¦
      ¦
      ¦
      v  Y
    Tu n'y peux probablement rien, à moins qu' il n'existe une option de renversement des coordonnées dans Lazarus ou Free Pascal - il te va falloir plonger héroïquement dans les User Guide.

    Si, comme Saint Thomas, tu doutais encore du fait, tu peux toujours:
    a) coder un faisceau de droites, en rajoutant les instructions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      Ma[x, 1 + Round(x / 6)] := Px;   // C'est vrai, pourquoi se priver ?
      Ma[x, 1 + Round(x / 8)] := Px;   
      Ma[x, 1 + Round(x / 10)] := Px;
    b) Remplacer tout le contenu de l'image par le dégradé de ton choix, en codant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     PROCEDURE CalcMat_Im02(La, Ha: Z_32; VAR Ma: Tab_Pix);
       CONST m = 255;
       VAR K1, x, y: Z_32; r, s: Reel; Px: Pixel;
       BEGIN
         La1:= La - 1; Ha1:= Ha - 1; Px[1]:= 0;                  // Bleu supprimé
         FOR x:= 1 TO La DO
           FOR y:= 1 TO Ha DO
             BEGIN
               s:= (x - 1) / La1; Px[2]:= Round(m * s);          // Vert à droite (en haut)
               s:= (y - 1) / Ha1; Px[3]:= Round(m * s);          // Rouge en bas (à gauche), Jaune à droite
               Ma[x, y]:= Px
             END
       END;
    La procédure CalcMat_Im01 sera devenue inutile, puisque le dégradé aura tout recouvert. Tu obtiens au passage un fond d'écran reposant (il y bien d'autres variantes).

    # Pour que tout rentre dans l'ordre, il faut installer la rustine suivante dans chacune des procédures (CalcMat_Im01 , CalcMat_Im0):
    a) en début de bloc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
       BEGIN
         H1:= Ha + 1; Dec(H1, m);             // dans CalcMat_Im01
     
         H1:= Ha + 1;                         // dans CalcMat_Im02
    b) et en modifiant chaque appel de la matrice:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        Ma[x, H1 - y]:= Couleur_P(...)           // dans CalcMat_Im01 # Ma[x, (Ha+1) - (y+m)] au lieu de Ma[x, y+m]
     
        Ma[x, H1 - y]:= Px                       // dans CalcMat_Im02 # Ma[x, (Ha + 1) - y] au lieu de Ma[x, y]
    Cela devrait marcher. Montre-moi les images.

    PS: Je viens de voir que sur les images apparaît la première bissectrice du repère (y = x) au lieu de la droite suggérée,
    d'équation: y = 1 + Round(x / 4); est-ce voulu ?


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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Bonjour,
    Citation Envoyé par wiwaxia Voir le message
    PS: Je viens de voir que sur les images apparaît la première bissectrice du repère (y = x) au lieu de la droite suggérée,
    d'équation: y = 1 + Round(x / 4); est-ce voulu ?
    Une bissectrice ce n'est pas une droite ?

    Mais ne tergiversons plus !
    Tu voulais de l'image ? En v'là 3 avec, de haut en bas, le dégradé standard puis l'application du pilote 9 avec g = 2.5 et en bas g = 40.
    Nom : 3graphes.jpg
Affichages : 200
Taille : 32,4 Ko

    J'ai souffert mais on n'a rien sans rien, hein !

    Mes corrections et remarques par rapport à tes suggestions :

    - dans Im02 : H1 := Ha; // + 1; // enlever le +1 sinon 1<sup>re</sup> ligne noire;
    - dans Im01 : H1 := Ha; dec(H1); // recopié depuis Im02, mais on est très bas --> suppr "m" dans dec(H1, m).
    et surtout, surtout !, puisqu'on renverse l'image, "tout ce qui montait doit descendre et tout ce qui descendait doit monter !" -- je fais là référence aux 3 lignes colorées, et donc, plutôt que ton Ma[x, H1 - y]:= Couleur_P(...), j'utilise Ma[x, (H1 div 2)+y]:= Cxx; (oui, j'ai conservé les Cxx, plus "parlants" pour moi).

    Et j'ai terminé par une dernière retouche au mode d'affichage proprement dit (que j'avais dû poster, donc s'il y en a qui suivent depuis le début, ça leur évitera de s'arracher les cheveux) :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
          for ww := 0 to (Width - 1) do begin
           {$IFDEF WINDOWS}
            dd[ww] := iRGBtoRGBTriple(ma[ww,hh][1], ma[ww,hh][2], ma[ww,hh][3]);
            {$ELSE}     // positions     R             G             B
            dd[ww] := iRGBAtoRGBAQuad(ma[ww,hh][1], ma[ww,hh][2], ma[ww,hh][3], 255);
            {$ENDIF}
          end;

    Voilà.
    La prise de tête, maintenant, va être d'avoir une belle image sous Windows sans casser celle sous Linux, parce qu'un test rapide me montre cette horreur :
    Nom : pointsparasites.jpg
Affichages : 215
Taille : 34,6 Ko

    Mais il suffit de remplir la matrice de noir avant d'appeler les fonctions de dessins, ouf !, avec ça :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      PixelNoir[1]:=0;  PixelNoir[2]:=0;  PixelNoir[3]:=0;
      for ww := 0 to dst.Width-1 do for hh := 0 to dst.Height-1 do ma[ww,hh] := PixelNoir;

    La dernière petite différence entre mes images et les tiennes, c'est le positionnement en hauteur du graphique par rapport au bas de l'image.
    Bah, ça n'est pas bien important, ce détail.
    EDIT : suffit de faire Ma[x, ((H1+m) div 2)+y]:= Cxx; /EDIT

    Un grand, un énorme merci pour tout ça

    Cependant, après avoir posté puis relu et regardé attentivement, je constate la chose suivante sur l'image du bas, celle avec g = 40, c'est qu'on a une énorme plage jaune alors qu'en examinant les graphiques le vert ne "décolle" que très tard, suivi d'une chute ultra-rapide du rouge : cet énorme aplat jaune m'intrigue, et mêmes remarques pour les aplats cyan et magenta...
    Une idée ?
    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

  8. #68
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    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 : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut
    Ça prend forme ! Tu as fait du bon boulot.

    Mais Les zones vertes de plus en plus étroites sont liées à des valeurs croissantes de (g), et à des courbes "gondolées" vers le haut: or c'est précisément le contraire que l'on voit.

    D'après ce que tu m'indiques, les teintes correspondent à g = { 1 , 2.5 , 40 } , et les graphes à g = { 1 , 1/2.5 , 1/40 } .
    Regarde bien la 3me: il y a un détail qui n'est pas logique ...

    Je m'absente jusqu'en soirée.


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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    Regarde bien la 3me: il y a un détail qui n'est pas logique ...
    J'ai TOUT repris à zéro (ouais, ch'suis un grand malade, )

    Et j'ai décidé d'aller vers tes couleurs plutôt que de tout trafiquer pour essayer d'obtenir un dégradé rouge-jaune-vert-cyan-bleu-magenta. On verra plus tard.
    Du coup, j'y suis arrivé.

    J'ai repris du début (posts 42 et 44), sans toucher à rien (ou le moins possible) :

    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
          Tab_Pix = ARRAY[1..Dim_Max, 1..(Dim_Max div 2)] OF Pixel;
    si pas "div 2", AV à l'exécution.

    Mise en place des modifs pour inversion haut-bas (post 66) :
    Nom : im0102_inversées.png
Affichages : 304
Taille : 2,9 Ko

    Problèmes :
    - la première colonne de l'image globale n'est pas bonne ; certainement liée au fait que tu commences toutes tes boucles de balayage à 1, moi on m'a appris à commencer à 0 et jusqu'à Largeur-1.
    - en ayant tout inversé, la couleur au début qui "montait" se retrouve à "descendre"...

    D'où modification de deux lignes de Im02 :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         H1:= Ha;// + 1; pourquoi +1 ? On va être plus grand que la hauteur...
         FOR x:= 0 TO La-1 DO

    et là, après une dernière modif, on se retrouve avec la même image que dans le post 30

    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
    //           s:= (x - 1)/(La - 1); r:= (2 * s);// - 1; // supprimer "-1" intervient sur la couleur
               s:= x/(La - 1); r:= (2 * s) - 1;
               // original
    //           s:= Coef_C(Pilote, r + h);    Px[1]:= Round(m * s);
    //           s:= Coef_C(Pilote, r);        Px[2]:= Round(m * s);
    //           s:= Coef_C(Pilote, r - h);    Px[3]:= Round(m * s);
               // OK pour dégradé rouge-jaune-vert-cyan-etc., avec "-1" supprimé plus haut
    //           s:= Coef_C(Pilote, r);        Px[1]:= Round(m * s);
    //           s:= Coef_C(Pilote, r - h);    Px[2]:= Round(m * s);
    //           s:= Coef_C(Pilote, r + h);    Px[3]:= Round(m * s);
               // mêmes couleurs que post 62 avec "-1" en service
               s:= Coef_C(Pilote, r - h);    Px[1]:= Round(m * s);
               s:= Coef_C(Pilote, r);        Px[2]:= Round(m * s);
               s:= Coef_C(Pilote, r + h);    Px[3]:= Round(m * s);

    Et voilà, ça le fait :
    Nom : final.jpg
Affichages : 343
Taille : 69,8 Ko

    à gauche en haut, identique au post 30 et dessous avec le pilote à 9 et g à 40
    à droite en haut pilote à 1 et dessous à 3, on a des beaux profils de bateaux

    en incruste (zoomé à donf') les artefacts liés sans doute aux arrondis des reals. Attention, l'image verte en bas à gauche et la rose en haut n'ont pas de défauts, elles sont là pour faire la comparaison avec leurs collègues de droite.
    Ce truc va m'énerver, particulièrement la ligne noire au-dessus d'en haut à droite.

    Le problème c'est qu'on ne peut à peu près toucher à rien, ça fait vraiment penser à un château de cartes...

    C'est quoi la taille de l'objet que tu utilises pour afficher ?
    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

  10. #70
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    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 : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut Uniformisation de couleurs dans un dégradé : comment faire ?
    Impeccable ! Les images (2, 3, 4, 5) sont réussies, dans le mesure où les teintes s'accordent aux courbes représentées dessous.
    Cependant ( je vais tout gâcher !) la première présente un inversion de la palette, le rouge devant se situer à droite, et le bleu à gauche ... Il devrait être facile de remédier à cela.

    Venons-en aux observations.

    1°)
    J'ai repris du début (posts 42 et 44), sans toucher à rien (ou le moins possible) :
    Code pascal :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Tab_Pix = ARRAY[1..Dim_Max, 1..(Dim_Max div 2)] OF Pixel;
    si pas "div 2", AV à l'exécution.
    Je n'ai pas compris ce que signifiait l'abréviation ...
    Et aussi pourquoi tu ne reportais pas le calcul de la seconde dimension dans la détermination préalable des constantes, en posant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
      CONST Larg_Max = 400;                 // par exemple
            Haut_Max = Larg_Max DIV 2; 
    ...
      TYPE Tab_Pix = ARRAY[1..Larg_Max, 1..Haut_Max] OF Pixel;
    ce qui peut faciliter des modifications ultérieures; mais c'est un détail, et chacun voit midi à sa porte.

    2°)
    Problèmes :
    - la première colonne de l'image globale n'est pas bonne ; certainement liée au fait que tu commences toutes tes boucles de balayage à 1, moi on m'a appris à commencer à 0 et jusqu'à Largeur-1 ...
    Le choix de commencer un comptage à zéro ou un est une affaire d'opportunité (cela risque d'en irriter plus d'un)
    a) la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For x:= 0 TO (Nmax - 1)
    s'apparente étroitement au reste de la division euclidienne (x = k MOD Nmax), et s'impose dès que l'on doit tracer un repère, un cadre ou une grille et représenter des traits régulièrement espacés (par ex. pour x (ou y) = 0, 100, 200, ... etc);
    b) la boucle correspond à la manière naturelle de compter (1 pour la première colonne, 2 pour la suivante ... ) et s'utilise spontanément pour la réalisation d'un dégradé; je n'ai d'ailleurs pas le choix, le lien entre la matrice et l'image Bitmap étant géré par l'unité dont la programmation est très lourde (je n'ai aucune envie d'y revenir !).
    Il va de soi qu'il faut adapter en conséquence la définition des paramètres qui viennent ensuite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        t:= x / (Nmax - 1)          // dans le cas     For x:= 0 TO (Nmax - 1) 
        t:= (x - 1) / (Nmax - 1)    // dans le cas     For x:= 1 TO Nmax
    et qu'une erreur pourra conduire à des surprises aux extrémités de l'intervalle, comme tu l'as toi-même constaté:.
    Le problème c'est qu'on ne peut à peu près toucher à rien, ça fait vraiment penser à un château de cartes...
    Une concision excessive du programme, la rareté des variables intermédiaires contribuent à la difficulté des corrections - allusion perfide aux appels & fonctions emboîtées.
    Idem pour le renversement de l'image de haut en bas, auquel tu as vaguement fait allusion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         H1:= Ha;// + 1; pourquoi +1 ? On va être plus grand que la hauteur ...
    La permutation des lignes résulte alors des instructions:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Y1:= Ha - 1 - y         // dans le cas     For y:= 0 TO (Ha - 1) 
    // ou bien:
        Y1:= H1 - y             // en ayant introduit  H1:= Ha - 1
    
        Y1:= Ha + 1 - y         // dans le cas     For y:= 1 TO Ha
     // ou bien:   
        Y1:= H1 - y             // en ayant introduit  H1:= Ha + 1
    C'est peut-être la cause de la ligne noire indésirable présente dans les images (1) et (3).

    3°) Restons zen à ce propos.
    Ce truc va m'énerver, particulièrement la ligne noire au-dessus d'en haut à droite.
    Il y a un moyen simple de vérifier que la ligne supérieure a échappé au coloriage: initialiser l'image en gris uniforme (au lieu du noir), cette teinte différant nettement de toutes celle de la palette, par un codage du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
      CONST o = 180;
            Gris: Pixel = (o, o, o);
     ...
        FOR x:= 0 TO (Larg_Max - 1) DO
          FOR y:= 0 TO (Haut_Max - 1) DO
            Ma[x, y]:= Gris
    On doit retrouver cette couleur sur la ligne du haut.

    4°) Il ne faut pas accuser les real de tous les maux (il me semble avoir déjà lu cet argument):
    en incruste (zoomé à donf') les artefacts liés sans doute aux arrondis des reals
    La dérive des calculs intermédiaires (ils ne comportent pas beaucoup d'étapes) reste de l'ordre de (2-63), soit environ (10 -19) si l'on emploie des extended en Pascal, tandis que la discrétisation des couleurs entraîne une erreur d'arrondi d'au moins (0.5/255)~2E-3; un abîme de 16 ordres de grandeur sépare donc les deux seuils, et la dérive due aux réels est (sauf cas très singulier) négligeable.

    5°) Au sujet des bateaux
    ... à droite en haut pilote à 1 et dessous à 3, on a des beaux profils de bateaux ...
    je pensais à la remarque pertinente que tu avais faite au sujet d'une série de palettes superposées (le 05/11/2016, 13h03):
    ... Le bleu me fait penser à l'étambot d'un navire "de ligne" du XVIIIe siècle ...
    6°)
    C'est quoi la taille de l'objet que tu utilises pour afficher ?
    J'emploie Irfan View pour voir les images Bitmap, modifier les dimensions et le format; Paint peut éventuellement servir à rajouter du texte. C'est très artisanal.
    Si tu fais allusion au fichier '.exe', sa grande taille est essentiellement due à la présence de la matrice (3*20002 = 12 Mo), qui excède largement celle de l'image. Je l'ai programmée en pensant au cas limite d'un fond d'écran, et il faudra que je reprenne cela.

    # Je ne suis pas curieux, mais j'aime bien savoir:
    à propos du chronométrage de l'exécution d'un programme (06/11/2016, 19h55)
    ... Mais le temps d'exécution il est documenté sur des milliers de sites, y a pas à se prendre la tête et à réinventer la roue, c'est tout simple ! ...
    Quels sites as-tu consultés ?


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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Bonjour,


    Citation Envoyé par wiwaxia Voir le message
    la première présente une inversion de la palette, le rouge devant se situer à droite, et le bleu à gauche ... Il devrait être facile de remédier à cela.
    "La première", celle qui est toute seule ? On s'en fiche, comme noté dessous j'ai bien trouvé des problèmes, que j'ai corrigés, ce qui m'a permis ensuite de générer la grande image aux quatre variations.

    1°) l'abréviation AV signifie Access Violation, qu'on rencontre en C, qui est parfois traduite en SIGSEGV (Segmentation Fault) et qui signifie toujours la même chose : (tentative d') accès à une zone mémoire non allouée/n'appartenant pas au programme.

    Citation Envoyé par wiwaxia Voir le message
    Et aussi pourquoi tu ne reportais pas le calcul de la seconde dimension dans la détermination préalable des constantes
    Flemme, et je voulais intervenir le moins possible dans ton code puisque je reprenais tout à la base. Modif prévue, à terme, quand tout le reste sera opérationnel...


    Citation Envoyé par wiwaxia Voir le message
    3°) Il y a un moyen simple de vérifier que la ligne supérieure a échappé au coloriage : initialiser l'image en gris uniforme (au lieu du noir), cette teinte différant nettement de toutes celle de la palette...
    On doit retrouver cette couleur sur la ligne du haut.
    Ça m'énerve l'informatique, ça m'énerve : il suffit que je fasse ce que tu dis (sauf que j'ai mis un gris à 128 au lieu de 180) pour que le problème disparaisse : plus de lignes moisies... Ça m'énerve !

    Mais ça ne fait pas disparaître le défaut de la 1re colonne du graphique (ici pilote mode 3, image trafiquée pour ne montrer que les parties significatives) :
    Nom : artefactspremierecolonne.png
Affichages : 281
Taille : 1,1 Ko

    Ce qui le fait disparaître, c'est de commenter la seconde instruction, là dans Im01, pour commencer 1 point plus à gauche :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
         FOR k:= -Lim TO Lim DO
           BEGIN
             r:= k / Lim;       s:= (r + 1) * (La - 1);
             x:= Round(s / 2); // Inc(x); // supprime l'artefact de 1re colonne
    Testé avec pilote en modes 0, 3, 5, 9 avec g=40 et OK dans ces 4 cas !

    Citation Envoyé par wiwaxia Voir le message
    6°) Si tu fais allusion au fichier '.exe', sa grande taille est essentiellement due à la présence de la matrice (3*20002 = 12 Mo), qui excède largement celle de l'image. Je l'ai programmée en pensant au cas limite d'un fond d'écran, et il faudra que je reprenne cela.
    La matrice est incluse dans l'exe ? Mais comment c'est possible un truc pareil ?
    Quand tu déclares un objet d'une taille démente, c'est à l'exécution que le prog en mémoire va prendre de la place, pas à la compilation -- ou alors quelque chose m'échappe grandement !
    Sinon, je faisais allusion à l'objet utilisé pour afficher l'image (dans mon cas avec Lazarus j'utilise un composant TImage posé sur la fiche et donc affichage du résultat dès le clic sur un bouton, mais d'après ce que je lis tu te contentes de générer un fichier visualisé ensuite avec un outil extérieur, c'est lourd !)

    - pour le temps d'exécution, je viens de taper delphi mesurer temps d'exécution et après tu as l'embarras du choix. Je ne te donne pas mon code, c'est du Linux pur et dur.

    Voilà pour les réponses. Maintenant, avançons :
    ci-dessous un dégradé RYGCBMR comme j'aime à l'appeler (voir plus bas dans les bouts de code joints les commentaires pour passer d'un dégradé à l'autre). Il est classique et très joli en mode pilote 0, là je suis en pilote 9 g=40, j'ose espérer que les couleurs du dégradé sont justes, mais ce qui ne l'est pas ce sont les couleurs du graphique (ou alors c'est l'inverse ?) :

    Nom : rygcbmr_pil9g40.png
Affichages : 336
Taille : 5,4 Ko

    Je ne te fais pas l'affront de coller une image du mode 0, c'est classique de chez classique le rouge démarre à 255, le bleu reste à 0 et le vert démarre à 0 pour monter (NOTE : pour discuter, j'utilise la notation mathématique 0,0 en bas à gauche même si je sais bien que dans l'objet Image sous Linux le 0,0 est en haut à gauche).
    Mais ce sont des droites.
    Sur cette image, si le dégradé est correct, il faudrait que le vert, démarrant à 0, monte très vite pour avoir du jaune au début et se stabilise en haut, ce qui n'est pas le cas, et pareil pour les autres : le rouge devrait rester en haut et descendre très vite à la fin de son 1er parcours, et pareil pour la suite...
    Et je ne sais pas où mettre les mains là-dedans sans casser tout le reste :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
         FOR k:= -Lim TO Lim DO
           BEGIN
             r:= k / Lim;       s:= (r + 1) * (La - 1);
             x:= Round(s / 2); // Inc(x); // supprime l'artefact de 1re colonne
             // dégradé wiwaxia
    //         s:= Coef_C(Pilote, r);     y:= Round(K1 * s); Ma[x, H1 - y]:= Cve;
    //         s:= Coef_C(Pilote, r + h); y:= Round(K1 * s); Ma[x, H1 - y]:= Cbl;
    //         s:= Coef_C(Pilote, r - h); y:= Round(K1 * s); Ma[x, H1 - y]:= Cro
             // dégradé RYGCBMR mais profils 3, 9 g=40 pas bons du tout...
             s:= Coef_C(Pilote, r);     y:= Round(K1 * s); Ma[x, ((H1+m) div 2) +y]:= Cro;
             s:= Coef_C(Pilote, r - h); y:= Round(K1 * s); Ma[x, ((H1+m) div 2) +y]:= Cve;
             s:= Coef_C(Pilote, r + h); y:= Round(K1 * s); Ma[x, ((H1+m) div 2) +y]:= Cbl;
           END


    Ensuite j'ai un cadeau pour toi, dans Im02 une accélération d'environ 3 fois du temps d'exécution (sur ma machine), mais je te conseille d'examiner le code avec le lien "dans une fenêtre à part", ça sera plus confortable.
    Tu noteras au milieu la ligne "optimisation" car, oui, je me suis rendu compte qu'un calcul était effectué de haut en bas pour rien à chaque avancement du pointeur de colonne, quand une fois suffisait (puisqu'on n'a pas de dégradé haut-bas) :
    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
     {    FOR x:= 0 TO La-1 DO  // mod
           FOR y:= K1 TO H1 DO // mod
             BEGIN
    //           s:= (x - 1)/(La - 1); r:= (2 * s)-1; // original
    //          s:= x/(La - 1); r:= (2 * s) - 1;// supprimer -1 fin de ligne intervient sur la couleur
              s:= x/(La - 1); r:= (2 * s);// - 1; pour dégradé RYGCBMR
             // code d'origine, on démarre à magenta, rouge, vert au milieu
    //           s:= Coef_C(Pilote, r + h);    Px[1]:= Round(m * s);
    //           s:= Coef_C(Pilote, r);        Px[2]:= Round(m * s);
    //           s:= Coef_C(Pilote, r - h);    Px[3]:= Round(m * s);
             // couleurs wiwaxia idem post 62 avec "-1 de fin de ligne" en service
    //         s:= Coef_C(Pilote, r - h);    Px[1]:= Round(m * s);
    //         s:= Coef_C(Pilote, r);        Px[2]:= Round(m * s);
    //         s:= Coef_C(Pilote, r + h);    Px[3]:= Round(m * s);
             // dégradé RYGCBMR OK comme ça avec "-1 de fin de ligne" supprimé
               s:= Coef_C(Pilote, r);        Px[1]:= Round(m * s);
               s:= Coef_C(Pilote, r - h);    Px[2]:= Round(m * s);
               s:= Coef_C(Pilote, r + h);    Px[3]:= Round(m * s);
               Ma[x, H1 - y]:= Px;
             END }
         // optimisation : 26.6 millisec dessous -- 85.5 dessus !
         FOR x:= 0 TO La-1 DO begin // mod, d'où suppr -1 dans (x - 1) dessous
    //           s:= (x - 1)/(La - 1); r:= (2 * s)-1; // original
    //           s:= x/(La - 1); r:= (2 * s) - 1;// supprimer -1 fin de ligne intervient sur la couleur
              s:= x/(La - 1); r:= (2 * s);// - 1; pour dégradé RYGCBMR
              // code d'origine, on démarre à magenta, rouge, vert au milieu
    //           s:= Coef_C(Pilote, r + h);    Px[1]:= Round(m * s);
    //           s:= Coef_C(Pilote, r);        Px[2]:= Round(m * s);
    //           s:= Coef_C(Pilote, r - h);    Px[3]:= Round(m * s);
              // couleurs wiwaxia idem post 62 avec "-1 de fin de ligne" en service
    //          s:= Coef_C(Pilote, r - h);    Px[1]:= Round(m * s);
    //          s:= Coef_C(Pilote, r);        Px[2]:= Round(m * s);
    //          s:= Coef_C(Pilote, r + h);    Px[3]:= Round(m * s);
              // dégradé RYGCBMR OK comme ça avec "-1 de fin de ligne" supprimé
               s:= Coef_C(Pilote, r);        Px[1]:= Round(m * s);
               s:= Coef_C(Pilote, r - h);    Px[2]:= Round(m * s);
               s:= Coef_C(Pilote, r + h);    Px[3]:= Round(m * s);
           FOR y:= K1 TO H1 DO // mod
             Ma[x, H1 - y]:= Px;
         end;

    C'est tout pour le moment (je ne sais pas ce qui se passe avec mon colis, toujours pas reçu, mais du coup on a du bol pour l'avancement ici...)
    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

  12. #72
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    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 : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut
    1°)
    Ça m'énerve l'informatique, ça m'énerve
    Tu as probablement dans le même dossier des versions différentes de procédures très proches, et tu ne sais plus lesquelles sont les bonnes ... Il faut regrouper celles devenues inutiles, ou donner des noms appropriés.
    C'est pour moi vital, quand un programme se construit en parallèle avec son unité: j'archive par sécurité les anciennes versions, mais prends soin de les noter: Prog_00.pas, Prog_01.pas, Unite_00.pas, Unite_01.pas, etc ; sinon cela peut devenir inextricable.

    2°)
    La matrice est incluse dans l'exe ?
    Bonne remarque. J'ai confondu avec le message de compilation: 12084412 big data .

    3°) Le code, après lecture , paraît correct et les couleurs et les courbes de l'image sont correctement placées; cependant mais elles diffèrent par la valeur du paramètre (g) (g>>1 pour le dégradé, g<<1 pour les graphes) - je crois que cela s'est déjà produit.
    Or la fonction Ccg est appelée deux fois, pour l'ordonnée des graphes et la teinte locale du dégradé. Selon les versions suggérées, ou bien:
    a) la valeur de (g) est choisie en constante interne, et tu appelles la fonction d'une variable Ccg(w) (ou autre chose, peu importe ...): par d'erreur possible;
    b) la valeur de (g) est celle d'une seconde variable, et tu dois retrouver la même instruction CcG(40, w) .
    Il est bien probable qu'il y ait pour les graphiques: CcG(0.025, w) .

    4°) Merci pour cette version plus rapide, qui évite bien des répétitions inutiles. Les variantes se sont succédé à un tel rythme (il y a d'autres projets, en parallèle) que cela m'a échappé.


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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    1°) Tu as probablement dans le même dossier des versions différentes de procédures très proches, et tu ne sais plus lesquelles sont les bonnes ... Il faut regrouper celles devenues inutiles, ou donner des noms appropriés.
    J'utilise des procédures différentes, toutes dans la même unité, mais je m'y retrouve : ce qu'il y a de sympa avec Delphi, Lazarus et peut-être d'autres EDI, c'est la manière d'inclure des procédures (ou fonctions) dans des procédures (ou fonctions) :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    procedure mainproc;
      procedure subproc;
      begin
        // instructions;
      end;
    begin
      subproc;
    end;
    Avec cette construction, subproc n'est connue que de mainproc et de rien d'autre, donc pas de risque d'erreur possible.

    Pour enfoncer le clou, j'ai renommé ma proc Coef_C en locCoef_C, loc pour dire "local" et j'ai inclus la sous-proc CcG dans locCoef_C.
    locCoef_C n'est appelé que par Im01 et Im02, ces deux-là étant incluses dans une nouvelle proc appelée par un clic sur un bouton qui passe le pilote et le bitmap de réception des calculs.
    Code complet en fin de post.

    Citation Envoyé par wiwaxia Voir le message
    3°) Or la fonction Ccg est appelée deux fois, pour l'ordonnée des graphes et la teinte locale du dégradé. Selon les versions suggérées, ou bien:
    a) la valeur de (g) est choisie en constante interne, et tu appelles la fonction d'une variable Ccg(w) (ou autre chose, peu importe ...): par d'erreur possible;
    b) la valeur de (g) est celle d'une seconde variable, et tu dois retrouver la même instruction CcG(40, w) .
    Il est bien probable qu'il y ait pour les graphiques: CcG(0.025, w) .
    Rien compris... Ce que je veux dire, c'est que je ne vois pas comment c'est possible.
    En plus, peu importe l'option choisie dans le case Pil of :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           //9: locCoef_C:= CcG(g, w);
           9: locCoef_C:= g*w/(1 + (g-1)*w);
    j'ai toujours la même image fausse au niveau du graphique, très bizarre

    Nom : rygcbmr_pil9g40.png
Affichages : 356
Taille : 5,4 Ko

    Aurais-je mal mis en œuvre cette histoire de CcG ?
    Le code complet (juste viré l'optimisation, puisque tu es d'accord) de la proc, où tu verras que je force g au début de locCoef_C :
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    procedure wiwaxia(Pilote: byte; dst: TBitmap);
     CONST Dim_Max = 2000;
     
     TYPE Pixel = ARRAY[1..3] OF Byte;
          Tab_Pix = ARRAY[1..Dim_Max, 1..(Dim_Max div 2)] OF Pixel;
          Z_32 = LongInt;
     
     VAR Haut_Image, Larg_Image: Z_32;          // Z_32 = LongInt
         Matr_Image: Tab_Pix;
         {Pilote: Byte;} g: Real;
         hh,ww : integer;
         PixelNoir: Pixel;
         {$IFDEF WINDOWS}
         ss,dd   :  pRGBTriple; // assumes pf24bit scanlines
         {$ELSE}
         ss,dd   :  pRGBQuad;   // assumes pf24bit scanlines
         {$ENDIF}
     
     
     FUNCTION locCoef_C(Pil: Byte; t: Real): Real;
       VAR u, v, w, g: Real;
           FUNCTION CcG(G1, W1: Real): Real;
             VAR p, q: Real;
             BEGIN
               p:= (G1 - 1) * W1; q:= 1 + p;
               p:= G1 * W1;       CcG:= p / q
             END;
       BEGIN
         g := 40;//2.5;//40;//0.0256;// , 0.064 , 0.16 , 0.4 , 2.5 , 6 , 16 , 40
         IF t>1 THEN u:= t - 2
                ELSE IF t<-1 THEN u:= t + 2
                             ELSE u:= t;
         v:= Abs(u); w:= 2 - (3 * v); IF w>1 THEN w:= 1
                                             ELSE IF w<0 THEN w:= 0;
         CASE Pil OF
           0: locCoef_C:= w;           // si w     = 0.2   | 0.5  | 0.8
           1: locCoef_C:= Sqr(w);      // sqr      = 0.04  | 0.25 | 0.64
           2: locCoef_C:= Sqr(Sqr(w)); // sqr(sqr) = 0.001 | 0.06 | 0.41
           3: begin u:= Sqrt(1 -w); locCoef_C:= Sqr(1 - u); end;
           4: locCoef_C:= Sqrt(w);     // sqrt     = 0.4   | 0.7  | 0.9
           5: begin u:= Sqr(1 - w); locCoef_C:= Sqrt(1 - u); end;
           //9: locCoef_C:= CcG(g, w);
           9: locCoef_C:= g*w/(1 + (g-1)*w);
           ELSE locCoef_C:= Sqrt(w);
         END;
       END;
     
     PROCEDURE CalcMat_Im02(La, Ha: Z_32; VAR Ma: Tab_Pix); // dégradé
       CONST Lim = 5000; h = 2 / 3; m = 255;
       VAR K1, H1, x, y: Z_32; r, s: Real; Px: Pixel;
       BEGIN
         H1:= Ha;// + 1; pourquoi +1 ?
         K1:= Round(0.55 * Ha);
         // optimisation : 26.6 millisec dessous -- 85.5 dessus !
         FOR x:= 0 TO La-1 DO begin // mod, d'où suppr -1 dans (x - 1) dessous
    //           s:= (x - 1)/(La - 1); r:= (2 * s)-1; // original
    //           s:= x/(La - 1); r:= (2 * s) - 1;// supprimer -1 fin de ligne intervient sur la couleur
              s:= x/(La - 1); r:= (2 * s);// - 1; pour dégragé RYGCBMR
              // code d'origine, on démarre à magenta, rouge, vert au milieu
    //           s:= locCoef_C(Pilote, r + h);    Px[1]:= Round(m * s);
    //           s:= locCoef_C(Pilote, r);        Px[2]:= Round(m * s);
    //           s:= locCoef_C(Pilote, r - h);    Px[3]:= Round(m * s);
              // couleurs wiwaxia idem post 62 avec "-1 de fin de ligne" en service
    //          s:= locCoef_C(Pilote, r - h);    Px[1]:= Round(m * s);
    //          s:= locCoef_C(Pilote, r);        Px[2]:= Round(m * s);
    //          s:= locCoef_C(Pilote, r + h);    Px[3]:= Round(m * s);
              // dégradé RYGCBMR OK comme ça avec "-1 de fin de ligne" supprimé
               s:= locCoef_C(Pilote, r);        Px[1]:= Round(m * s);
               s:= locCoef_C(Pilote, r - h);    Px[2]:= Round(m * s);
               s:= locCoef_C(Pilote, r + h);    Px[3]:= Round(m * s);
           FOR y:= K1 TO H1 DO // mod
             Ma[x, H1 - y]:= Px;
         end;
       END;
     
     PROCEDURE CalcMat_Im01(La, Ha: Z_32; VAR Ma: Tab_Pix); // graphiques
       CONST Lim = 5000; h = 2 / 3; m = 10;
             Cro: Pixel = (255, 0, 0);
             Cve: Pixel = (0, 255, 0);
             Cbl: Pixel = (0, 0, 255);
       VAR k, K1, H1, x, y: Z_32; r, s: Real;
       BEGIN
         H1:= Ha + 1; Dec(H1, m);
         K1:= Round(0.45 * Ha); Dec(K1);
         FOR k:= -Lim TO Lim DO
           BEGIN
             r:= k / Lim;       s:= (r + 1) * (La - 1);
             x:= Round(s / 2); // Inc(x);
             // dégradé wiwaxia
    //         s:= locCoef_C(Pilote, r);     y:= Round(K1 * s); Ma[x, H1 - y]:= Cve;
    //         s:= locCoef_C(Pilote, r + h); y:= Round(K1 * s); Ma[x, H1 - y]:= Cbl;
    //         s:= locCoef_C(Pilote, r - h); y:= Round(K1 * s); Ma[x, H1 - y]:= Cro
             // dégradé RYGCBMR
             s:= locCoef_C(Pilote, r);     y:= Round(K1 * s); Ma[x, ((H1+m) div 2) +y]:= Cro;
             s:= locCoef_C(Pilote, r - h); y:= Round(K1 * s); Ma[x, ((H1+m) div 2) +y]:= Cve;
             s:= locCoef_C(Pilote, r + h); y:= Round(K1 * s); Ma[x, ((H1+m) div 2) +y]:= Cbl;
             // mais profils 3, 9 g=40 pas bon du tout...
           END
       END;
     
    begin
      Larg_Image := dst.Width;
      Haut_Image := dst.Height;
    //  PixelNoir[1]:=0;  PixelNoir[2]:=0;  PixelNoir[3]:=0;
      PixelNoir[1]:=128;  PixelNoir[2]:=128;  PixelNoir[3]:=128;  // gris
      for ww := 0 to Larg_Image-1 do for hh := 0 to Haut_Image-1 do Matr_Image[ww,hh] := PixelNoir;
      CalcMAt_Im01(Larg_Image, Haut_Image, Matr_Image);
      CalcMAt_Im02(Larg_Image, Haut_Image, Matr_Image);
      with dst do begin
        BeginUpdate();
        for hh := 0 to (Height - 1) do
        begin
          {$IFDEF WINDOWS}
          dd := pRGBTriple(RawImage.GetLineStart(hh));
          {$ELSE}
          dd := pRGBQuad(RawImage.GetLineStart(hh));
          {$ENDIF}
     
          for ww := 0 to (Width - 1) do begin
           {$IFDEF WINDOWS}
            dd[ww] := iRGBtoRGBTriple(Matr_Image[ww,hh][1], Matr_Image[ww,hh][2], Matr_Image[ww,hh][3]);
            {$ELSE}     //           positions     R                     G                     B
            dd[ww] := iRGBAtoRGBAQuad(Matr_Image[ww,hh][1], Matr_Image[ww,hh][2], Matr_Image[ww,hh][3], 255);
            {$ENDIF}
          end;
        end;
        EndUpdate();
      end;
    end;

    et comment l'appeler :
    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
    procedure TMainForm.Button3Click(Sender: TObject);
    var
      StartTime, StopTime, Delta    :  QWord;
      dst: TBitmap;
    begin
      {$IFDEF LINUX}
      StartTime := GetTickCount64;
      {$ENDIF}
     
    //setup :
      image5.Height:=512; image5.Top:=300;
      dst := TBitmap.Create;
      dst.PixelFormat := pf24bit;
      dst.SetSize(1536, 512);
     
    //graphiques :
      wiwaxia(9, dst);
      image5.Picture.Assign(dst);// image5 fait 768x512 avec Stretch à True
     
      dst.Free;
     
      {$IFDEF LINUX}
      StopTime := GetTickCount64;
      Delta := StopTime - StartTime;
      //Caption := IntToStr(Delta) + ' nanosecondes';
      Caption := FloatToStr(Delta * ONE_OVER_MILLIER) + ' microsecondes';
      //Caption := FloatToStr(Delta * ONE_OVER_MILLION) + ' millisecondes';
      {$ENDIF}
    end;
    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

  14. #74
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    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 : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut
    # Intervertir les contenus les lignes (42) et (43):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
           //9: locCoef_C:= CcG(g, w);
           9: locCoef_C:= g*w/(1 + (g-1)*w);
    pour obtenir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
           //9:    locCoef_C:= g*w/(1 + (g-1)*w);
           9: locCoef_C:= CcG(g, w);
    et utiliser la fonction CcG(g, w).

    # Lignes (52), (71) et (72): RAS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    H1:= Ha;// + 1; pourquoi +1 ?
    ...
           FOR y:= K1 TO H1 DO // le complément (H1 - y) décroît de (H1 - K1) à (0) : correct 
             Ma[x, H1 - y]:= Px;
    # Ligne (58) à corriger:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
              s:= x/(La - 1); r:= (2 * s);// - 1; pour dégragé RYGCBMR
    la fonction est définie sur [-1 ; +1]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
              s:= x/(La - 1); r:= (2 * s) - 1;    //
    # Lignes (83), (94) à (96): là, je suis largué
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    H1:= Ha + 1; Dec(H1, m);
    ...
             s:= locCoef_C(Pilote, r);     y:= Round(K1 * s); Ma[x, ((H1+m) div 2) +y]:= Cro;
             s:= locCoef_C(Pilote, r - h); y:= Round(K1 * s); Ma[x, ((H1+m) div 2) +y]:= Cve;
             s:= locCoef_C(Pilote, r + h); y:= Round(K1 * s); Ma[x, ((H1+m) div 2) +y]:= Cbl;
    Cela n'irait-il pas mieux en écrivant (de tête):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
         H1:= Ha - 1; Dec(H1, m);
    ...
             s:= locCoef_C(Pilote, r);     y:= Round(K1 * s); Ma[x, (H1 - y)]:= Cro;
             s:= locCoef_C(Pilote, r - h); y:= Round(K1 * s); Ma[x, (H1 - y)]:= Cve;
             s:= locCoef_C(Pilote, r + h); y:= Round(K1 * s); Ma[x, (H1 - y)]:= Cbl;
    La symétrie des branches d'hyperbole conserve leur forme au cours de leur renversement, d'où l'apparente correspondance entre (g) et (1/g).


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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    # Intervertir les contenus les lignes (42) et (43):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
           //9: locCoef_C:= CcG(g, w);
           9: locCoef_C:= g*w/(1 + (g-1)*w);
    pour obtenir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
           //9:    locCoef_C:= g*w/(1 + (g-1)*w);
           9: locCoef_C:= CcG(g, w);
    et utiliser la fonction CcG(g, w).
    Intervertir juste la mise en commentaire avec "//" suffit.
    Bon, ça n'a peut-être aucun rapport avec le fait que mes courbes sont fausses, et ça ne s'arrange pas, lire dessous :

    Citation Envoyé par wiwaxia Voir le message
    # Ligne (58) à corriger:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
              s:= x/(La - 1); r:= (2 * s);// - 1; pour dégragé RYGCBMR
    la fonction est définie sur [-1 ; +1]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
              s:= x/(La - 1); r:= (2 * s) - 1;    //
    Moi je veux bien (quoique... on dirait que tu as zappé le commentaire sur la ligne qui précédait ma note "pour dégradé RYGCBMR" -- je te le remets : "supprimer -1 fin de ligne intervient sur la couleur") car d'une part je perds mon dégradé RYGCBMR, et d'autre part les graphiques ne sont de toute façon pas en accord avec le dégradé...
    Nom : CBMRYGC.png
Affichages : 290
Taille : 3,0 Ko

    Une autre idée ?

    Citation Envoyé par wiwaxia Voir le message
    # Lignes (83), (94) à (96): là, je suis largué
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    H1:= Ha + 1; Dec(H1, m);
    ...
             s:= locCoef_C(Pilote, r);     y:= Round(K1 * s); Ma[x, ((H1+m) div 2) +y]:= Cro;
             s:= locCoef_C(Pilote, r - h); y:= Round(K1 * s); Ma[x, ((H1+m) div 2) +y]:= Cve;
             s:= locCoef_C(Pilote, r + h); y:= Round(K1 * s); Ma[x, ((H1+m) div 2) +y]:= Cbl;
    Meuh non, c'est juste que tu as oublié que le "0" étant "en haut" pour moi, il me faut "descendre" dans la matrice d'au moins Ha div 2 (à la louche) pour atteindre le début de la zone des graphiques, ...
    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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Bon, j'arrive à unifier dégradé et graphique dans ton mode de couleurs (avec ce "-1" à l'endroit qui va bien) :

    Nom : good_wiwaxia.png
Affichages : 329
Taille : 34,1 Ko

    mais impossible d'avoir des graphiques cohérents quand j'enlève le "-1" pour avoir mon dégradé RYGCBMR

    Ce qui prouve au moins une chose : c'est que je n'ai rien compris (je m'en doutais un peu, note bien...)
    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. #77
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    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 : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut
    c'est juste que tu as oublié que le "0" étant "en haut" pour moi, il me faut "descendre" dans la matrice
    Pour une courbe ascendante, (yancien) compté à partir du bas augmente donc (ynouveau) compté à partie de la limite supérieure diminue; le renversement de l'image doit conduire ainsi à une expression du type: (ynouveau) = Cte - (yancien) .
    Autre façon de voir: les ordonnées positives définies à partir des limites extrêmes (basse et haute) vérifient:
    (yancien) + (ynouveau) = Cte = 0 + (Ha - 1) (dans le cas particulier des extrémités)
    en laissant de côté le décalage (m), qui vient en second lieu.
    Un simple dessin rend ces résultats évidents - et permet de soulager l'effort de réflexion lors de l'écriture du code.

    Ton dernier message me parvient à l'instant; il ne sert à rien de jeter le manche après la cognée. Essaie toutes les modifications proposées, et renvoie les résultats (image et code). Cela ne devrait pas déclencher de début d'incendie

    PS_1: Je viens de regarder la dernière image de près (j'ai un peu de mal à suivre), et tout est désormais cohérent.
    De quoi te plains-tu ? Il n'y a plus qu'une translation horizontale à effectuer sur les fonctions pour retrouver "ton" dégradé (RYGCBMR).
    Translation de (1/2) période, donc égale à (1) à gauche ou à droite.


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

  18. #78
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 421
    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 : 3 421
    Points : 5 820
    Points
    5 820
    Par défaut
    salut

    il y a quand meme une erreur dant ton programme
    Ta matrice image est de 1...X et tes boucles commence à zero pour palier à ce probleme il te suffit de faire un decalage de 1


    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
    ...   
     BeginUpdate();
        for hh := 0 to (Haut_Image - 1) do
        begin
          {$IFDEF WINDOWS}
          dd := pRGBTriple(RawImage.GetLineStart(hh));
          {$ELSE}
          dd := pRGBQuad(RawImage.GetLineStart(hh));
          {$ENDIF}
    
          for ww := 0 to (Larg_Image - 1) do
          begin
           {$IFDEF WINDOWS}
            dd[ww] := RGBtoRGBTriple(Matr_Image[ww+1,hh+1][1], Matr_Image[ww+1,hh+1][2], Matr_Image[ww+1,hh+1][3]);
            {$ELSE}     //           positions     R                     G                     B
            dd[ww] := iRGBAtoRGBAQuad(Matr_Image[ww+1,hh+1][1], Matr_Image[ww+1,hh+1][2], Matr_Image[ww+1,hh+1][3], 255);
            {$ENDIF}
          end;
        end;
        EndUpdate(); 
    ...
    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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 730
    Points : 15 132
    Points
    15 132
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    Ton dernier message me parvient à l'instant; il ne sert à rien de jeter le manche après la cognée. Essaie toutes les modifications proposées, et renvoie les résultats (image et code). Cela ne devrait pas déclencher de début d'incendie
    Les modifications proposées dans ton post de Marignan (15h15, ) ? Mais elles ont été essayées dans mes deux réponses suivantes, et tu vois bien que ce n'est pas brillant...

    Citation Envoyé par wiwaxia Voir le message
    Pour une courbe ascendante, (yancien) compté à partir du bas augmente donc (ynouveau) compté à partie de la limite supérieure diminue; le renversement de l'image doit conduire ainsi à une expression du type: (ynouveau) = Cte - (yancien).
    Tu parles de courbe ascendante, OK, mais elle sort d'où ?
    J'avais déjà posé ce genre de question, mais elle a fini à la trappe, alors same player shoots again :
    est-ce que le graphique est censé représenter une analyse du dégradé (auquel cas merci de me dire comment le construire) ou au contraire nous avons une information à faire afficher, genre for i := 1 to Image.Width-1 do Image[i] := offset + round(amplitude * sin(2 * pi * i / fréquence));, et le dégradé s'appuiera là-dessus pour se dessiner (après la courbe !) ?

    Cette formule, c'est avec elle que j'ai dessiné l'écran d'oscilloscope posté il y a quelques jours, ça m'a pris une poignée d'heures pour y arriver ; ici ça fait des jours qu'on y est et là je suis face à un mur puisque j'ai deux procédures (Im01 et Im02) dont je ne sais pas comment elles s'articulent entre elles, donc bon voilà, quoi...

    Citation Envoyé par wiwaxia Voir le message
    PS_1: Je viens de regarder la dernière image de près (j'ai un peu de mal à suivre), et tout est désormais cohérent.
    Oui, c'est bien ce que je disais mais ça concerne tes couleurs.

    Citation Envoyé par wiwaxia Voir le message
    De quoi te plains-tu ? Il n'y a plus qu'une translation horizontale à effectuer sur les fonctions pour retrouver "ton" dégradé (RYGCBMR).

    PS_2: ... et en plus, veinard, il y a plusieurs solutions, dont une ultra simple et sans calcul:
    a) translation de (1/2) période, donc égale à (1) à gauche ou à droite;
    b) permutation des couleurs, donc des indices (1, 2, 3) - je te laisse deviner laquelle ....
    a) sans doute oui, en regardant bien l'image, mais je n'arrive pas à trouver où se cache ta fucking période
    On m'a toujours dit qu'il fallait bien nommer ses variables alors, face à ton avalanche de r, k, s, x etc., je suis mal, je suis très mal...
    Tu as vu comment j'ai noté les trois variables de ma sinusoïde qq lignes plus haut ?
    Alors quand j'essaye au pif, j'arrive à compresser le graphique, à le déplacer un peu vers la droite, mais en règle générale c'est plutôt Access Violation quand je sors de la matrice .
    b) permutation, j'y ai passé des heures et non, ça ne le fait pas... Je n'y crois pas, tant qu'on ne m'aura pas montré que c'est possible.
    Exemple avec cet essai :
    Nom : pour_permuter.png
Affichages : 323
Taille : 4,9 Ko

    Le vert devrait être monter très vite dès le début (pour avoir du jaune) et rester haut jusqu'à la fin du cyan, hé bien, avec les courbes qu'on a (descente du rouge, montée du bleu, etc.), tu peux permuter tout ce que tu veux tu n'y arriveras pas.
    Valà...


    Citation Envoyé par anapurna Voir le message
    salut

    il y a quand meme une erreur dant ton programme
    Ta matrice image est de 1...X et tes boucles commence à zero pour palier à ce probleme il te suffit de faire un decalage de 1
    Euh, ça a été corrigé pour le dégradé : FOR x:= 0 TO La-1 DO begin, plus qu'à le faire pour le graphique mais là, c'est un tel brouillard...
    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

  20. #80
    Membre émérite

    Homme Profil pro
    Formation: Chimie et Physique (structure de la matière)
    Inscrit en
    Décembre 2010
    Messages
    1 333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 77
    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 : 1 333
    Points : 2 570
    Points
    2 570
    Billets dans le blog
    9
    Par défaut
    Les boucles sont correctement écrites, et suivent la convention :
    x (ou y) variant de (ou compris entre) 0 à (La - 1) ou (Ha - 1).
    Il suffit de reprendre les bornes de définition de la matrice;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Tab_Pix = ARRAY[0..Dim_Max-1, 0..(Dim_Max div 2)-1] OF Pixel;
    le seul changement important concerne la valeur minimale (0) si les dimensions de l'image sont inférieures aux valeurs limites.
    J'avais supprimé le (b), qui ne donne pas ce que tu attends (cyan au centre, très large, et bordé de bleu à droite).

    À partie de la même fonction CcG(g, w), tu peux obtenir un nouveau dégradé en codant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
              // dégradé RYGCBMR OK comme ça avec "-1 de fin de ligne" supprimé
               s:= locCoef_C(Pilote, r - 1/3);     Px[1]:= Round(m * s);      // Bleu Teinte max à droite
               s:= locCoef_C(Pilote, r + 1/3);     Px[2]:= Round(m * s);      // Vert Teinte max à gauche
               s:= locCoef_C(Pilote, r + 1);       Px[3]:= Round(m * s);      // Rouge aux extrémités
    Le spectre ne change pas d'aspect par renversement, mais pour les graphes il faut opérer le changement d'ordonnée déjà décrit: Ynou = Cte - Yanc .

    Tu parles de courbe ascendante, OK, mais elle sort d'où ?
    Je prenais en exemple une branche montante du graphe ... un dessin livre immédiatement la réponse:
    quand on se déplace sur le graphe de (M) vers (M'), Yanc (ordonnée du point sur l'écran, définie depuis la base de l'image) augmente, Ynou (rang de la ligne comptée depuis le haut) diminue et leur somme reste constante.
    Si tu as compris cela, c'est l'essentiel, la valeur de la constante est accessoire.
    Nom : Image Matrice.png
Affichages : 460
Taille : 5,5 Ko


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

Discussions similaires

  1. des couleurs dans la console,comment faire?
    Par rockkornman dans le forum C
    Réponses: 3
    Dernier message: 09/05/2009, 00h01
  2. variable dans un libellé, comment faire ?
    Par chapeau_melon dans le forum WinDev
    Réponses: 2
    Dernier message: 01/02/2008, 23h08
  3. Réponses: 5
    Dernier message: 03/09/2007, 20h36
  4. Très long texte dans Quick Report - Comment faire ?
    Par delphi+ dans le forum Composants VCL
    Réponses: 2
    Dernier message: 21/08/2005, 22h18
  5. [Syntaxe] Un return dans un try... Comment faire ?
    Par chuky dans le forum Général Java
    Réponses: 13
    Dernier message: 14/01/2005, 10h33

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