Как конфертировать из Color Wavelength в RGB или HSL? - PullRequest
0 голосов
/ 29 июня 2019

Я работаю над проектом, часть которого должна быть переведена с длины волны цвета на 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 

Ну, я никогда не слышал о коде Фортрана, поэтому я не знаю, как он работает. Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 01 июля 2019

Код прост для чтения, если вы знаете, что

.GT. = greater than
.GE. = greater than or equal to
.LT. = less than
.LE. = less than or equal to
1. = 1.000
1.1 = 1.1000
.1 = 0.1000

1.1.GT.1 совпадает с 1.1 > 1. Далее

!this is a comment
IMPLICIT REAL*8 (a-h,o-z) !variables starting with a,b,...h and o,..,z are double scalars
REAL*8 CV(500,500,3) ! this is an array of doubles

Теперь вы пишете JavaScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...