Per Antonio Cuni - era: Da Frequenza a RGB
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