Per Antonio Cuni - era: Da Frequenza a RGB

From: JWorld <nospam_at_nospam.it>
Date: Tue, 12 Jun 2001 23:41:34 +0200

Ciao Antonio,
La tua richiesta mi ha incuriosito cos� ho scritto questo codice (visual
basic che non dovresti avere problemi a convertire in C++):

La funzione converte la lunghezza d'onda in valori rgb utilizzando i valori
provenienti dalle gaussiane dei tre colori fondamentali. Purtroppo il
risultato � solo empirico (mi dispiace) ma � possibile modificare il valori
F (fattore di allargamento delle gaussiane default 0,02) e le lunghezze
d'onda sulle quali sono centrate le gaussiane dei colori fondamentali
(nell'esempio 660 per il rosso, 550 per il verde e 460 per il blu). con
questi valori mi viene un bel arcobaleno.


Option Explicit
Public Function WL2RGB(WaveLenght As Integer, Optional f As Double = 0.02)
As Long
    Dim r As Integer
    Dim g As Integer
    Dim b As Integer
    Dim Mult As Double

    Mult = 255 / Gaussian(f, 0)

    r = Mult * Gaussian(f, WaveLenght - 660)
    g = Mult * Gaussian(f, WaveLenght - 550)
    b = Mult * Gaussian(f, WaveLenght - 460)

    If r < 0 Then r = 0
    If r > 255 Then r = 255

    If g < 0 Then g = 0
    If g > 255 Then g = 255

    If b < 0 Then b = 0
    If b > 255 Then b = 255

    WL2RGB = rgb(r, g, b)

End Function

Public Function Gaussian(w As Double, x As Double) As Double
       Gaussian = (w ^ -0.5) * Exp(-(x / 2 * w) ^ 2)
End Function


per testare la funzione puoi crearti un form, metterci un pulsante
(Command1) e una vertical scrollbar (VScroll1) e poi copiarci dentro il
seguente codice:


Dim factor As Double
Private Sub Command1_Click()
   Dim min As Integer
   Dim max As Integer
   Dim n As Integer
   Dim j As Integer
   Dim c As Long
   Dim mul As Integer
   mul = 2
   min = 380
   max = 780
   n = mul * (max - min)
   For j = 0 To n
     c = WL2RGB(min + (j / mul), factor)
     Me.Line (j + 10, 200)-(j + 10, 300), c
   Next j

End Sub

Private Sub Form_Load()
  factor = 0.02
  Me.ScaleMode = 3
  VScroll1.max = 100
End Sub

Private Sub VScroll1_Scroll()
    factor = 0.01 + 0.2 * (VScroll1.Value / VScroll1.max)
    Me.Caption = "Fattore: " & CStr(factor)
   Command1_Click
End Sub


buon divertimento!

JW
Received on Tue Jun 12 2001 - 23:41:34 CEST

This archive was generated by hypermail 2.3.0 : Sat Jan 04 2025 - 04:23:44 CET