Modèle:Lo vers rvb/algo3

Une page de Wikipédia, l'encyclopédie libre.

 Documentation de la sous-page de modèle[voir] [modifier] [historique] [purger]

Ceci est la documentation du modèle {{Lo vers rvb/algo3}}.

Ce modèle est destiné à être appelé par le modèle {{Lo vers rvb}}, il ne devrait pas être utilisé directement.

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]

  1. a et b pierreontheweb.free.fr/RGB-wavelength/wavelength2RGB.htm