タイトルの通りです。
波長に対する光のスペクトラムの絵をきれいに描きたいです。
どうすればよいでしょうか?
現時点での僕の解
こんな感じでいかがでしょうか?
では早速この描き方を示します。
- R、G、Bの波長を調べます。CIE(国際照明委員会)によって、それぞれ700nm、546.1nm、435.8nmと決められています
- HSV色空間において、R、G、Bの色相(Hue)を調べます。それぞれ0°、120°、240°です
- 波長をX軸、色相をY軸として、この3点をExcelでプロットします。すなわち、(700, 0), (546.1, 120), (435.8, 240)の点です
- このプロットを二次曲線で近似します。すると、
が得られます
- 436 [nm]~700 [nm]を定義域として、1 [nm]ごとに色相の値を得ます
- 5.で求めた色相について、彩度(Saturation)と明度(Value)をそれぞれ100 [%]としてR、G、Bの値を得ます
- For文の中に下行に相当するコードを入れ、得られたR、G、B値を順次与えます。すると、(A列に)スペクトラムが現れます
Range(“A” & i).Interior.color = RGB(R, G, B)
必要であれば、次のマクロをお使いください。ただし定義域は、0≦H<360 [°]、0≦S≦100 [%]、0≦V≦100 [%]としています
Sub HSV2RGB(ByVal H As Double, ByVal S As Double, ByVal V As Double, _
ByRef R As Integer, ByRef G As Integer, ByRef B As Integer)
Dim Max As Double
Dim Min As Double
Max = Round(V * 2.55)
Min = Round(Max - ((S / 100) * Max))
If Max < 0 Then Max = 0 If Max > 255 Then Max = 255
If Min < 0 Then Min = 0 If Min > 255 Then Min = 255
H = (H / 360 - Int(H / 360)) * 360
Select Case True
Case H >= 0 And H < 60
R = Max
G = Round((H / 60) * (Max - Min) + Min)
B = Min
Case H >= 60 And H < 120
R = Round(((120 - H) / 60) * (Max - Min) + Min)
G = Max
B = Min
Case H >= 120 And H < 180
R = Min
G = Max
B = Round(((H - 120) / 60) * (Max - Min) + Min)
Case H >= 180 And H < 240
R = Min
G = Round(((240 - H) / 60) * (Max - Min) + Min)
B = Max
Case H >= 240 And H < 300
R = Round(((H - 240) / 60) * (Max - Min) + Min)
G = Min
B = Max
Case H >= 300 And H < 360
R = Max
G = Min
B = Round(((360 - H) / 60) * (Max - Min) + Min)
Case Else
R = 0
G = 0
B = 0
End Select
End Sub
まとめ
光源の分光分布、XYZ色空間、ガンマ等、色のことをいろいろと調べてみましたが、よく分かりませんでしたし、くすんだようなスペクトルしか得られませんでした。
ご覧になりますか?
こんなのとか、
こんなのです。だいぶ残念な色合いです。
今回の方法で描くスペクトルは、シンプルであるとともに、彩度と明度が常に100%ですので、きれいです。
コメント