AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Licht Simulation RGB in Abhängigkeit der Frequenz
Thema durchsuchen
Ansicht
Themen-Optionen

Licht Simulation RGB in Abhängigkeit der Frequenz

Ein Thema von luisk · begonnen am 16. Jan 2014 · letzter Beitrag vom 16. Jan 2014
Antwort Antwort
Benutzerbild von luisk
luisk

Registriert seit: 18. Mär 2009
402 Beiträge
 
#1

Licht Simulation RGB in Abhängigkeit der Frequenz

  Alt 16. Jan 2014, 07:48
Hallo,
ich will eine Simulation für Lichteffekte programmieren.
Hierzu brächte ich die RGB-Werte in Abhängigkeit der Frequenz.
Gibt es hierzu eine Formel ?

Geändert von luisk (16. Jan 2014 um 07:51 Uhr)
  Mit Zitat antworten Zitat
TiGü

Registriert seit: 6. Apr 2011
Ort: Berlin
3.070 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Licht Simulation RGB in Anhängigkeit der Frequenz

  Alt 16. Jan 2014, 09:43
Es war wohl etwas zu früh am Morgen?!
Erkläre mal genauer, was du vorhast!

Suchst du eine Umrechnung von Lichtwellenlänge in TColor-Werte?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#3

AW: Licht Simulation RGB in Anhängigkeit der Frequenz

  Alt 16. Jan 2014, 10:34
Wohl eher so, wenn ich das richtig verstanden hab:
Frequenz X = Farbe $xxxxxx, so ala ein F in C-Dur = Rot


Mathematik?
R := Frequent *+-/ irgendwas

Und Nein, wir können dir nix wirklich vorschlagen, da wir weder wissen wie die gewünschten Farben/Farbverläufe/Farbbereiche aussehen sollen und in welchem Frequenzbereich das sein soll.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (16. Jan 2014 um 10:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Licht Simulation RGB in Anhängigkeit der Frequenz

  Alt 16. Jan 2014, 10:46
Hier gibt es was dazu (Formeln), dass kannst du dann umsetzen
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.158 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Licht Simulation RGB in Anhängigkeit der Frequenz

  Alt 16. Jan 2014, 13:19
Hier gibt es was dazu (Formeln), dass kannst du dann umsetzen
Interessante und kurz-knackige Lektüre
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Licht Simulation RGB in Anhängigkeit der Frequenz

  Alt 16. Jan 2014, 13:27
Hier mal eine Umsetzung

HINWEIS
System.UITypes wird für die Umwandlung von TRGBFloat in TColor benötigt und ist bei älteren Delphi-Versionen möglicherweise nicht vorhanden.

Delphi-Quellcode:
unit wavecolor;

interface

  uses
    System.UITypes;

  const
    C_LAMBDA_MIN = 380.0;
    C_LAMBDA_MAX = 780.0;
    C_GAMMA_DEF = 0.8;

  type
    TRGBFloat = record
      R : Extended;
      G : Extended;
      B : Extended;
      function ToColorRec : TColorRec;
      function ToColor : TColor;
    end;

    // Umsetzung basiert auf
    // Dan Bruton - Approximate RGB values for Visible Wavelengths
    // http://www.physics.sfasu.edu/astro/color/spectra.html

  function WavelengthToRGB( Lambda : Extended; Gamma : Extended = C_GAMMA_DEF ) : TRGBFloat;

implementation

  uses
    SysUtils,
    Math;

  resourcestring
    C_LAMBDA_OUT_OF_RANGE_ERROR = 'Lambda must be between %f and %f';

  const
    C_LAMBDA_1 = 440.0;
    C_LAMBDA_2 = 490.0;
    C_LAMBDA_3 = 510.0;
    C_LAMBDA_4 = 580.0;
    C_LAMBDA_5 = 645.0;
    C_LAMBDA_F1 = 420.0;
    C_LAMBDA_F2 = 700.0;

  function WavelengthToRGB( Lambda : Extended; Gamma : Extended ) : TRGBFloat;
    var
      LR, LG, LB, LF : Extended;
    begin
      if not InRange( Lambda, C_LAMBDA_MIN, C_LAMBDA_MAX )
      then
        raise EArgumentOutOfRangeException.CreateFmt( C_LAMBDA_OUT_OF_RANGE_ERROR, [C_LAMBDA_MIN, C_LAMBDA_MAX] );

      // ( r', g', b' ) := ( (440-lambda)/(440-380), 0, 1 ) für lambda [380,440[
      // ( r', g', b' ) := ( 0, (lambda-440)/(490-440), 1 ) für lambda [440,490[
      // ( r', g', b' ) := ( 0, 1, (510-lambda)/(510-490) ) für lambda [490,510[
      // ( r', g', b' ) := ( (lambda-510)/(580-510), 1, 0 ) für lambda [510,580[
      // ( r', g', b' ) := ( 1, (645-lambda)/(645-580), 0 ) für lambda [580,645[
      // ( r', g', b' ) := ( 1, 0, 0 ) ____________________ für lambda [645,780]

      if Lambda < C_LAMBDA_1 // [380,440[
      then
        begin
          LR := ( C_LAMBDA_1 - Lambda ) / ( C_LAMBDA_1 - C_LAMBDA_MIN );
          LG := 0;
          LB := 1;
        end
      else if Lambda < C_LAMBDA_2 // [440,490[
      then
        begin
          LR := 0;
          LG := ( Lambda - C_LAMBDA_1 ) / ( C_LAMBDA_2 - C_LAMBDA_1 );
          LB := 1;
        end
      else if Lambda < C_LAMBDA_3 // [490,510[
      then
        begin
          LR := 0;
          LG := 1;
          LB := ( C_LAMBDA_3 - Lambda ) / ( C_LAMBDA_3 - C_LAMBDA_2 );
        end
      else if Lambda < C_LAMBDA_4 // [510,580[
      then
        begin
          LR := ( Lambda - C_LAMBDA_3 ) / ( C_LAMBDA_4 - C_LAMBDA_3 );
          LG := 1;
          LB := 0;
        end
      else if Lambda < C_LAMBDA_5 // [580,645[
      then
        begin
          LR := 1;
          LG := ( C_LAMBDA_5 - Lambda ) / ( C_LAMBDA_5 - C_LAMBDA_4 );
          LB := 0;
        end
      else
        begin // [645,780]
          LR := 1;
          LG := 0;
          LB := 0;
        end;

      // f := 0.3 + 0.7 * (lambda - 380)/(420 - 380) für lambda in [380,420[
      // f := 1 ____________________________________ für lambda in [420,700]
      // f := 0.3 + 0.7 * (780 - lambda)/(780 - 700) für lambda in ]700,780]

      if Lambda < C_LAMBDA_F1 // [380,420[
      then
        begin
          LF := 0.3 + 0.7 * ( Lambda - C_LAMBDA_MIN ) / ( C_LAMBDA_F1 - C_LAMBDA_MIN );
        end
      else if Lambda > C_LAMBDA_F2 // ]700,780]
      then
        begin
          LF := 0.3 + 0.7 * ( C_LAMBDA_MAX - Lambda ) / ( C_LAMBDA_MAX - C_LAMBDA_F2 );
        end
      else // [420,700]
        begin
          LF := 1;
        end;

      // ( r, g, b ) := ( (f * r')^g , (f * g')^g , (f * b')^g )

      Result.R := Power( LF * LR, Gamma );
      Result.G := Power( LF * LG, Gamma );
      Result.B := Power( LF * LB, Gamma );

    end;

  { TRGBFloat }

  function TRGBFloat.ToColor : TColor;
    begin
      Result := ToColorRec.Color;
    end;

  function TRGBFloat.ToColorRec : TColorRec;
    begin
      Result.A := $0;
      Result.R := Round( Self.R * $FF );
      Result.G := Round( Self.G * $FF );
      Result.B := Round( Self.B * $FF );
    end;

end.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von luisk
luisk

Registriert seit: 18. Mär 2009
402 Beiträge
 
#7

AW: Licht Simulation RGB in Anhängigkeit der Frequenz

  Alt 16. Jan 2014, 20:01
Danke für die Infos Sir Rufo - ist genau das, was ich gesucht habe.

Geändert von luisk (16. Jan 2014 um 20:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von luisk
luisk

Registriert seit: 18. Mär 2009
402 Beiträge
 
#8

AW: Licht Simulation RGB in Anhängigkeit der Frequenz

  Alt 16. Jan 2014, 20:11
hier eine weitere Seite für ältere Delphi-Versionen
http://www.efg2.com/Lab/ScienceAndEn...ng/Spectra.htm
mit Delphi-Projekt zum Download.

Läuft auf Anhieb unter Delphi 6.

Geändert von luisk (16. Jan 2014 um 20:14 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:32 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz