Я работаю над проектом, часть которого должна быть переведена с длины волны цвета на RGB / HSL / HSV (любой из них), поэтому я нашел эту страницу: http://www.physics.sfasu.edu/astro/color/spectra.html и я вроде это понимаю, но Мне нужно это как функция Javascript.
Я пытался сделать простую шкалу между значением оттенка и длиной волны, но это не правильно. Дело в том, что код, который я нашел, был сделан на Фортране:
RGB-значения для видимых волнений, автор Дэн Брутон (astro@tamu.edu)
Эту программу можно найти на
http://www.physics.sfasu.edu/astro/color.html
и последний раз обновлялся 20 февраля 1996 г.
Эта программа создаст ppm (переносимое растровое изображение) изображение спектра.
Спектр генерируется с использованием приблизительных значений RGB для видимого
длины волн от 380 нм до 780 нм.
Ppmtogif NetPBM может быть использован для преобразования изображения в ppm
в подарок. Красные, зеленые и синие значения (RGB)
предполагается, что линейно изменяется в зависимости от длины волны (для GAMMA = 1).
Программное обеспечение NetPBM: ftp: //ftp.cs.ubc.ca/ftp/archive/netpbm/
IMPLICIT REAL*8 (a-h,o-z)
REAL*8 CV(500,500,3)
ИНФОРМАЦИЯ ОБ ИЗОБРАЖЕНИИ - ШИРИНА, ВЫСОТА, ГЛУБИНА, ГАММА
M=400
N=50
MAX=255
GAMMA=.80
ЗАПИСЬ ВЫХОДА В ФАЙЛ PPM
OPEN(UNIT=20,FILE='temp.ppm',STATUS='UNKNOWN')
FORMAT(A10)
WRITE(20,1) 'P3 '
WRITE(20,1) '# temp.ppm'
WRITE(20,*) M,N
WRITE(20,*) MAX
DO J=1,N
DO I=1,M
WAVELENGTH = WL
WL = 380. + REAL(I * 400. / M)
IF ((WL.GE.380.).AND.(WL.LE.440.)) THEN
R = -1.*(WL-440.)/(440.-380.)
G = 0.
B = 1.
ENDIF
IF ((WL.GE.440.).AND.(WL.LE.490.)) THEN
R = 0.
G = (WL-440.)/(490.-440.)
B = 1.
ENDIF
IF ((WL.GE.490.).AND.(WL.LE.510.)) THEN
R = 0.
G = 1.
B = -1.*(WL-510.)/(510.-490.)
ENDIF
IF ((WL.GE.510.).AND.(WL.LE.580.)) THEN
R = (WL-510.)/(580.-510.)
G = 1.
B = 0.
ENDIF
IF ((WL.GE.580.).AND.(WL.LE.645.)) THEN
R = 1.
G = -1.*(WL-645.)/(645.-580.)
B = 0.
ENDIF
IF ((WL.GE.645.).AND.(WL.LE.780.)) THEN
R = 1.
G = 0.
B = 0.
ENDIF
ОТКЛЮЧИТЕ ИНТЕНСИВНОСТЬ SSS ОТКЛЮЧИТЬСЯ ОГРАНИЧЕНИЯ ВИДЕНИЯ
IF (WL.GT.700.) THEN
SSS=.3+.7* (780.-WL)/(780.-700.)
ELSE IF (WL.LT.420.) THEN
SSS=.3+.7*(WL-380.)/(420.-380.)
ELSE
SSS=1.
ENDIF
ГАММА-РЕГУЛИРОВКА И ЗАПИСЬ ИЗОБРАЖЕНИЯ В Массив
CV(I,J,1)=(SSS*R)**GAMMA
CV(I,J,2)=(SSS*G)**GAMMA
CV(I,J,3)=(SSS*B)**GAMMA
ENDDO
ENDDO
НАПИСАТЬ ИЗОБРАЖЕНИЕ В ФАЙЛ PPM
DO J=1,N
DO I=1,M
WL = 380. + REAL(I * 400. / M)
IR=INT(MAX*CV(I,J,1))
IG=INT(MAX*CV(I,J,2))
IB=INT(MAX*CV(I,J,3))
ITYPE=1 - PLAIN SPECTUM
ITYPE=2 - MARK SPECTRUM AT 100 nm INTEVALS
ITYPE=3 - HYDROGEN BALMER EMISSION SPECTRA
ITYPE=4 - HYDROGEN BALMER ABSORPTION SPECTRA
ITYPE=4
IF (ITYPE.EQ.2) THEN
DO K=400,700,100
IF ((ABS(INT(WL)-K).LT.1).AND.(J.LE.20)) THEN
IR=MAX
IG=MAX
IB=MAX
ENDIF
ENDDO
ELSEIF (ITYPE.EQ.3) THEN
IF ((ABS(WL-656.).GT.1.).and.(ABS(WL-486.).GT.1.).and.
* (ABS(WL-433.).GT.1.).and.(ABS(WL-410.).GT.1.)
* .AND.(ABS(WL-396.).GT.1.)) THEN
IR = 0
IG = 0
IB = 0
ENDIF
ELSEIF (ITYPE.EQ.4) THEN
IF ((ABS(WL-656.).LT.1.1).or.(ABS(WL-486.).LT.1.1).or.
* (ABS(WL-433.).LT.1.1).or.(ABS(WL-410.).LT.1.1)
* .or.(ABS(WL-396.).LT.1.1)) THEN
IR = 0
IG = 0
IB = 0
ENDIF
ENDIF
WRITE(20,*) IR, IG, IB
ENDDO
ENDDO
STOP
END
Ну, я никогда не слышал о коде Фортрана, поэтому я не знаю, как он работает. Кто-нибудь может мне помочь?