XL 2013 où me trompais-je?

patricktoulon

XLDnaute Barbatruc
Bonjour a tous
je voudrais comprendre ou je me trompe dans le raisonnement et par consequent dans le code
je veux faire un degradé de couleur de la couleur 1 à la couleur 2
j'ai un nombre de pas ici en l'ocurence 20
pour cela je récupère le (R,G,B) des deux couleurs
je calcule le pas de difference pour r g et b en negatif ou positif
et dans une boucle pour les test je colori les celulles de la ligne 1 a nb
en colonne 2 en ligne 1 et nb je met la couleur initiale
j'ai bien compris que si je veux garder mes deux couleurs initiales en ligne 1 et nb le pas je divise par nb-2
et bien j'ai pas mes couleurs tout du moins mon dégradé ne correspond pas à l'intention

heu je souhaiterais garder encore un momment mes cheveux
merci pour les retours

1702312962753.png

VB:
Sub test()
    Dim nb&, C1&, C2&, Cx1, Cx2, Px1&, Px2&, Px3&
   nb = 20
    Cells(1, 1).Resize(nb, 2).Clear
   C1 = vbRed: Cx1 = longToRGB(C1)
    C2 = vbGreen: Cx2 = longToRGB(C2)

    Px1 = Round(-(Cx1(1) - Cx2(1)) / (nb - 2))
    Px2 = Round(-(Cx1(2) - Cx2(2)) / (nb - 2))
    Px3 = Round(-(Cx1(3) - Cx2(3)) / (nb - 2))
   
    For i = 1 To nb
       rp = Cx1(1) + (Px1 * (i))
        gp = Cx1(2) + (Px2 * (i))
        bp = Cx1(3) + (Px3 * (i))
     
      Cells(i, 1).Interior.Color = RGB(Cx1(1) + rp, Cx1(2) + gp, Cx1(3) + bp)
    Next
Cells(1, 2).Interior.Color = C1
Cells(nb, 2).Interior.Color = C2
 

End Sub
Function longToRGB(c)
    Dim t(1 To 3)
    t(1) = c Mod 256
    t(2) = ((c - t(1)) / 256) Mod 256
    t(3) = ((c - t(1) - (t(2) * 256)) / 256 / 256) Mod 256
    longToRGB = t
End Function
 
Solution
par contre là encore une enigme
avec les même calculs tu obtiens un dégradé différent puisque moi au millieur je passe par un jaune
Pourtant j'utilise ton code, simplement corrigé au niveau de la définition des variables, du calcul des Px, et du calcul des rp, gp et bp.



ilo n'y a pas quelque chose qui vous gêne là
C'est la première des trois erreurs que j'ai expliquées en #4. ;)

Dranreb

XLDnaute Barbatruc
Personnellement je privilégie le calcul mathématique portant sur les énergies lumineuses résultant d'une application du stupide gamma d'écran constaté au valeurs de composantes RGB.
Je convertis les valeurs RGB en énergies de 0 à 1000 :
VB:
Private Function EnrgG(ByVal Gris As Double) As Double
   If Gris > GLimite Then EnrgG = (Gris * kEG1 + kEG2) ^ ExGamma Else EnrgG = Gris * FLinéaire
   End Function
Je fais mes calcul et je reconvertis à la fin en valeurs RGB :
Code:
Private Function GrisE(ByVal Enrg As Double) As Double
   If Enrg > ELimite Then GrisE = (Enrg ^ (1 / ExGamma) - kEG2) / kEG1 Else GrisE = Enrg / FLinéaire
   End Function
Avec :
Code:
Const ExGamma = 222841 / 96323, GLimite = 1307 / 151  ' E500: 186,04   E250: 134,93   E125: 97,05   E62,5:68,98
Const kEG1 = 1000 ^ (1 / ExGamma) / (GLimite * (ExGamma - 1) + 255), kEG2 = 1000 ^ (1 / ExGamma) - 255 * kEG1
Const ELimite = (GLimite * kEG1 + kEG2) ^ ExGamma, FLinéaire = ELimite / GLimite
 

patricktoulon

XLDnaute Barbatruc
bon perso
j'ai reussi mon intention
qui etait a savoir faire une fonction gradient lisse sans fusionner les cellules

le principe
une plage de cellule(nimporte la quelle
choix horizontal (rng.columns) ou vertical(rng.rows)
2 couleurs

la fonction devait calculer le nombre de couleurs(pas) selon le sens et donc le nombre de colonne ou de ligne
pour un gradient dur même nombre de couleur(pas) que les colonnes ou lignes
pour un gradient lisse nombre couleurs(pas) même de colonne ou ligne +1

chaque colonne ou ligne sera coloré avec un gradient couleur et couleur suivante
demonstration
 

Statistiques des forums

Discussions
312 207
Messages
2 086 232
Membres
103 161
dernier inscrit
Rogombe bryan