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. #101
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jipété Voir le message
    Oui mais ici la valeur négative ne nous intéresse pas car il est juste question de remplir la matrice, de 0 à Length-1.
    Si tu me permets ça ne change rien à la formule générale

    Je maintiens que la formule que j'ai mise est celle qui donne toujours le bon résultat : arrondi à l'entier le plus proche..



    Citation Envoyé par Jipété Voir le message
    J'ai rajouté une petite fonction de log juste après le calcul de x qui, je le rappelle, fonctionne comme ça :
    Code pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        FOR k:= -Lim TO Lim DO BEGIN  // Lim = 5000
          r:= k / Lim;
          x:= Round(((r+1) * Larg_Image) / 2); // Inc(x); // position horizontale, si Inc(x) présent, 1re colonne moisie
    * petite note de plus : faire une division par 2 sans mettre 2.0 (ou toute autre valeur entière sans mettre le ".0" après) fait faire une division entière au compilo, dans la grande majorité des cas )



    Et si tu veux accélérer d'un bon facteur tu écris :

    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Real_Inc = (double)Larg_Image / ((2.0 * Lim) ;
     
    R0 = (-(double)Lim -1) * Real_Inc ;
     
    for k := -Lim to Lim do begin
      R0 = R0 + Real_Inc ;
      x = (int) (R0 + 0.50) ;

    (2 additions par tour au lieu de 2 divisions + 1 multiplication + 1 addition)



    Mainrenant ton problème de +1, c'est juste parce que tu prends ton indice de -Lim à +Lim

    Prenons simplement :

    • une image de dimension Dx, on l'explorera de i = 0 à i < Dx (Dx valeurs, à cause du 0)

    • En faisant de -Lim à +Lim tu fais 10001 valeurs




    Ton code devrait donc être :

    Code Pascal : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Real_Inc = (double)Larg_Image / ((2.0 * Lim) ;
     
    R0 = -Real_Inc ;
     
    for k := 0 to (2*Lim-1) do begin
      R0 = R0 + Real_Inc ;
      x = (int) (R0 + 0.50) ;


    Quant au crash, normal si tu prends un log avec x = 0



    (A moins que je n'ai rien compris à tout ça (pas vraiment approfondi, juste premières impressions en survolant .. Si c'est le cas je m'en excuse par avance )
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  2. #102
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Je rajouterais un petit commentaire...


    Soit une image de dimension Dx que l'on veut afficher sur un écran de dimension DDx


    Chaque pixel de l'image devra être étalé sur DDx/Dx pixels de l'écran

    • Si l'image est plus petite que l'écran, DDX/Dx sera > 1, on aura donc comme un certain "zoom" : il faudra répéter pour un certain nombre de colonnes de l'écran la même colonne de l'image.

    • Dans le cas contraire, si on veut que toute l'image soit visible, il faudra calculer quelle colonne de l'image on va vouloir afficher pour telle colonne de l'écran..




    Comme on ne peut afficher que des pixels entiers, dans un sens ou dans l'autre, il faut effectuer des arrondis.. La seule manière de le faire est via les arrondis au plus proche entier, mais c'est le SENS dans lequel on fait la transformation qu va importer (c'est le cas avec les rotations d'images. Informez-vous sur Effet de Moiré (physique) (Wiki). On prend les pixels de l'image A CALCULER et on renverse la rotation pour savoir quel pixel de l'image d'origine on doit prendre... Cela garanti de ne pas avoir de trous)..


    Dans notre cas, on a donc 1 seul cas de figure : notre arrivée est l'écran

    On explore le DDx de l'écran (ou de la zone attribuée au tracé) de 1 en 1, et on calcule le i correspondant dans l'image d'origine par arrondi
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #103
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 551
    Points
    10 551
    Par défaut
    Citation Envoyé par souviron34 Voir le message
    Comme on ne peut afficher que des pixels entiers, dans un sens ou dans l'autre, il faut effectuer des arrondis..
    Il a des techniques pour cela supersampling, oversampling et autres

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

    suite a mon message je continue sur mon elan


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ...
    For k:= 0 to la-1 do 
    begin
      x := k ;
      s := k*2;
      r := (s/(la-1)) -1;
      //... ici on reprend le cours normale   
      s:= locCoef_C(Pilote, r);     
       ...
    end;
    ...
    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. #105
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par foetus Voir le message
    Il a des techniques pour cela supersampling, oversampling et autres

    Toutafé, ça n'empêche pas de comprendre le principe
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 044
    Points
    15 044
    Par défaut
    Bonsoir à tous,

    Ouh lala, quelle active participation, en plus, juste le mardi que pour moi c'est tendu,

    Citation Envoyé par souviron34 Voir le message
    • Si l'image est plus petite que l'écran, DDX/Dx sera > 1, on aura donc comme un certain "zoom" : il faudra répéter pour un certain nombre de colonnes de l'écran la même colonne de l'image.
    • Dans le cas contraire, si on veut que toute l'image soit visible, il faudra calculer quelle colonne de l'image on va vouloir afficher pour telle colonne de l'écran..
    Je vais en décevoir certains, mais je ne me prends pas la tête avec cet aspect "bassement matériel" des choses, , j'utilise pour l'affichage un composant (Delphi ou Lazarus c'est pareil) TImage équipé d'une fabuleuse propriété "stretch" qui fait exactement ce qu'il faut juste en la basculant à True et hop !

    Ça permet de se consacrer (se concentrer) à des tâches plus nobles, comme comparer les procédures de souviron34 à celles de wiwaxia et, indépendamment du décalage dans l'affichage (normal, on ne va plus de -Lum à + Lum mais de 0 à 2Lum-1), en termes de perfs, désolé souvi, mais on ne gagne rien ! Keud ! Pas un kopec...
    Les deux manières de faire affichent le dégradé en haut et le graphique dessous en environ 25 millisec.
    (Dégradé pas complet pour pas trop alourdir l'illustration, les graphiques : en haut souvi en bas wiwaxia) :
    Nom : compar_souvi_wiwaxia.png
Affichages : 178
Taille : 11,3 Ko

    À propos de ma division par 2, tu disais :
    Citation Envoyé par souviron34 Voir le message
    petite note de plus : faire une division par 2 sans mettre 2.0 (ou toute autre valeur entière sans mettre le ".0" après) fait faire une division entière au compilo, dans la grande majorité des cas )
    Est-ce que c'est grave, dans la mesure où le résultat sera de toute façon arrondi ? Rappel du code : x:= Round(((r+1) * Larg_Image) / 2);, étant entendu que j'ai remplacé cette divison par 2 par une multiplication par 0.5.

    Allez, je vais voir ce que propose l'ami Anapurna.

    À pluche
    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

  7. #107
    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
    Pour reprendre les remarques de 3 d'entre vous concernant plus ou moins directement le calcul ou la sélection des pixels, le programme a été conçu pour la création d'une image plus petite que l'écran. Maintenant chacun peut introduire les variantes appropriées en fonction des dimensions choisies et de ce qu'il voit sur l'écran. Le délai de calcul ne dépasse la seconde, et la rapidité est pour l'instant restée hors de mes préoccupations - ce qui n'enlève rien à l'intérêt de la méthode proposée par souviron34 - et que j'avais signalée.

    @ souviron34, justement:
    * petite note de plus : faire une division par 2 sans mettre 2.0 (ou toute autre valeur entière sans mettre le ".0" après) fait faire une division entière au compilo, dans la grande majorité des cas )
    En langage Pascal, le symbole '/' conduit toujours à un réel.
    Les opérateurs arithmétiques du Pascal sont :
    Opérateur Opération _ _ _ _ Opérandes _ _ _ _Résultat
    ... / ...
    / Division réelle _ _ _ _ _ real or integer _ _ real
    div Division entière _ _ _ _ integer _ _ _ _ _ _ integer
    mod Modulo (reste entier) _ integer _ _ _ _ _ _ integer


    div et mod ne fonctionnent que sur les integers. / fonctionne sur les reals et les integers mais retourne toujours un résultat real.

    @ anapurna
    je suppose donc quand connaissant la fonction inverse on devrais pouvoir retrouver nos éléments
    PS je pencherai donc pour une fonction sinusoïdale ce qui implique une période de 360°
    on retrouve ici le principe de l'onde ce qui est bien notre cas pour de la lumière ou couleur
    Il m'a fallu relire plusieurs fois le texte entier pour comprendre, et ce que j'en ai saisi est un peu inquiétant: ne serais-tu pas en train de confondre
    a) les coefficients de pondération des 3 couleurs fondamentales, définies sur [-1 ; +1], de période égale à 2 (pour des raisons pratiques) et décalées entre elles de (1/3) de période: Coef_C(t), Coef_C(t + 2/3), , Coef_C(t - 2/3) (en laissant de côté le paramètre d'option 'Pilote') ...
    b) la structure des ondes des ondes électromagnétiques, qui résultent de la propagation dans l'espace des oscillations simultanées de deux champs E et B ?

    De ceci, il n'est nullement question, et l'on ne retient que la notion de longueur d'onde (éventuellement la fréquence) pour caractériser une radiation monochromatique - et le lien avec les fonctions colorimétriques est une question difficile.
    Si la largeur de l'image se superpose à la période de Coef_C(t), c'est parce qu'on a choisi de faire apparaître la même couleur aux extrémités de la palette, ce qui rend possible le passage d'une figure linéaire à une figure circulaire.
    Quand au recours à une fonction sinusoïdale, il est envisageable sous réserve de faire intervenir une translation et deux écrêtages, ce qui modifie passablement la fonction de départ; je laisse le soin de vérifier le code, écrit rapidos, à ceux qui seraient intéressés:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     FUNCTION Coef_C(Pil: Byte; t: Reel): Reel;
       VAR u, v, w: Reel;
       BEGIN
         IF t>1 THEN u:= t - 2
                ELSE IF t<-1 THEN u:= t + 2
                             ELSE u:= t;
         v:= Abs(u);
         IF Odd(Pil) THEN w:= (1/2) + cos(Pi * t)
                     ELSE w:= (1/2) - cos(Pi * t);
         IF w>1 THEN w:= 1
                ELSE IF w<0 THEN w:= 0;
         Coef_C:= CcG(g, w)
       END;
    Peu de changement, finalement, si l'on superpose les 2 graphes sur leur domaine [-1 ; +1] .


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

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

    effectivement wiwaxia, je m’était empêtrer dans mes propre incompréhension du code
    c'est pour cela que j'ai posté une suite après les diverses réponses pour retrouver tes fameux coefficient en partant de x
    j'ai supposé que les éléments était réversible c'est à dire que si tu peut trouver x a partir de r il n'est pas inconcevable de retrouver r
    à partir de x l'avantage de partir de x c'est que celui-ci est connu pas besoin d'une matrice supplémentaire pour définir un coef
    maintemant je peut me tromper
    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

  9. #109
    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
    Ah oui, j'oubliais: l'introduction de la fonction cos(Pi * t), de période égale à (2), permet un allègement du code par la suppression des 3 premières lignes, où était imposée la condition de périodicité:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ... / ...
         IF t>1 THEN u:= t - 2
                ELSE IF t<-1 THEN u:= t + 2
                             ELSE u:= t;
      v:= Abs(t);   // début du nouveau texte
    ... / ...


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

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

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

    wiwaxia et anapurna, je ne comprends rien à votre aparté...
    wiwaxia, dans les codes que tu as postés, dans le 1er tu mets v := Abs(u); dans le second tu mets v := Abs(t); mais dans les deux cas ton "v" n'est ensuite pas utilisé, donc cette conversion ne sert à rien !
    Truc de ouf'
    Par ailleurs, je n'ai fait qu'un seul test (flemme) mais j'ai constaté que le résultat est le même, selon que j'utilise directement t, u ou v dans le calcul de cos(Pi...
    Vraiment bizarre cette nouvelle adaptation, qui en plus fait perdre le beau dégradé RYGCBMR


    Citation Envoyé par anapurna Voir le message
    comme le dis Tbc92 ta boucle est bien trop longue pourquoi ne pas mettre 100000
    Là aussi je ne comprends rien, anapurna : tu dis que la boucle est trop longue alors qu'elle va de -5000 à +5000 soit 10001, et tu proposes de la remplacer par 100000 ! 10 fois plus ! Rien compris.
    Mais peut-être que cette remarque n'est plus valide ?


    Et sinon, pour optimiser, il faudrait s'affranchir du passage par la matrice et écrire directement dans RawImage.Data puisque l'appel de la procédure passe le TBitmap destinataire des données, j'ai fureté un peu hier soir mais pour le moment ça n'a pas l'air aussi simple que ça...
    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. #111
    Expert confirmé
    Avatar de anapurna
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2002
    Messages
    3 410
    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 410
    Points : 5 801
    Points
    5 801
    Par défaut
    salut jipete
    c'etait une remarque sarcastique ... le choix arbritaire des 5000 n'est pas coherent c'est pour cela que j'ai dis pourquoi pas cent mille
    d'ou ma recherche a partir de x qui represente une valeur concrete et pas un choix arbitraire ... le reste de ma demonstration est toujours valide
    j'ai bien remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for k:=0 to la-1 do ....
    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

  12. #112
    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
    Bonjour,

    Le post d'anapurna contenait une bonne idée, le recours à une fonction sinusoÏdale, mais sans préciser les aménagements nécessaires.

    Citation Envoyé par Jipété Voir le message
    ... wiwaxia, dans les codes que tu as postés, dans le 1er tu mets v := Abs(u); dans le second tu mets v := Abs(t); mais dans les deux cas ton "v" n'est ensuite pas utilisé, donc cette conversion ne sert à rien !
    Truc de ouf'
    La chaîne des transferts des valeurs numériques est maintenue - mais seulement plus courte dans le second cas. J'avais oublié de supprimer une autre consigne, devenue inutile en raison de la parité de cos(Pi * t) ; cependant le transfert des Valeurs n'étais pas interrompu.

    a) (t) ──> (u) ──> (v) ──> (w)
    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
     
     
     FUNCTION Coef_C(Pil: Byte; t: Reel): Reel;   // Version initiale
       VAR u, v, w: Reel;
       BEGIN
         IF t>1 THEN u:= t - 2
                ELSE IF t<-1 THEN u:= t + 2
                             ELSE u:= t;          // (t) ──> (u)
         v:= Abs(u);                              // (u) ──> (v)
         IF Odd(Pil) THEN w:= 2 - (3 * v)
                     ELSE w:= (3 * v) - 1;        // (v) ──> (w)
         IF w>1 THEN w:= 1         
                ELSE IF w<0 THEN w:= 0;           
         Coef_C:= CcG(g, w)
       END;
    b) (t) ──> (w)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     FUNCTION Coef_C(Pil: Byte; t: Reel): Reel;        //  Version modifiée
       VAR w: Reel;
       BEGIN
         IF Odd(Pil) THEN w:= (1/2) + cos(Pi * t)       
                     ELSE w:= (1/2) - cos(Pi * t);     //  (t) ──> (w)
         IF w>1 THEN w:= 1
                ELSE IF w<0 THEN w:= 0;
         Coef_C:= CcG(g, w)
       END;;
    L'écart entre les deux fonctions au niveau des segments inclinés ne dépasse pas 0.00904: elles conduiront donc (pour (g) donné) aux mêmes teintes.
    Il serait intéressant de comparer les temps de calcul sur de grandes images: je ne suis pas sûr qu'une fonction trigonométrique permette la plus grande rapidité.


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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 044
    Points
    15 044
    Par défaut
    Salut à tous,

    Citation Envoyé par wiwaxia Voir le message
    Il serait intéressant de comparer les temps de calcul sur de grandes images: je ne suis pas sûr qu'une fonction trigonométrique permette la plus grande rapidité.
    Donc, comme dit précédemment, ta nouvelle version, wiwaxia, me fait perdre mon beau dégradé RYGCBMR et sinon, en termes de perfs, ça se tient avec les autres, pour mon bitmap 1536x512 : environ 25 millisec tout compris, ici avec pilote 3
    Nom : versionmodifiée.png
Affichages : 179
Taille : 4,9 Ko

    Citation Envoyé par anapurna Voir le message
    salut jipete
    c'etait une remarque sarcastique ...
    anapurna, rappelle-toi toujours que l'humour disparaît lors du passage à l'écrit, à moins de le blinder de tags [HUMOUR][/HUMOUR], la preuve je ne l'ai absolument pas capté/perçu dans ton post... Oui, il était "devinable" mais je me refuse à deviner/supposer autre chose que ce que je lis, sinon c'est la porte ouverte à tout et n'importe quoi.


    Citation Envoyé par anapurna Voir le message
    j'ai bien remplacé par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for k:=0 to la-1 do ....
    Et pour cette modif, c'est dans le droit fil de la proposition de souvi, renvoyée au vestiaire :
    Citation Envoyé par Jipété Voir le message
    ... comparer les procédures de souviron34 à celles de wiwaxia et, indépendamment du décalage dans l'affichage (normal, on ne va plus de -Lum à + Lum mais de 0 à (2Lum-1),

    Bonne journé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

  14. #114
    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
    ... Donc, comme dit précédemment, ta nouvelle version, wiwaxia, me fait perdre mon beau dégradé RYGCBMR ...
    Nulle tentative de harcèlement de ma part , tu as simplement pris la mauvaise option conduisant à F(0) = 1 , ce qui installe une couleur primaire au centre .
    Il fallait prendre l'autre fonction disponible, vérifiant F(0) = 0 et donnant ainsi une couleur secondaire au centre.
    (Re)voir les explications données plus haut (14/11/2016, 00h46), par une nuit de pleine lune. Ça marque, ordinairement
    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
    
     FUNCTION Coef_C(Pil: Byte; t: Reel): Reel;
       VAR u, v, w: Reel;
       BEGIN
         IF t>1 THEN u:= t - 2
                ELSE IF t<-1 THEN u:= t + 2
                             ELSE u:= t;Il
         v:= Abs(u);
         IF Odd(Pil) THEN w:= 2 - (3 * v)
                     ELSE w:= (3 * v) - 1;
         IF w>1 THEN w:= 1
                ELSE IF w<0 THEN w:= 0;
         Coef_C:= CcG(g, w)
       END;


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

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

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 700
    Points : 15 044
    Points
    15 044
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    Nulle tentative de harcèlement de ma part , tu as simplement pris la mauvaise option conduisant à F(0) = 1 , ce qui installe une couleur primaire au centre .
    Non non, juste que tu m'embrouilles avec tes mots !
    Quand je vois écrit "version initiale" et "version modifiée", je me dis qu'il y a des petites modifs pour optimiser des trucs et des machins, mais pas pour partir dans une autre direction !

    Tu aurais dû écrire "version dérivée, pour tests only", et au final, alors, elle sert à quoi cette version avec cos(Pi... (à part à me faire des nœuds dans la tête ) ?

    Citation Envoyé par wiwaxia Voir le message
    Il fallait prendre l'autre fonction disponible, vérifiant F(0) = 0 et donnant ainsi une couleur secondaire au centre.
    Étant entendu que l'autre option (les pilotes pairs si j'ai bien suivi) ne me le réaffiche pas plus... :
    pilote 2, juste la partie centrale :
    Nom : pilote2.png
Affichages : 156
Taille : 2,2 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

  16. #116
    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
    ... Non non, juste que tu m'embrouilles avec tes mots !
    Quand je vois écrit "version initiale" et "version modifiée", je me dis qu'il y a des petites modifs pour optimiser des trucs et des machins, mais pas pour partir dans une autre direction !

    Tu aurais dû écrire "version dérivée, pour tests only" ...
    Ça, c'est vrai, j'en suis dans mes archives à ma 5me version, et d'autres ne vont pas tarder à suivre compte tenu de toutes les idées exprimées sur ce forum. Je t'avais prévenu de bien classer les versions successives.

    Citation Envoyé par Jipété Voir le message
    et au final, alors, elle sert à quoi cette version avec cos(Pi... (à part à me faire des nœuds dans la tête ) ?
    Non, pas spécialement; je n'en avais pas parlé jusque là, afin d'éviter des complications inutiles et de de pas avoir à décrocher le 15 ... Mais à partir du moment où un autre intervenant a mis le sujet sur le tapis, j'ai suivi.
    Comme ça, je ne suis ni responsable, ni coupable.


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

  17. #117
    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 Latest version - for adults only
    Bonjour,

    J'ai repris la programmation comparée du dégradé de couleurs, selon l'échelle de teintes (RYVCBMR) si chère à Jipété et en minimisant la saisie des données, le choix de l'une des quatre fonctions possibles découlant de la valeur de la variable 'pilote':
    # Coeff_C(0) = 0 ou 1 selon que (p) est pair ou impair;
    # Coeff_C(t) f/linéaire par morceaux ou f. sinusoïdale écrêtée selon que (p) est inférieur ou supérieur à 9.5 .

    L'image comporte à chaque fois 5 dégradés horizontaux correspondant à diverses valeurs du paramètre (g): (w/16 , w/4 , w=2.5 , 4*w, 16*w).

    Comme on pouvait s'y attendre, les écarts sont indiscernables pour les deux types de fonctions.
    Le temps de calcul de la matrice est par contre nettement augmenté (~ 50 %) lorsqu'intervient une fonction sinusoïdale, la relative souplesse liée à l'emploi d'une fonction paire et périodique (cos(Pi*t)) se payant d'un allongement du délai d'apparition de l'image; pour une image 900x900, les valeurs affichées en fin d'exécution étaient de 0.20 et 0.31 s .

    Nom : aaaP08_280x280.jpg
Affichages : 169
Taille : 5,2 Ko _ Nom : aaaP09_280x280.jpg
Affichages : 174
Taille : 5,2 Ko _ (p = 8 , 9)
    Nom : aaaP20_280x280.jpg
Affichages : 154
Taille : 5,1 Ko _ Nom : aaaP21_280x280a.jpg
Affichages : 168
Taille : 5,2 Ko _ (p = 20 , 21)

    Sont joints ci-dessous le fichier-source du programme, et l'unité spécifique (sous sa forme la plus allégée - mais encore assez lourde) qui gère la création de l'en-tête et du corps de l'image Bitmap.
    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
    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
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
     
    {****************************************************************************
    *                                                                           *
    *  SpectreLin.PAS        Cr‚ation d'un fichier Bitmap Windows 24 bits,      *
    *                        5 palettes horizontales du mˆme d‚grad‚ (RJVCBMR)  *
    *                        pour des valeurs croissantes de (g):               *
    *                        (w/16 , w/4 , w , w * 4 , w * 16)                  *
    *                                                                           *
    ****************************************************************************}
     
     PROGRAM XXX;
     
     USES Crt, E_Texte, Math, U_Math, U_Chrono, Bmp_24_02S;
     
     TYPE T_CoeffC = FUNCTION(r: Reel): Reel;
     
     VAR Coeff_C: T_CoeffC;
         Pilote: Byte; g: Reel;
     
     PROCEDURE AffT;
       BEGIN
         E(0010); Wt(5, 15, 'Temps de cacul de la matrice: DeltaT = ');
         E(0012); Write(DeltaT_Chrono:5:2, '  s')
       END;
     
     PROCEDURE CalcMat_Im(La, Ha: Z_32; VAR G_: Reel; VAR Ma: Tab_Pix);
       CONST Lim = 5000; h = 2 / 3; m = 255; w = 2.5;
       VAR H1, L1, x, y, z: Z_32; r, s: Reel; Px: Pixel;
       BEGIN
         L1:= La - 1; H1:= Round(Ha/5); Top0_Chrono;
         FOR y:= 1 TO Ha DO
           BEGIN
             r:= (y - 1) / H1; z:= Floor(r);
             CASE z OF  0: G_:= w / 16; 1: G_:= w / 4;
                        2: G_:= w;      3: G_:= w * 4;
                        ELSE G_:= w * 16  END;
             FOR x:= 1 TO La DO
               BEGIN
                 s:= (x - 1) / L1; r:= (2 * s) - 1;
                 s:= Coeff_C(r);     Px[3]:= Round(m * s);
                 s:= Coeff_C(r + h); Px[1]:= Round(m * s);
                 s:= Coeff_C(r - h); Px[2]:= Round(m * s);
                 Ma[x, y]:= Px
               END
           END;
         Top1_Chrono
       END;
     
     
    (*HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
     
     P0 / Daisie du pilote - choix des fonctions Coefficient Couleur
     
    HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH*)
     
     FUNCTION ModNLin(h, s: Reel): Reel;
       VAR p, q: Reel;
       BEGIN
         p:= (h - 1) * s; q:= 1 + p;
         p:= h * s;       ModNLin:= p / q
       END;
     
     
     FUNCTION C_Lm00(t: Reel): Reel;
       VAR u, v, w: Reel;
       BEGIN
         IF t>1 THEN u:= t - 2
                ELSE IF t<-1 THEN u:= t + 2
                             ELSE u:= t;
         v:= Abs(u); w:= (3 * v) - 1; IF w>1 THEN w:= 1
                                             ELSE IF w<0 THEN w:= 0;
         C_Lm00:= ModNLin(g, w)
       END;
     
     FUNCTION C_Lm01(t: Reel): Reel;
       VAR u, v, w: Reel;
       BEGIN
         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;
         C_Lm01:= ModNLin(g, w)
       END;
     
     FUNCTION C_Se00(t: Reel): Reel;
       VAR u, v, w: Reel;
       BEGIN
         u:= Pi * t;  v:= Cos(u);
         w:= 0.5 - v; IF w>1 THEN w:= 1
                             ELSE IF w<0 THEN w:= 0;
         C_Se00:= ModNLin(g, w)
       END;
     
     FUNCTION C_Se01(t: Reel): Reel;
       VAR u, v, w: Reel;
       BEGIN
         u:= Pi * t;  v:= Cos(u);
         w:= 0.5 + v; IF w>1 THEN w:= 1
                             ELSE IF w<0 THEN w:= 0;
         C_Se01:= ModNLin(g, w)
       END;
     
     PROCEDURE Calc_Coeff(Pil: Byte; VAR Fc: T_CoeffC);
       VAR Impair: Boolean; F: T_CoeffC;
       BEGIN
         Impair:= Odd(Pil);
         IF (Pil>9) THEN IF Impair THEN F:= C_Se01
                                   ELSE F:= C_Se00
                    ELSE IF Impair THEN F:= C_Lm01
                                   ELSE F:= C_Lm00;
         Fc:= F
       END;
     
    (*HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
     
     Programme principal
     
    HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH*)
     
     PROCEDURE Graphe;
       CONST m = 255; Coul_T: Pixel = (0, 0, 0);
       BEGIN
         GraphBmp(000);
         CalcMat_Im(Larg_Image, Haut_Image, g, Matr_Image);
         Creation_F(Larg_Image, Haut_Image); AffT
       END;
     
     PROCEDURE P0(VAR Pil: Byte);
       CONST C1 = 2; C2 = C1 + 19; C3 = 7; C4 = C3 + 39;
             L1 = 4; L2 = L1 + 4;  L3 = L2 + 14;
       BEGIN
         E(1015);
         Wt(C1     , L1 - 2, 'Choix des fonctions paires Coefficient Couleur');
         Wt(C1 + 10, L1    , 'Pilote = ');
         E(0010);
         Wt(C3, L2,     '# Pair   :      Coef(0) = 0');
         Wt(C3, L2 + 2, '# Impair :      Coef(0) = 1');
         Wt(C3, L2 + 4, '# < 10   :      Coef = f lin‚aire par morceaux');
         Wt(C3, L2 + 6, '# >  9   :      Coef = f sinuso‹dale ‚crˆt‚e');
     
         E(0007); Rn1(C2, L1, Pil);
         E(0012); We(C2, L1, Pilote, 5);
         Calc_Coeff(Pilote, Coeff_C); A_
       END;
     
     PROCEDURE Menu;
       CONST C1 = 11; C2 = 16; L1 = 5; L2 = 11;
       BEGIN
         E(1010); Cadre(C1, L1-2, 81-C1, L1+2, 110);
         Wt(27, L1,    'CREATION D''UN FICHIER BITMAP'); E(0011);
         Wt(C2, L2,    '" " :        Menu');
         Wt(C2, L2+ 4, '"0" :        Loi de composition des couleurs');
         Wt(C2, L2+ 6, '"1".."9" :   Saisie des dimensions de l''image')
       END;
     
     VAR Depart: Boolean;
     
     PROCEDURE Choix(VAR Dep: Boolean);
       VAR Touche: Char;
       BEGIN
         REPEAT
           IF Dep THEN BEGIN
                         Dep:= FALSE; Menu; A_; P0(Pilote)
                       END
                  ELSE Touche:= ReadKey;
           CASE Touche OF  ' ': Menu; '0': P0(Pilote);
                           '1'..'9': Graphe  END
         UNTIL Touche=#27
       END;
     
     BEGIN
       Depart:= True; Choix(Depart)
     END.
    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
    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
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
     
     UNIT Bmp_24_02S;
     
     
     INTERFACE
     
     USES Crt, E_Texte, U_Math;
     
     CONST Dim_Max = 2000;
     
     TYPE Pixel = ARRAY[1..3] OF Byte;
          Tab_Pix = ARRAY[1..Dim_Max, 1..Dim_Max] OF Pixel;
          F_Reel = FUNCTION(o: Reel): Reel;
          F_Pixl = FUNCTION(o: Reel): Pixel;
     
     VAR Haut_Image, Larg_Image, Prod_LaHa: Z_32;
         Matr_Image: Tab_Pix;
                                            // Creation_F
     PROCEDURE Creation_F(La, Ha: Z_32);
     
                                            // GraphBmp
     PROCEDURE GraphBmp(Code_Cf: Word);
     
     
     IMPLEMENTATION
     
     CONST T_Entete = 54;
     
     TYPE LstTeB  = ARRAY[0..T_Entete-1] OF Byte;
     
     VAR T_Image, T_Fichier: Z_32; En_Tete: LstTeB;
         Nom_F: String;            Fichier: FILE OF Byte;
     
    (*****************************************************************************
     
     Creation_F
     
    *****************************************************************************)
     
     PROCEDURE Compteur(x, y: Byte; l: Z_32);
       VAR i: Word;
       BEGIN
         IF l<0 THEN We(x, y, -l, 8)
                ELSE BEGIN
                       i:= l MOD 1000; IF i=0 THEN We(x, y, l, 8)
                     END
       END;
     
     PROCEDURE Aff_NomF(VAR Nf: String);
       CONST C1 = 4; C2 = C1 + 47; C3 = C1 + 37; L1 = 12; L2 = L1 + 1;
             Chem = 'D:\ZZZZZZ\'; Ext = '.bmp';
       VAR Nom: String;
       BEGIN
         E(0015);         Wt(C1, L1, 'Nom et emplacement du fichier image: ');
         Write(Chem);     E(0008);
         Rt(C2, L1, Nom); Nf:= Chem + Nom + Ext;
         E(0010);         Wt(C3, L1, Nom_F)
       END;
     
     PROCEDURE Creation_F(La, Ha: Z_32);
       CONST C1 = 71; L1 = 9; Lim = T_Entete - 1;
       VAR Delta, n, Zero: Byte; k, x, y: Z_32;
       BEGIN
         Aff_NomF(Nom_F); Assign(Fichier, Nom_F); Rewrite(Fichier);
         FOR k:= 0 TO Lim DO Write(Fichier, En_Tete[k]);
         k:= Lim;         Compteur(C1, L1-1, -k);
         E(0012);         Delta:= La MOD 4;       Zero:= 0;
         FOR y:= 1 TO Ha DO
           BEGIN
             FOR x:= 1 TO La DO
               FOR n:= 1 TO 3 DO BEGIN
                                   Inc(k); Write(Fichier, Matr_Image[x, y][n]);
                                   Compteur(C1, L1, k)
                                 END;
             IF Delta>0 THEN FOR n:= 1 TO Delta DO BEGIN
                                                     Inc(k); Write(Fichier, Zero);
                                                     Compteur(C1, L1, k)
                                                   END
           END;
         Close(Fichier);       Compteur(C1, L1, -k);
         E(0008);              Wt(4, L1, 'Rang du dernier octet:');
         Compteur(39, L1, -k); E(0014); Wt(C1-1, L1+2, 'Û  FIN  Û')
       END;
     
     
     
    (*****************************************************************************
     
     GraphBmp
     
    *****************************************************************************)
     
     PROCEDURE CalcOctet(Rang: Byte; Nombre: Z_32; VAR Li: LstTeB);
       CONST B1 = 256;
       VAR i, j: Byte; p, q: Z_32;
       BEGIN
         p:= Nombre;
         FOR i:= 0 TO 3 DO BEGIN
                             j:= Rang + i; Li[j]:= p MOD B1;
                             q:= p DIV B1; p:= q
                           END
       END;
     
     PROCEDURE Init_Entete(VAR Ent: LstTeB);
       CONST T_E_Image = 40;
       VAR k: Byte; Liste: LstTeB;
       BEGIN
         FOR k:= 0 TO (T_Entete - 1) DO Liste[k]:= 0;
    (* Caract‚ristiques principales du fichier: type, taille,
       adresse relative de l'image *)
         Liste[00]:= 66;                    // 'B': 66 = hx42
         Liste[01]:= 77;                    // 'M': 77 = hx4D
         CalcOctet(02, T_Fichier,  Liste);  // Taille du fichier
         CalcOctet(10, T_Entete,   Liste);  // Offset de l'image = 54 (d‚calage)
    (* Caract‚ristiques principales de l'image *)
         CalcOctet(14, T_E_Image,  Liste);  // Taille de la zone Bitmap info = 40
         CalcOctet(18, Larg_Image, Liste);  // Largeur de l'image
         CalcOctet(22, Haut_Image, Liste);  // Hauteur de l'image
         Liste[26]:= 01;                    // Nombre de plans (fix‚s … 1)
         Liste[28]:= 24;                    // Nombre de bits / pixel (3 octets)
         CalcOctet(34, T_Image,    Liste);  // Taille de l'image
    (*   CalcOctet(38, Resolution, Liste);  // R‚solution horizontale
                                            // facultative, 0 par d‚faut
         CalcOctet(42, Resolution, Liste);  // R‚solution verticale
                                            // facultative, 0 par d‚faut      *)
         Ent:= Liste
       END;
     
     PROCEDURE AffT_ImFi;
       CONST C1 = 4; L1 = 9; Ca = 11; Cb = 13; u = 8;
       BEGIN
         E(Ca); Wt(C1, L1-1, 'Taille de l''image:          T_Im = ');
         E(Cb); Write(T_Image:u, ' octets');
         E(Ca); Wt(C1, L1+1, 'Taille du fichier:          T_Fi = ');
         E(Cb); Write(T_Fichier:u, ' octets');
       END;
     
     PROCEDURE CalcTaille(La, Ha: Z_32; VAR T_Im, T_Fi: Z_32);
       VAR Ligne, Taille: Z_32;
       BEGIN
         Ligne:= 3 * La; Inc(Ligne, La MOD 4);     Taille:= Ligne * Ha;
         T_Im:= Taille;  T_Fi:= Taille + T_Entete; AffT_ImFi
       END;
     
     PROCEDURE Calc_Cf_2(La, Ha, u, v: Z_32; VAR Cf: Pixel);
       CONST Max = 255;
       VAR p, q, r, s, t: Reel; Px: Pixel;
       BEGIN
         p:= u / La;            q:= v / Ha;
         r:= Sqr(p);            s:= Sqr(q);
         t:= (1 - r) * (1 - s); Px[2]:= Round(Max * t);
         r:= Sqr(1 - p);        Px[1]:= Round(Max * (1 - r));
         s:= Sqr(1 - q);        Px[3]:= Round(Max * (1 - s));
         Cf:= Px
       END;
     
     PROCEDURE Calc_Cf_1(La, Ha, u, v: Z_32; VAR Cf: Pixel);
       CONST Max = 255;
       VAR p, q, r, s, t: Reel; Px: Pixel;
       BEGIN
         p:= u / La;          q:= v / Ha;
         r:= Sqr(p);          s:= Sqr(q);
         t:= 1 - (r + s) / 2; Px[2]:= Round(Max * t);
         r:= Sqr(1 - p);      Px[1]:= Round(Max * (1 - r));
         s:= Sqr(1 - q);      Px[3]:= Round(Max * (1 - s));
         Cf:= Px
       END;
     
     PROCEDURE Calc_Cf(Indice: Word; VAR Cf: Pixel);
       CONST B_08 = 256; Max = 13005;
       VAR Ibl, Iro, Ive, j: Word; z: Reel; Coul: Pixel;
       BEGIN
         Ibl:= Indice DIV 100; j:= Indice MOD 100;
         Ive:= j DIV 10;       Iro:= j MOD 10;
         z:= Sqrt(Max * Ibl);  Coul[1]:= Round(z) MOD B_08;
         z:= Sqrt(Max * Ive);  Coul[2]:= Round(z) MOD B_08;
         z:= Sqrt(Max * Iro);  Coul[3]:= Round(z) MOD B_08; Cf:= Coul
       END;
     
     PROCEDURE In_MatrIm_1(La, Ha, x, y: Z_32; Co: Word; Cz, Cf: Pixel;
                           VAR Npix: Z_32; VAR Mxy: Pixel);
       BEGIN
         IF ((x>La) OR (y>Ha))
           THEN Mxy:= Cz
           ELSE BEGIN
                  Inc(Npix);
                  IF Co<556 THEN Mxy:= Cf
                            ELSE IF Co<650 THEN Calc_Cf_1(Larg_Image, Haut_Image,
                                                          x, y, Mxy)
                                           ELSE Calc_Cf_2(Larg_Image, Haut_Image,
                                                          x, y, Mxy)
                END
       END;
     
     PROCEDURE InitMatrIm(Y1: Byte; Code: Word; VAR Ma: Tab_Pix);
       CONST u = 8; C1 = 61; C2 = C1 + 10;
             C_Zero: Pixel = (0, 0, 0);
       VAR k, N_Pixel, Ix, Iy: Z_32; C_Fond: Pixel;
       BEGIN
         Calc_Cf(Code, C_Fond); E(0012);
         k:= 0;                 N_Pixel:= 0;
         FOR Ix:= 1 TO Dim_Max DO
           FOR Iy:= 1 TO Dim_Max DO
             BEGIN
               Inc(k); IF ((k MOD 1000)=0) THEN We(C2, Y1-1, k, u);
               IF (Code=0) THEN Ma[Ix, Iy]:= C_Zero
                           ELSE In_MatrIm_1(Larg_Image, Haut_Image, Ix, Iy,
                                            Code, C_Zero, C_Fond,
                                            N_Pixel, Ma[Ix, Iy])
             END;
         We(C2, Y1-1, k, u);
         E(0010); Wt(C1, Y1,   'La * Ha = '); Write(Prod_LaHa:u);
         IF N_Pixel=0 THEN E(008) ELSE E(0015);
         Wt(C1, Y1+1, 'Npixels = ');          Write(N_Pixel:u)
       END;
     
     PROCEDURE Saisie_Dim_BMP(X1, Y1: Byte; VAR La, Ha, P_LaHa: Z_32);
       CONST Ca = 15; Cb = 114; u = 4;
       VAR X2, X3: Byte; p, q: Z_32; Test: Boolean;
       BEGIN
         X2:= X1 + 53; X3:= X2 - 12;
         E(1010);      F(X1, Y1-2, X2, Y1+2, 1);
         Wt(X1+2, Y1-1, 'Largeur de l''image (La<= ');
         Write(Dim_Max:4, '):   La = ');
         Wt(X1+2, Y1+1, 'Hauteur de l''image (Ha<= ');
         Write(Dim_Max:4, '):   Ha = ');
         REPEAT
           E(Ca); Rz4(X3, Y1-1, p);
           E(Cb); We(X3, Y1-1, p, u); Write (' pixels  ')
         UNTIL p<=Dim_Max;
         REPEAT
           E(Ca); Rz4(X3, Y1+1, q);
           E(Cb); We(X3, Y1+1, q, u); Write (' pixels  ')
         UNTIL q<=Dim_Max;
         La:= p; Ha:= q; P_LaHa:= p * q
       END;
     
     PROCEDURE GraphBmp(Code_Cf: Word);
       BEGIN
         Saisie_Dim_BMP(2, 4, Larg_Image, Haut_Image, Prod_LaHa);
         InitMatrIm(4, Code_Cf, Matr_Image);
         CalcTaille(Larg_Image, Haut_Image, T_Image, T_Fichier);
         Init_Entete(En_Tete);
       END;
     
     
     END.
    @ Jipété : tu pourras retrouver dans le premier fichier deux expressions plus simples des coefficients de couleur. Je n"ai pas oublié le rayonnement visible (si, si, ça va venir ...)

    @ souviron34 Tu as là tous les éléments essentiels du programme; j'ai laissé de côté les instructions de routine, contenues dans d'autres unités. Si tu te sens le courage d'ébaucher un algorithme ayant recours aux pointeurs ...
    Citation Envoyé par souviron34 Voir le message
    ... J'essaierais de remonter la discussion pour remonter le code (à moins que sympathiquement vous ne fournissiez la version actuelle ) et faire la traduction avec les pointeurs ... Ca devrait sans doute, d'après ce que je comprend, accélérer pas mal ...
    Les temps de calcul n'ont à ce stade rien de prohibitif, mais peuvent augmenter considérablement dans le cas par exemple de la représentation d'une fonction U(x, y).
    Merci par avance pour toutes les remarques que tu pourrais livrer sur le sujet.


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

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

    bon je reviens sur du code qui me parais pas coherent

    donc en verifiant le passage de variablr la valeur de t varie entre -1 et 1
    quand je lit le code j'ai un soucis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      IF t>1 THEN u:= t - 2
                ELSE IF t<-1 THEN // ce test est toujours faux .. 
                                             // pour moi il faut faire t=0
                  u:= t + 2
               ELSE u:= t;
    autre petit truc là cest plus estetique voir pour la comprehension

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      IF w>1 THEN w:= 1
          ELSE IF w<0 THEN w:= 0;
    a remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     w := max(min(w,1),0);// on borne w entre o et 1
    dans le calcul de calcMat_002
    je vois que tu refait 3 fois le calcul

    pourquoi ne pas affecter une variable avant la boucle
    genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     PosY := (H1+m) div 2;
       FOR k:= -Lim TO Lim DO
      begin
         ...
        Ma[x,PosY +y]:= ...
        ...
      end;
    voila quelque amelioration a faire
    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. #119
    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
    Bonsoir,

    #
    Citation Envoyé par anapurna Voir le message
    ... donc en verifiant le passage de variablr la valeur de t varie entre -1 et 1
    quand je lit le code j'ai un soucis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      IF t>1 THEN u:= t - 2
                ELSE IF t<-1 THEN // ce test est toujours faux .. 
    Non, parce que les appels
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
                 s:= Coeff_C(r + h); ...
                 s:= Coeff_C(r - h); ... ;
    produisent une sortie de l'intervalle [-1 ; +1] (on a h = 2/3) - c'est justement là qu'intervient la périodicité de la fonction.

    #
    ... autre petit truc là cest plus estetique voir pour la comprehension
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      IF w>1 THEN w:= 1
          ELSE IF w<0 THEN w:= 0;
    a remplacer par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     w := max(min(w,1),0);// on borne w entre o et 1
    Sans doute (je suis maintenant trop fatigué pour vérifier) ... si l'on est familier de ce genre de choses; j'ai déjà dit ce que je pensais des fonctions emboîtées: ce que tu souhaites remplacer a le mérite d'être clair et facilement vérifiable, et ta formule doit de toutes façons effectuer les mêmes opérations - un programme source est fait pour être (re)lu, et l'instruction la plus concise n'est pas forcément souhaitable.

    #
    dans le calcul de calcMat_002
    je vois que tu refait 3 fois le calcul
    Il n'y a plus d'expression de ce type dans le dernier programme envoyé - les graphes ont été supprimés.
    Je n'ai rien retrouvé de tel dans les versions précédentes, et cela m'aurait un peu étonné - mais tout le monde peut se tromper.
    Dans la procédure CalcMat_Im01 l'instruction
    se répète pour chacun des 3 graphes, par la force des choses; la variante que tu indiques ne vient pas de moi.

    PS: ce que tu signales vient sans doute des échanges laborieux qui ont eu lieu auparavant, et qui concernaient des changements de variable.
    Je crois qu'il vaut mieux s'en tenir à la dernière version proposée.


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

  20. #120
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 627
    Points : 10 551
    Points
    10 551
    Par défaut
    Citation Envoyé par wiwaxia Voir le message
    l'instruction la plus concise n'est pas forcément souhaitable.
    Bien si ... mais il faut savoir de quoi on parle

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #define CLAMP_0_1(VALUE) \
    	if (VALUE > 1) { \
    		VALUE = 1; \
    	} else if (VALUE < 0) { \
    		VALUE = 0; \
    	}


    Édit: Et si on travaille avec des entiers non signés, on n'a pas besoin du "test inférieur à zéro"
    Par contre dans ce cas, il faudra sûrement revoir ses algos pour faire des translations pour éviter les intervalles négatifs

Discussions similaires

  1. des couleurs dans la console,comment faire?
    Par rockkornman dans le forum C
    Réponses: 3
    Dernier message: 09/05/2009, 01h01
  2. variable dans un libellé, comment faire ?
    Par chapeau_melon dans le forum WinDev
    Réponses: 2
    Dernier message: 02/02/2008, 00h08
  3. Réponses: 5
    Dernier message: 03/09/2007, 21h36
  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, 23h18
  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, 11h33

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