<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FAlexNB%2FnmColor</id>
	<title>Module:Sandbox/AlexNB/nmColor - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FAlexNB%2FnmColor"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/AlexNB/nmColor&amp;action=history"/>
	<updated>2026-06-19T07:10:02Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Sandbox/AlexNB/nmColor&amp;diff=145100&amp;oldid=prev</id>
		<title>imported&gt;AlexNB at 23:15, 27 September 2014</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/AlexNB/nmColor&amp;diff=145100&amp;oldid=prev"/>
		<updated>2014-09-27T23:15:46Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local redvalue = 0&lt;br /&gt;
local greenvalue = 0&lt;br /&gt;
local bluevalue = 0&lt;br /&gt;
 &lt;br /&gt;
local function nm2RGB(wavelength, IFcorrect)&lt;br /&gt;
-- code based on an algorithm from Dan Bruton&amp;#039;s Color Science Page: http://www.physics.sfasu.edu/astro/color/spectra.html&lt;br /&gt;
-- calculating RGB color components&lt;br /&gt;
    if (wavelength &amp;gt;= 380) and (wavelength &amp;lt; 440) then&lt;br /&gt;
        redvalue = (440 - wavelength) / 90&lt;br /&gt;
        greenvalue = 0&lt;br /&gt;
        bluevalue = 1&lt;br /&gt;
    elseif (wavelength &amp;gt;= 440) and (wavelength &amp;lt; 490) then&lt;br /&gt;
        redvalue = 0&lt;br /&gt;
        greenvalue = (wavelength - 440) / 50&lt;br /&gt;
        bluevalue = 1&lt;br /&gt;
    elseif (wavelength &amp;gt;= 490) and (wavelength &amp;lt; 510) then&lt;br /&gt;
        redvalue = 0&lt;br /&gt;
        greenvalue = 1&lt;br /&gt;
        bluevalue = (510 - wavelength) / 20&lt;br /&gt;
    elseif (wavelength &amp;gt;= 510) and (wavelength &amp;lt; 580) then&lt;br /&gt;
        redvalue = (wavelength - 510) / 70&lt;br /&gt;
        greenvalue = 1&lt;br /&gt;
        bluevalue = 0&lt;br /&gt;
    elseif (wavelength &amp;gt;= 580) and (wavelength &amp;lt; 645) then&lt;br /&gt;
        redvalue = 1&lt;br /&gt;
        greenvalue = (645 - wavelength) / 65&lt;br /&gt;
        bluevalue = 0&lt;br /&gt;
    elseif (wavelength &amp;gt;= 645) and (wavelength &amp;lt;= 780) then&lt;br /&gt;
        redvalue = 1&lt;br /&gt;
        greenvalue = 0&lt;br /&gt;
        bluevalue = 0&lt;br /&gt;
    end&lt;br /&gt;
-- calculating intensity correction factor&lt;br /&gt;
    if IFcorrect then&lt;br /&gt;
    local intensityfactor = 0&lt;br /&gt;
    if (wavelength &amp;gt;= 380) and (wavelength &amp;lt; 420) then&lt;br /&gt;
        intensityfactor = 0.3 + 0.7*(wavelength - 350) / 70&lt;br /&gt;
    elseif (wavelength &amp;gt;= 420) and (wavelength &amp;lt;= 700) then&lt;br /&gt;
        intensityfactor = 1&lt;br /&gt;
    elseif (wavelength &amp;gt; 700) and (wavelength &amp;lt;= 780) then&lt;br /&gt;
        intensityfactor = 0.3 + 0.7*(780 - wavelength) / 80&lt;br /&gt;
    end&lt;br /&gt;
    redvalue = redvalue * intensityfactor&lt;br /&gt;
    greenvalue = greenvalue * intensityfactor&lt;br /&gt;
    bluevalue = bluevalue * intensityfactor&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.emission(frame)&lt;br /&gt;
-- this function returns the string &amp;quot;#RRGGBB&amp;quot; with approximate RGB value for a wavelength passed as a first argument&lt;br /&gt;
    local wavelength = tonumber(frame.args[1])&lt;br /&gt;
    nm2RGB(wavelength, true)&lt;br /&gt;
    local result=&amp;#039;#&amp;#039; .. string.format(&amp;quot;%.2X%.2X%.2X&amp;quot;, 255*redvalue, 255*greenvalue, 255*bluevalue) &lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function absorption_to_visible(wavelength_abs)&lt;br /&gt;
-- code based on a color wheel drawn at: http://www2.chemistry.msu.edu/faculty/reusch/virttxtjml/spectrpy/uv-vis/spectrum.htm&lt;br /&gt;
   local wavelength_vis&lt;br /&gt;
   local minVioletIndigo = 380 -- originally, it was 400&lt;br /&gt;
   local maxVioletIndigo = 430&lt;br /&gt;
   local widthVioletIndigo = maxVioletIndigo - minVioletIndigo&lt;br /&gt;
   local minBlue = 430&lt;br /&gt;
   local maxBlue = 490&lt;br /&gt;
   local widthBlue = maxBlue - minBlue&lt;br /&gt;
   local minGreen = 490&lt;br /&gt;
   local maxGreen = 560&lt;br /&gt;
   local widthGreen = maxGreen - minGreen&lt;br /&gt;
   local minYellow = 560&lt;br /&gt;
   local maxYellow = 580&lt;br /&gt;
   local widthYellow = maxYellow - minYellow&lt;br /&gt;
   local minOrange = 580&lt;br /&gt;
   local maxOrange = 650 -- originally, it was 620&lt;br /&gt;
   local widthOrange = maxOrange - minOrange&lt;br /&gt;
   local minRed = 650 -- originally, it was 620&lt;br /&gt;
   local maxRed = 780 -- originally, it was 800&lt;br /&gt;
   local widthRed = maxRed - minRed&lt;br /&gt;
   if (wavelength_abs&amp;gt;=minVioletIndigo) and (wavelength_abs&amp;lt;=maxVioletIndigo) then&lt;br /&gt;
      wavelength_vis = (wavelength_abs - minVioletIndigo)*widthYellow/widthVioletIndigo + minYellow&lt;br /&gt;
   elseif (wavelength_abs&amp;gt;minBlue) and (wavelength_abs&amp;lt;=maxBlue) then&lt;br /&gt;
      wavelength_vis = (wavelength_abs - minBlue)*widthOrange/widthBlue + minOrange&lt;br /&gt;
   elseif (wavelength_abs&amp;gt;minGreen) and (wavelength_abs&amp;lt;=maxGreen) then&lt;br /&gt;
      wavelength_vis = (wavelength_abs - minGreen)*widthRed/widthGreen + minRed&lt;br /&gt;
   elseif (wavelength_abs&amp;gt;minYellow) and (wavelength_abs&amp;lt;=maxYellow) then&lt;br /&gt;
      wavelength_vis = (wavelength_abs - minYellow)*widthVioletIndigo/widthYellow + minVioletIndigo&lt;br /&gt;
   elseif (wavelength_abs&amp;gt;minOrange) and (wavelength_abs&amp;lt;=maxOrange) then&lt;br /&gt;
      wavelength_vis = (wavelength_abs - minOrange)*widthBlue/widthOrange + minBlue&lt;br /&gt;
   elseif (wavelength_abs&amp;gt;minRed) and (wavelength_abs&amp;lt;=maxRed) then&lt;br /&gt;
      wavelength_vis = (wavelength_abs - minRed)*widthGreen/(widthRed + 20) + minGreen&lt;br /&gt;
-- one of the &amp;quot;corrected&amp;quot; versions: wavelength_vis = (wavelength_abs - minRed - 30)*widthGreen/widthRed + minGreen&lt;br /&gt;
   end&lt;br /&gt;
   return wavelength_vis&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local minAntiMagenta = 550&lt;br /&gt;
local maxAntiMagenta = 570&lt;br /&gt;
&lt;br /&gt;
local function process_magenta(wavelength_abs)&lt;br /&gt;
   local redvalue_RED&lt;br /&gt;
   local bluevalue_RED&lt;br /&gt;
   local greenvalue_RED&lt;br /&gt;
   local redvalue_BLUE&lt;br /&gt;
   local bluevalue_BLUE&lt;br /&gt;
   local greenvalue_BLUE&lt;br /&gt;
   local widthAntiMagenta = maxAntiMagenta - minAntiMagenta&lt;br /&gt;
   local bias_BLUE = (wavelength_abs - minAntiMagenta)/widthAntiMagenta&lt;br /&gt;
   local bias_RED = (maxAntiMagenta - wavelength_abs)/widthAntiMagenta&lt;br /&gt;
   nm2RGB(700, false)&lt;br /&gt;
   redvalue_RED = redvalue*bias_RED&lt;br /&gt;
   bluevalue_RED = bluevalue*bias_RED&lt;br /&gt;
   greenvalue_RED = greenvalue*bias_RED&lt;br /&gt;
   nm2RGB(400, false)&lt;br /&gt;
   redvalue_BLUE = redvalue*bias_BLUE&lt;br /&gt;
   bluevalue_BLUE = bluevalue*bias_BLUE&lt;br /&gt;
   greenvalue_BLUE = greenvalue*bias_BLUE&lt;br /&gt;
   redvalue = 0.6+ 0.4*(redvalue_RED + redvalue_BLUE)&lt;br /&gt;
   bluevalue = 0.7 + 0.3*(bluevalue_RED + bluevalue_BLUE)&lt;br /&gt;
   greenvalue = greenvalue_RED + greenvalue_BLUE&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.absorption(frame)&lt;br /&gt;
-- this function returns the string &amp;quot;#RRGGBB&amp;quot; with approximate RGB value for a complementary color (reflection) to a color, defined as a wavelength passed as a first argument&lt;br /&gt;
    local wavelength = tonumber(frame.args[1])&lt;br /&gt;
-- adding magentas to smoothen red-&amp;gt;blue transition. Trying 540..570 nm&lt;br /&gt;
    if (wavelength&amp;gt;=minAntiMagenta) and (wavelength&amp;lt;=maxAntiMagenta) then&lt;br /&gt;
       process_magenta(wavelength)&lt;br /&gt;
       else nm2RGB(absorption_to_visible(wavelength), false)&lt;br /&gt;
    end&lt;br /&gt;
    local result=&amp;#039;#&amp;#039; .. string.format(&amp;quot;%.2X%.2X%.2X&amp;quot;, 255*redvalue, 255*greenvalue, 255*bluevalue) &lt;br /&gt;
    return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;AlexNB</name></author>
	</entry>
</feed>