Two pictures of optical prisms; one (above) with a high degree of optical dispersion, and one (below) with a low dispersion. For each image, a different setting of the "Disp" variable in the code below to have each image show a different amount of optical dispersion.
Simulated using computer graphics, rendered using the Persistence of Vision Raytracer (POV-Ray). Everything made from scratch by Peo, originally for use in a few articles in danish Wikipedia.
The code below was used to render each prism, and the two images was subsequently merged into this image in a photomanipulation application.
global_settings {
max_trace_level 64
max_intersections 1000
}
// "Disp" variable: Amount of dispersion: Looks reasonable
// from 2 (less) thru 6 (more dispersion), including both:
#declare Disp=6;
light_source {<-100,50,-30> color rgb .3}
light_source {<-150,120,-100> color rgb .3}
camera {
location <-4,5,-9>
look_at <3,-2,0>
angle 60
}
#local L1a = tan(Disp/180*pi);
#local L1b = 1.05+L1a*1.13;
#local L2a = -tan(Disp/180*pi);
#local L2b = .739+L2a*1.308;
#local SPLx = (L2b-L1b)/(L1a-L2a); // Center of radial rainbow pattern in the part of
#local SPLy = L1a*SPLx+L1b; // the light beam that's inside the prism.
#local TOPx = (3-L1b)/(L1a+1.73205087569);
#local TOPy = L1a*TOPx+L1b;
#local BOTx = (3-L2b)/(L2a+1.73205087569);
#local BOTy = L2a*BOTx+L2b;
#local TOPa = tan(radians(2*Disp-30));
#local TOPb = TOPy-TOPa*TOPx;
#local BOTa = tan(radians(-2*Disp-30));
#local BOTb = BOTy-BOTa*BOTx;
#local OUTx = (BOTb-TOPb)/(TOPa-BOTa);
#local OUTy = BOTa*OUTx+BOTb;
#local txtOff=texture {pigment {color rgb 1}} // Texture for unlit walls
#local txtFLT=texture {pigment { // Radial pattern to fake the "rainbow-
radial // illuminated" part of the wall and floor.
color_map {
[0.00 color rgb <.7,(1-Disp/10),1>] // Colors vary from all white
[0.20 color rgb <(1-Disp/10),(1-Disp/10),1>] // to the rainbow of saturated
[0.40 color rgb <(1-Disp/10),1,1>] // colors, depending on "Disp"
[0.60 color rgb <(1-Disp/10),1,(1-Disp/10)>] // setting.
[0.80 color rgb <1,1,(1-Disp/10)>]
[1.00 color rgb <1,(1-Disp/10),(1-Disp/10)>]
}
frequency int(90/Disp+.5) // Agular width - causes discrete intervals in width!
} finish {ambient .4}}
#local txtSTR=texture { // This texture encloses the above, "ranbow-illuminated"
radial // texture with zones at the red and purple ends where the
texture_map { // rainbow "fades out" into the invisible, and thus appa-
[0.00 txtOff] // rently unlit parts of the floor and walls.
[0.01 txtFLT]
[Disp/90-.01 txtFLT]
[Disp/90 txtOff]
[1.00 txtOff]
}
rotate <90,0,-30-2*Disp>
translate <OUTx,OUTy,0>
}
union { // The floor and walls in the scenery:
plane {<0,1,0>,-3.001} // Floor
plane {<-1,0,0>,-10} // Wall struck by colored light
plane {<0,0,-1>,-15} // Unlit wall in the background
texture { // This texture is the rainbow band in txtSTR inside a
gradient z // small strip along the triangular surfaces of the
texture_map { // prism, surrounded by zones where the light fades out
[0.000 txtOff] // into the dark gray, "unlit" texture.
[0.004 txtSTR]
[0.016 txtSTR]
[0.020 txtOff]
[1.000 txtOff]
}
translate <0,0,-.01>
scale <1,1,200>
}
}
difference { // The prism itself
box {<-10,-3,-2>,<10,3,2>} // Shape made from a box, "cut" into
plane {<0,-1,0>,-1.5 rotate <0,0,60>} // shape using two planes at 60* angles.
plane {<0,-1,0>,-1.5 rotate <0,0,-60>}
hollow on // Media stuff: The prism has an index
pigment {color rgbt <.8,1,.9,.7>} // of refraction (ior) of 1.66, and
finish {phong 1 reflection .1 ambient .3} // disperses colors according to the
interior {ior 1.66 dispersion 1+Disp/100} // "Disp" variable.
}
difference { // The narrow "sheet" of white light entering the prism from the left:
box {<-10,-.1,-1.5>,<1,.1,1.5> rotate <0,0,26.099> translate <-1,1,0>}
plane {<0,1,0>,1.5001 rotate <0,0,60>} // Box "cut" into shape with a plane.
hollow on // Media stuff: The beam shape itself is invisible, but
pigment {color rgbt 1} // contains an emitting media, giving the beam the
interior { // "fuzzy", translucent look.
media {
intervals 10 samples 1,1 confidence 0.9 variance 1.0/128
ratio 0.9 emission rgb .6 method 3
}
}
}
difference { // Part of the light beam inside the prism:
box {<-2,-2,-1.5>,<5,2,1.5>} // Box cut to shape
plane {<0,-1,0>,0 rotate <0,0,Disp> translate <-1.13,1.05,0>} // with planes, ac-
plane {<0,1,0>,0 rotate <0,0,-Disp> translate <-1.308,0.739,0>} // cording to the
plane {<0,-1,0>,-1.499 rotate <0,0,60>} // "Disp" variable
plane {<0,-1,0>,-1.499 rotate <0,0,-60>}
hollow on // Media stuff: The shape itself is invisible inside
pigment {color rgbt <1,1,1,1>} // the prism since it has the same ior; 1.66
finish {ambient .7}
interior {
ior 1.66 dispersion 1+Disp/100
media {
intervals 10 // number of intervals used for sampling [10]
samples 1,1 // minimum and maximum number of samples taken per interval [1,1]
confidence 0.9 // statistic parameter higher->better quality [0.9]
variance 1.0/128 // statistic parameter lower->better quality [1.0/128]
ratio 0.9 // distribution between lit and unlit areas [0.9]
emission rgb<1,.95,.85>*.4
method 3 // adaptive sampling
density {
radial
color_map { // Color spectrum in the beam inside the prism:
[0.00 color rgb <1,(1-Disp/10),(1-Disp/10)>*(1.5-.05*Disp)]
[0.20 color rgb <1,1,(1-Disp/10)> *(1.5-.05*Disp)]
[0.40 color rgb <(1-Disp/10),1,(1-Disp/10)>*(1.5-.05*Disp)]
[0.60 color rgb <(1-Disp/10),1,1> *(1.5-.05*Disp)]
[0.80 color rgb <(1-Disp/10),(1-Disp/10),1>*(1.5-.05*Disp)]
[1.00 color rgb <1,(1-Disp/10),1> *(1.5-.05*Disp)]
}
frequency int(180/Disp+.5)
rotate <-90,0,-Disp>
translate <SPLx,SPLy,0>
}
}
}
}
difference { // Part of the light beam exiting at the right-hand side of the prism:
box {<-5,-500,-1.5>,<500,5,1.5>} // Box cut to sha-
plane {<0,1,0>,1.5001 rotate <0,0,-60>} // pe using three
plane {<0,-1,0>,0 rotate <0,0,2*Disp-30> translate <TOPx,TOPy,0>} // planes.
plane {<0,1,0>,0 rotate <0,0,-2*Disp-30> translate <BOTx,BOTy,0>}
hollow on // Media stuff: Like the entering beam, this one's
pigment {color rgbt <1,1,1,1>} // shape is invisible, but contains emitting media
finish {ambient .7} // showing the rainbow "band" of colors
interior {
media {
intervals 10 samples 1,1 confidence 0.9 variance 1.0/128
ratio 0.9 emission rgb<1,.95,.85>*.4 method 3
density {
radial
color_map { // Color spectrum in the beam leaving the prism:
[0.00 color rgb <1,(1-Disp/10),(1-Disp/10)>*(.4-.01*Disp)]
[0.20 color rgb <1,1,(1-Disp/10)> *(.4-.01*Disp)]
[0.40 color rgb <(1-Disp/10),1,(1-Disp/10)>*(.4-.01*Disp)]
[0.60 color rgb <(1-Disp/10),1,1> *(.4-.01*Disp)]
[0.80 color rgb <(1-Disp/10),(1-Disp/10),1>*(.4-.01*Disp)]
[1.00 color rgb <.7,(1-Disp/10),1> *(.4-.01*Disp)]
}
frequency int(90/Disp+.5)
rotate <-90,0,-30-2*Disp>
translate <OUTx,OUTy,0>
}
}
}
}