Modèle:Lo vers rvb/algo3/Documentation
Apparence
-
Description 1
-
Description 2
Implémentation
[modifier le code]Ce modèle (à l'essai) se base sur une interpolation linéaire par pas de 10 nm, à partir de valeurs ad hoc.
Limitations connues:
- Les valeurs en dehors de la plage 370 770 ne sont pas gérées
- Certaines valeurs R V B vont au delà de 255 pour une raison incompréhensible:
- Peut-être que les valeurs ne sont pas bonne, par exemple s'ils'agit de valeurs XYZ à la place de valeurs RVB...
- Si c'est le cas, il faudrait trouver des tables RVB (toujours le même problème).
- et remplacer les XBAR, YBAR, ZBAR, par tableR, tableV, tableB...
- Il faudrait donc envisager de retoucher le script python, pour prendre en compte SRGB#Conversions_et_transformations_sRVB_et_CIEs.
- Des espaces peuvent apparaître entre R, V et B, et rendre le code couleur HTML non fonctionnel.
Génération
[modifier le code]L'algorithme a été généré par script python3.
Le script de génération est disponible ci-après:
#!/usr/bin/python
# coding=utf-8
#SUBROUTINE CIE (REFL, X,Y,BIGY)
#C
#C INPUT IS SPECTRAL REFLECTANCE TABLE (REFL);
#C
#C RETURNS VALUES OF CIE CHROMATICITY COORDINATES (X, Y)
#C AND VISUAL REFLECTANCE (BIGY) FOR ILLUMINANT C.
#C
#C REFLECTANCE DATA ARE STORED AT 10 NM INTERVALS, WITH
#C REFL(1) = REFLECTANCE AT 380 NM, AND
#C REFL(40) = REFLECTANCE AT 770 NM.
#C
#DIMENSION XBAR(40),YBAR(40),ZBAR(40),REFL(40)
#C
#C WEIGHTS INCLUDE ILLUMINANT C; SEE TABLE I(3.3.8) OF
#C WYSZECKI & STILES (1982), P.768.
XBAR=(.004,.019,.085,.329,1.238,2.997,3.975,3.915,3.362,
2.272,1.112,.363,.052,.089,.576,1.523,2.785,4.282,5.88,7.322,
8.417,8.984,8.949,8.325,7.07,5.309,3.693,2.349,1.361,.708,
.369,.171,.082,.039,.019,.008,.004,.002,.001,.001)
YBAR=(.0,.0,.002,.009,.037,.122,.262,.443,.694,1.058,1.618,
2.358,3.401,4.833,6.462,7.934,9.149,9.832,9.841,9.147,7.992,
6.627,5.316,4.176,3.153,2.19,1.443,.886,.504,.259,.134,.062,
.029,.014,.006,.003,.002,.001,.001,0.)
ZBAR=(.02,.089,.404,1.57,5.949,14.628,19.938,20.638,19.299,
14.972,9.461,5.274,2.864,1.52,.712,.388,.195,.086,.039,.02,
.016,.01,.007,.002,.002,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,
0.,0.,0.)
# FIXME: A préciser...
facteur = 1/25
# Coversion des valeurs x, y, z en RVB.
r_bar = [ max(0, facteur * ( 3.2406 * XBAR[i] - 1.5372 * YBAR[i] -0.4986 * ZBAR[i])) for i in range (0,40) ]
v_bar = [ max(0, facteur * ( -0.9689 * XBAR[i] + 1.8758 * YBAR[i] +0.0415 * ZBAR[i])) for i in range (0,40) ]
b_bar = [ max(0, facteur * ( 0.0557 * XBAR[i] - 0.2040 * YBAR[i] +1.0570 * ZBAR[i])) for i in range (0,40) ]
print (XBAR, YBAR)
# Interpolation linéaire d'un segment
def interpolation_droite ( debut, fin, val1, val2):
return u"255 * ( " + str(val1) + " + ( ({{{1|0}}}-"+str(debut)+")/("+str(fin)+"-"+str(debut)+") * (" + str (val2-val1) + ") ) ) * {{{2|1}}} "
# Création du wikicode d'interpolation RVB d'un segment sur un pas de 10 nanomètres
def interpolation_rvb (i, index ):
λ = 370+10*i
debut = 370+10*i
fin = 370+10*(i+1)
print (("| " + str(index) + "=<!-- " + str( debut ) + " < λ < " + str( fin ) + "\n" ), end='')
print (("-->&" + "#35;<!--" + "\n" + "-->") , end='')
print (("{{Hexadécimal_sans_span|{{#expr: " + interpolation_droite(debut, fin, r_bar[i], r_bar[i+1] ) + " }} |no }}<!-- R \n-->"), end='')
print (("{{Hexadécimal_sans_span|{{#expr: " + interpolation_droite(debut, fin, v_bar[i], v_bar[i+1] ) + " }} |no }}<!-- V \n-->"), end='')
print (("{{Hexadécimal_sans_span|{{#expr: " + interpolation_droite(debut, fin, b_bar[i], b_bar[i+1] ) + " }} |no }}<!-- B \n-->"), end='')
# Boucle principale
for i in range (0,39):
λ = 370+10*i
#print (λ, XBAR[i], YBAR[i], ZBAR[i])
index = 1 + i #FIXME
a = i %5
b = (i//5) %5
c = (i//25) %5
#print (c, b, a)
if a == 0:
λ = λ +10
print ( "{{#switch: {{Quel intervalle|{{{1|}}}|"+str(λ)+"|"+str(λ+10)+"|"+str(λ+20)+"|"+str(λ+30)+"|"+str(λ+40)+"}}" , end='')
#print(i, a)
interpolation_rvb(i, a)
if a == 4:
#print ("<!- fin du switch--> " ,)
print ("| #default = " ,end='')
# Fermeture des instructions switch ouvertes
for repetition in range (0,40//5):
print ("}}<!-- -->", end='')
Exemples
[modifier le code]Utilisation
[modifier le code]Longueur d'onde de 400nm
{{Lo vers rvb/algo3|400|1}}
Résultat : #020011
Longueur d'onde de 500nm
{{Lo vers rvb/algo3|500|1}}
Résultat : #005C06
Longueur d'onde de 650nm
{{Lo vers rvb/algo3|650|1}}
Résultat : #250000
Test du dégradé et de la continuité
[modifier le code]Exemple | Référence [1] | Ce modèle... | Longueur d'onde en nanomètres |
---|---|---|---|
#030D6B | #6E00A5 | 400 | 400 |
#00ff7f | #00ff80 | 500 | 500 |
#FA1105 | #ff0000 | 650 | 650 |
400 | 400 | ||
433 | 433 | ||
466 | 466 | ||
500 | 500 | ||
533 | 533 | ||
566 | 566 | ||
600 | 600 | ||
633 | 633 | ||
666 | 666 | ||
700 | 700 | ||
733 | 733 | ||
400 | 400 | ||
433 | 433 | ||
466 | 466 | ||
500 | 500 | ||
533 | 533 | ||
566 | 566 | ||
600 | 600 | ||
633 | 633 | ||
666 | 666 | ||
700 | 700 | ||
733 | 733 |
500 | 510 | 520 | 530 | 540 | ||||||||||||
540 | 550 | 560 | 570 | 580 | ||||||||||||
580 | 590 | 600 | 610 | 620 | ||||||||||||
620 | 630 | 640 | 650 | 660 |
Dégradé fin
[modifier le code]Test du modèle, en utilisant le modèle Modèle:Lo vers rvb/Démo dégradé pour créer des tableaux de dégradés sur la plage 400 à 700 nm.
Nom de l'exemple avec 16 pas pour 50nm | Première couleur | 2 | 3 | ||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
400 | 403 | 406 | 409 | 413 | 416 | 419 | 422 | 425 | 428 | 431 | 434 | 438 | 441 | 444 | 447 | 450 | |
Premier dégradé bleuatre | 450 | 453 | 456 | 459 | 463 | 466 | 469 | 472 | 475 | 478 | 481 | 484 | 488 | 491 | 494 | 497 | 500 |
Deuxième dégradé verdatre | 500 | 503 | 506 | 509 | 513 | 516 | 519 | 522 | 525 | 528 | 531 | 534 | 538 | 541 | 544 | 547 | 550 |
Troisième dégradé chaleureux | 550 | 553 | 556 | 559 | 563 | 566 | 569 | 572 | 575 | 578 | 581 | 584 | 588 | 591 | 594 | 597 | 600 |
Quatrième dégradé rougeatre | 600 | 603 | 606 | 609 | 613 | 616 | 619 | 622 | 625 | 628 | 631 | 634 | 638 | 641 | 644 | 647 | 650 |
650 | 653 | 656 | 659 | 663 | 666 | 669 | 672 | 675 | 678 | 681 | 684 | 688 | 691 | 694 | 697 | 700 |
Tests unitaires
[modifier le code]Modèle:Lo vers rvb
[modifier le code]Paramètre | Résultat | Attendu [1] | Statut |
---|---|---|---|
300|1 | #N/A00N/A | #000000 | Échec |
400|1 | #020011 | #6E00A5 | Échec |
430|1 | #1900D8 | 1 | Échec |
450|1 | #0200D0 | 1 | Échec |
500|1 | #005C06 | #00ff80 | Échec |
550|1 | #278200 | 3 | Échec |
600|1 | #D10000 | 2 | Échec |
650|1 | #250000 | #ff0000 | Échec |
700|1 | #010000 | #000000 | Échec |
750|1 | #000000 | #000000 | Succès |
800|1 | #000000 | Échec |
Références
[modifier le code]- pierreontheweb.free.fr/RGB-wavelength/wavelength2RGB.htm