Reklama
Pokazuje wyniki od 1 do 9 z 9

Temat: dlugosc fali elektromagnetycznej a kolor RGB /C++

  1. #1
    Avatar Shaolineq
    Data rejestracji
    2008
    Posty
    234
    Siła reputacji
    16

    Domyślny dlugosc fali elektromagnetycznej a kolor RGB /C++

    potrzebuje jak najprostszy kod do programu w c++ ktory obliczalby skladowe RGB na podstawie podanej przez uzytkownika dlugosci fali w nanometrach

    http://darekk.com/kalkulator/wavelength-to-rgb takie cos jak tu tylko ze na samych liczbach, bez wizualizacji

    nie wiem czy ten kod dziala ale jest w C ktorego nie znam
    [to nie jest C, tylko jakis pascal - gray]
    Kod:
    PROCEDURE WavelengthToRGB(CONST Wavelength:  Nanometers;
                              VAR R,G,B:  BYTE);
      CONST
        Gamma        =   0.80;
        IntensityMax = 255;
      VAR
        Blue   :  DOUBLE;
        factor :  DOUBLE;
        Green  :  DOUBLE;
        Red    :  DOUBLE;
      FUNCTION Adjust(CONST Color, Factor:  DOUBLE):  INTEGER;
      BEGIN
        IF   Color = 0.0
        THEN RESULT := 0     // Don't want 0^x = 1 for x <> 0
        ELSE RESULT := ROUND(IntensityMax * Power(Color * Factor, Gamma))
      END {Adjust};
    BEGIN
      CASE TRUNC(Wavelength) OF
        380..439:
          BEGIN
            Red   := -(Wavelength - 440) / (440 - 380);
            Green := 0.0;
            Blue  := 1.0
          END;
        440..489:
          BEGIN
            Red   := 0.0;
            Green := (Wavelength - 440) / (490 - 440);
            Blue  := 1.0
          END;
        490..509:
          BEGIN
            Red   := 0.0;
            Green := 1.0;
            Blue  := -(Wavelength - 510) / (510 - 490)
          END;
        510..579:
          BEGIN
            Red   := (Wavelength - 510) / (580 - 510);
            Green := 1.0;
            Blue  := 0.0
          END;
        580..644:
          BEGIN
            Red   := 1.0;
            Green := -(Wavelength - 645) / (645 - 580);
            Blue  := 0.0
          END;
        645..780:
          BEGIN
            Red   := 1.0;
            Green := 0.0;
            Blue  := 0.0
          END;
        ELSE
          Red   := 0.0;
          Green := 0.0;
          Blue  := 0.0
      END;
      // Let the intensity fall off near the vision limits
      CASE TRUNC(Wavelength) OF
        380..419:  factor := 0.3 + 0.7*(Wavelength - 380) / (420 - 380);
        420..700:  factor := 1.0;
        701..780:  factor := 0.3 + 0.7*(780 - Wavelength) / (780 - 700)
        ELSE       factor := 0.0
      END;
      R := Adjust(Red,   Factor);
      G := Adjust(Green, Factor);
      B := Adjust(Blue,  Factor)
    END {WavelengthToRGB};
    Ostatnio zmieniony przez Gray : 10-02-2012, 07:02

  2. #2

    Notoryczny Miotacz Postów Visher jest teraz offline
    Avatar Visher
    Data rejestracji
    2009
    Położenie
    Stalowa Wola.
    Posty
    1,253
    Siła reputacji
    16

    Domyślny

    W źródłach strony masz kod javascript, na c++ łatwo go przerobić.
    Kod:
    <script language="JavaScript" type="text/javascript"> //<![CDATA[
    
    
    // http://www.efg2.com/Lab/ScienceAndEngineering/Spectra.htm
    // http://www.midnightkite.com/color.html
    // http://www.philiplaven.com/p19.html
    
    
    var Wavelength
    
    
    function WavelengthToRGB(Wavelength, hex) {
    
    
        var Red;
        var Green;
        var Blue;
    
    
        if (Wavelength >= 380 && Wavelength <= 439) {
            Red = -(Wavelength - 440) / (440 - 380);
            Green = 0.0;
            Blue = 1.0;
        } else if (Wavelength >= 440 && Wavelength <= 489) {
            Red = 0.0;
            Green = (Wavelength - 440) / (490 - 440);
            Blue = 1.0;
        } else if (Wavelength >= 490 && Wavelength <= 509) {
            Red = 0.0;
            Green = 1.0;
            Blue = -(Wavelength - 510) / (510 - 490);
        } else if (Wavelength >= 510 && Wavelength <= 579) {
            Red = (Wavelength - 510) / (580 - 510);
            Green = 1.0;
            Blue = 0.0;
        } else if (Wavelength >= 580 && Wavelength <= 644) {
            Red = 1.0;
            Green = -(Wavelength - 645) / (645 - 580);
            Blue = 0.0;
        } else if (Wavelength >= 645 && Wavelength <= 780) {
            Red = 1.0;
            Green = 0.0;
            Blue = 0.0;
        } else {
            Red = 0.0;
            Green = 0.0;
            Blue = 0.0;
        }
    
    
        if (Wavelength >= 380 && Wavelength <= 419) {
            factor = 0.3 + 0.7*(Wavelength - 380) / (420 - 380);
        } else if (Wavelength >= 420 && Wavelength <= 700) {
            factor = 1.0;
        } else if (Wavelength >= 701 && Wavelength <= 780) {
            factor = 0.3 + 0.7*(780 - Wavelength) / (780 - 700);
        } else {
            factor= 0.0;
        }
    
    
        var R = Adjust(Red, factor);
        var G = Adjust(Green, factor);
        var B = Adjust(Blue, factor);
    
    
        if (hex == null)
            return ['rgb(' + R + ', ' + G + ', ' + B + ')', null]
        else
            return ['rgb(' + R + ', ' + G + ', ' + B + ')', decToHex(R) + decToHex(G) + decToHex(B)];
    
    
    }
    
    
    function namalujSpektrum(Wavelength) {
    
    
        var styl = '';
        var di = 1;
        for (i = 380; i < 781; i += di) {
            styl = styl + '<SPAN style="width: ' + di + 'px; background-color: ' + WavelengthToRGB(i)[0] + ';" onClick="getColor(' + i + ');">&nbsp;</SPAN>';
        }
        document.getElementById("spectrum").innerHTML = styl;
    
    
    }
    
    
    function zaznacz(Wavelength) {
    
    
        var di = 1;
        var styl = '';
        if (Wavelength >= 380 && Wavelength <= 780)
            styl = '<SPAN style="width: ' + (Math.floor(Wavelength / di) * di - 380) + 'px;">&nbsp;</SPAN><SPAN style="width: ' + di + 'px; background-color: ' + WavelengthToRGB(Wavelength)[0] + ';">&nbsp;</SPAN>';
        document.getElementById("spectrum2").innerHTML = styl;
    
    
    }
    
    
    function pomaluj(x) {
    
    
        if (x == null) document.getElementById("lambda").value = 550;
        Wavelength = document.getElementById("lambda").value;
        var kolor = new Array();
        kolor = WavelengthToRGB(Wavelength, true);
    
    
        document.getElementById("tablica").style.backgroundColor = kolor[0];
        document.getElementById("podpis").innerHTML = kolor[0] + ' &nbsp;&nbsp;&nbsp;hex: #' + kolor[1];
    
    
        if (x == null) namalujSpektrum(Wavelength);
        zaznacz(Wavelength);
    
    
    }
    
    
    function Adjust(Color, Factor) {
    
    
        var Gamma = 0.80;
        var IntensityMax = 255;
    
    
        if (Color == 0.0) return 0
        else return Math.round(IntensityMax * Math.pow(Color * Factor, Gamma));
    
    
    }
    
    
    function getColor(i) {
    
    
        Wavelength = i;
        document.getElementById("lambda").value = Wavelength;
        pomaluj(true);
    
    
    }
    
    
    function decToHex(x) {
        var hex = Number(x).toString(16);
        hex = "00".substr(0, 2 - hex.length) + hex;
        return hex;
    }
    
    
    //]]>
    </script>

  3. Reklama
  4. #3

    Data rejestracji
    2010
    Położenie
    Aͦͯ͐̾͐ͦ̋̽́̎̀͗̌͡͏̸&#7
    Posty
    2,138
    Siła reputacji
    15

    Domyślny

    Kod:
    #include <cstdlib>
    #include <iostream>
    #include <math.h>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        float R,G,B;
        float Red;
        float Green;
        float Blue;
        float Wavelength;
        cin>>Wavelength;
    
        if (Wavelength >= 380 && Wavelength <= 439) {
            Red = -(Wavelength - 440) / (440 - 380);
            Green = 0.0;
            Blue = 1.0;
        } else if (Wavelength >= 440 && Wavelength <= 489) {
            Red = 0.0;
            Green = (Wavelength - 440) / (490 - 440);
            Blue = 1.0;
        } else if (Wavelength >= 490 && Wavelength <= 509) {
            Red = 0.0;
            Green = 1.0;
            Blue = -(Wavelength - 510) / (510 - 490);
        } else if (Wavelength >= 510 && Wavelength <= 579) {
            Red = (Wavelength - 510) / (580 - 510);
            Green = 1.0;
            Blue = 0.0;
        } else if (Wavelength >= 580 && Wavelength <= 644) {
            Red = 1.0;
            Green = -(Wavelength - 645) / (645 - 580);
            Blue = 0.0;
        } else if (Wavelength >= 645 && Wavelength <= 780) {
            Red = 1.0;
            Green = 0.0;
            Blue = 0.0;
        } else {
            Red = 0.0;
            Green = 0.0;
            Blue = 0.0;
        }
        float factor;
    
        if (Wavelength >= 380 && Wavelength <= 419) {
            factor = 0.3 + 0.7*(Wavelength - 380) / (420 - 380);
        } else if (Wavelength >= 420 && Wavelength <= 700) {
            factor = 1.0;
        } else if (Wavelength >= 701 && Wavelength <= 780) {
            factor = 0.3 + 0.7*(780 - Wavelength) / (780 - 700);
        } else {
            factor= 0.0;
        }
        float gamma = 0.80;
        float max=255;
        if(Red==0){R=0;} else{R=round(max*pow(Red * factor, gamma));}
        if(Green==0){G=0;} else{G=round(max*pow(Green * factor, gamma));}
        if(Blue==0){B=0;} else{B=round(max*pow(Blue * factor, gamma));}
        cout<<"R: "<<R<<"\nG: "<<G<<"\nB: "<<B<<endl;
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    premium na miecha, ktxhbye

  5. #4
    Avatar Shaolineq
    Data rejestracji
    2008
    Posty
    234
    Siła reputacji
    16

    Domyślny

    @niemoralny dzieki :)

  6. #5

  7. #6
    Avatar Taidio
    Data rejestracji
    2009
    Położenie
    Sayonara
    Wiek
    29
    Posty
    21,021
    Siła reputacji
    29

    Domyślny

    hello world

  8. #7
    Avatar Lord
    Data rejestracji
    2012
    Położenie
    benzyna po 5,19 mordo xDDDD
    Wiek
    29
    Posty
    10,445
    Siła reputacji
    18

    Domyślny


  9. #8

    ⬛★ Użytkownik TORG VIP ★⬛ rosen jest teraz offline
    Avatar rosen
    Data rejestracji
    2014
    Wiek
    55
    Posty
    2,196
    Siła reputacji
    11

    Domyślny

    tu w Python

    Kod:
    import math
    
    Wavelength = float(input())
    
    if Wavelength >= 380 and Wavelength <= 439:
        Red = -(Wavelength - 440) / (440 - 380)
        Green = 0.0
        Blue = 1.0
    elif Wavelength >= 440 and Wavelength <= 489:
        Red = 0.0
        Green = (Wavelength - 440) / (490 - 440)
        Blue = 1.0
    elif Wavelength >= 490 and Wavelength <= 509:
        Red = 0.0
        Green = 1.0
        Blue = -(Wavelength - 510) / (510 - 490)
    elif Wavelength >= 510 and Wavelength <= 579:
        Red = (Wavelength - 510) / (580 - 510)
        Green = 1.0
        Blue = 0.0
    elif Wavelength >= 580 and Wavelength <= 644:
        Red = 1.0
        Green = -(Wavelength - 645) / (645 - 580)
        Blue = 0.0
    elif Wavelength >= 645 and Wavelength <= 780:
        Red = 1.0
        Green = 0.0
        Blue = 0.0
    else:
        Red = 0.0
        Green = 0.0
        Blue = 0.0
    
    if Wavelength >= 380 and Wavelength <= 419:
        factor = 0.3 + 0.7 * (Wavelength - 380) / (420 - 380)
    elif Wavelength >= 420 and Wavelength <= 700:
        factor = 1.0
    elif Wavelength >= 701 and Wavelength <= 780:
        factor = 0.3 + 0.7 * (780 - Wavelength) / (780 - 700)
    else:
        factor = 0.0
    
    gamma = 0.80
    maximum = 255
    
    R = 0 if Red == 0 else round(maximum * math.pow(Red * factor, gamma))
    G = 0 if Green == 0 else round(maximum * math.pow(Green * factor, gamma))
    B = 0 if Blue == 0 else round(maximum * math.pow(Blue * factor, gamma))
    
    print(f"R: {R}\nG: {G}\nB: {B}")

  10. #9
    Avatar Pumpkin
    Data rejestracji
    2010
    Posty
    3,039
    Siła reputacji
    16

    Domyślny

    ale kiedyś byliśmy mądrzy
    Cytuj wampiirr napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    Leki które aktualnie mają wartość 200zł, po refundacji płacimy 50 zł, a za Korwina będą kosztowały 10zł. Bardziej tak

    Cytuj wampiirr napisał Pokaż post
    Cytat został ukryty, ponieważ ignorujesz tego użytkownika. Pokaż cytat.
    (...)bo był honorowym rycerzem w porównaniu do tego gościa, który oddał bez walki zamek.

Reklama

Informacje o temacie

Użytkownicy przeglądający temat

Aktualnie 1 użytkowników przegląda ten temat. (0 użytkowników i 1 gości)

Podobne tematy

  1. 170EK - gdzie expić podczas fali botów
    Przez Wojtasman w dziale Tibia
    Odpowiedzi: 4
    Ostatni post: 28-07-2014, 17:51
  2. #Twój prawdziwy kolor.
    Przez Don Corleone w dziale Niusy
    Odpowiedzi: 25
    Ostatni post: 21-02-2012, 16:44
  3. Postacie usuniete po masowej fali banow!
    Przez Bartloo w dziale Tibia
    Odpowiedzi: 17
    Ostatni post: 26-01-2010, 11:42

Zakładki

Zakładki

Zasady postowania

  • Nie możesz pisać nowych tematów
  • Nie możesz pisać postów
  • Nie możesz używać załączników
  • Nie możesz edytować swoich postów
  •