Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Licht Simulation RGB in Abhängigkeit der Frequenz (https://www.delphipraxis.net/178582-licht-simulation-rgb-abhaengigkeit-der-frequenz.html)

luisk 16. Jan 2014 06:48

Licht Simulation RGB in Abhängigkeit der Frequenz
 
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 ?

TiGü 16. Jan 2014 08:43

AW: Licht Simulation RGB in Anhängigkeit der Frequenz
 
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?

himitsu 16. Jan 2014 09:34

AW: Licht Simulation RGB in Anhängigkeit der Frequenz
 
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.

Sir Rufo 16. Jan 2014 09:46

AW: Licht Simulation RGB in Anhängigkeit der Frequenz
 
Hier gibt es was dazu (Formeln), dass kannst du dann umsetzen

Der schöne Günther 16. Jan 2014 12:19

AW: Licht Simulation RGB in Anhängigkeit der Frequenz
 
Zitat:

Zitat von Sir Rufo (Beitrag 1243919)
Hier gibt es was dazu (Formeln), dass kannst du dann umsetzen

Interessante und kurz-knackige Lektüre :thumb:

Sir Rufo 16. Jan 2014 12:27

AW: Licht Simulation RGB in Anhängigkeit der Frequenz
 
Hier mal eine Umsetzung

HINWEIS
Delphi-Quellcode:
System.UITypes
wird für die Umwandlung von
Delphi-Quellcode:
TRGBFloat
in
Delphi-Quellcode:
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.

luisk 16. Jan 2014 19:01

AW: Licht Simulation RGB in Anhängigkeit der Frequenz
 
Danke für die Infos Sir Rufo - ist genau das, was ich gesucht habe.

luisk 16. Jan 2014 19:11

AW: Licht Simulation RGB in Anhängigkeit der Frequenz
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:53 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz