Main Page Class Hierarchy Compound List File List Compound Members File Members

Spectrum.h

Go to the documentation of this file.
00001 /*
00002 File: Spectrum.h
00003 
00004 Function: Provides classes for manipulating spectra
00005 
00006 Author: Andrew Willmott
00007 
00008 Copyright: (c) 1999-2000, Andrew Willmott
00009 */
00010 
00011 #ifndef __Spectrum__
00012 #define __Spectrum__
00013 
00014 #include "Geometry.h"
00015 #include "Image.h"
00016 
00017  class Spectrum : public Vecf
00018 {
00019 public:
00020 
00021  Spectrum() : Vecf(kComponents)
00022 { MakeZero(); };
00023  Spectrum(const Vecf &v) : Vecf(v)
00024 { Assert(Elts() == kComponents, "bad spectrum"); };
00025  Spectrum(Float k) : Vecf(kComponents)
00026 { MakeBlock(k); };
00027 
00028 Colour ToCIE_XYZ();
00029 
00030  static Int GetNumComponents()
00031 { return(kComponents); };
00032 
00033  static const Int kComponents; // number of (constant) basis functions
00034  static const Float kStart; // start of spectrum
00035  static const Float kEnd; // end of spectrum
00036 };
00037 
00038  class SpectralCurve
00039 {
00040 public:
00041 virtual ~SpectralCurve();
00042 
00043 operator Spectrum();
00044 
00045 virtual Float Sample(Float lambda) const = 0;
00046 // sample curve at wavelength lambda
00047 virtual Float Integral(Float lambda) const;
00048 // return integral of curve from 0 to lambda
00049 virtual Float MaxCmpt() const;
00050 
00051 Void MakeImage(Image &image, ClrReal maxAmplitude = -1.0);
00052 // Plot the spectrum into image.
00053 Colour ToCIE_XYZ();
00054 // map the spectrum to the CIE XYZ colour system
00055 };
00056 
00057  class RegularSpectralCurve : public SpectralCurve
00058 {
00059 public:
00060 RegularSpectralCurve(Float *sdata, Int start, Int end, Int divisions);
00061 ~RegularSpectralCurve();
00062 
00063 Float Sample(Float lambda) const;
00064 // Float Integral(Float lambda) const;
00065 
00066 protected:
00067  Float *data;
00068  Float *accumData;
00069  Int waveDivs;
00070  Float waveStart, waveEnd, waveDelta;
00071 };
00072 
00073  class IrregularSpectralCurve : public SpectralCurve
00074 {
00075 public:
00076 IrregularSpectralCurve();
00077 IrregularSpectralCurve(Float *amps, Float *wavs, Int divs);
00078 ~IrregularSpectralCurve();
00079 
00080 Float Sample(Float lambda) const;
00081 // Float Integral(Float lambda) const;
00082 
00083 IrregularSpectralCurve
00084 &ReadSDFile(FileName filename);
00085 
00086 protected:
00087  Float *amplitudes;
00088  Float *accumAmplitudes;
00089  Float *wavelengths;
00090  Int divisions;
00091 };
00092 
00093 // --- CIE colour matching functions ------------------------------------
00094 
00095  extern RegularSpectralCurve kCIE_xbar;
00096  extern RegularSpectralCurve kCIE_ybar;
00097  extern RegularSpectralCurve kCIE_zbar;
00098 
00099 // --- useful utilities --------------------------------------------------
00100 
00101 Colour WavelengthToXYZ(ClrReal lambda);
00102 
00103  class ChromaticitySpectrum : public SpectralCurve
00104 {
00105 public:
00106 ChromaticitySpectrum(ClrReal x, ClrReal y);
00107 
00108 Float Sample(Float lambda) const;
00109 
00110 protected:
00111  ClrReal M1, M2;
00112 };
00113 
00114  class BlackBodySpectrum : public SpectralCurve
00115 {
00116 public:
00117 BlackBodySpectrum(Float temperature);
00118 
00119 Float Sample(Float lambda) const;
00120 
00121 protected:
00122  Float temp;
00123 };
00124 
00125 Void DrawChromaticityImage(Image &image);
00126 
00127 #endif

Generated at Sat Aug 5 00:17:04 2000 for Graphics Class Library by doxygen 1.1.0 written by Dimitri van Heesch, © 1997-2000

AltStyle によって変換されたページ (->オリジナル) /