/*
================================================
Two-Slit Diffraction
------------------------------------------------
Created by Søren Peo Pedersen - see my user page
at http://da.wiki.x.io/wiki/Bruger:Peo
================================================
*/
#declare WavefrontColor=<.2,.4,1>; // Wavefronts (default: blue)
#declare BarrierColor=<1,.8,.2>; // Barrier (default: Yellow)
union { // The barrier with two slits in it:
box {<-.1,.6,-.01>,<.1,5,.01>} // Part above the slits
box {<-.1,-.4,-.01>,<.1,+.4,.01>} // Part between the slits
box {<-.1,-5,-.01>,<.1,-.6,.01>} // Part below the slits
pigment {color rgb BarrierColor} finish {ambient 1}
}
#local Cnt=1; // Loop that puts some wavefront lines
#while (Cnt<5) // to the left of the barrier
cylinder {<(.5-Cnt)*0.37,-5,0>,<(.5-Cnt)*0.37,5,0>,.02
pigment {color rgb WavefrontColor} finish {ambient 1}}
#local Cnt=Cnt+1;
#end
// Arrows to indicate the directions of diffraction orders:
#macro OrderArrow(Start,End,Direction) // Macro to render one arrow
union {
triangle {<End,0,.01>,<End-1,-.3,.01>,<End-1,.3,.01>} // Forms an arrow
triangle {<End-1,-.1,.01>,<End-1,.1,.01>,<Start,.1,.01>} // stretching from
triangle {<End-1,-.1,.01>,<Start,.1,.01>,<Start,-.1,.01>} // Start to End a-
pigment {color rgb .6} // long the +X ax-
finish {ambient 1} // is, then turns
rotate <0,0,Direction> // it to Direction
}
#end
// Use the above macro to indicate 0th thru 2nd order diffraction:
#object {OrderArrow(1.3,3.3,47.73141557)} // 2nd order upwards
#object {OrderArrow(1,5.7,21.71561728)} // 1st order upwards
#object {OrderArrow(.5,5.4,0)} // 0th order horizontal
#object {OrderArrow(1,5.7,-21.71561728)} // 1st order downwards
#object {OrderArrow(1.3,3.3,-47.73141557)} // 2nd order downwards
// "m=(number)" legends at each diffraction order
#macro Mlig(Number) // Macro to render "m=" in bold italic, followed
union { // by the given Number in bold non-italic
text {ttf "timesbi.ttf" "m=",.01,0}
text {ttf "timesbd.ttf" str(Number,0,0),.01,0 translate <1.4,0,0>}
pigment {color rgb 1}
finish {ambient 1}
scale .6
translate <0,0,-.2>
}
#end
// Use the above macro to label each order of diffraction:
#object {Mlig(2) translate <.3,1.95,0>} // 2nd opder upwards
#object {Mlig(1) translate <3.1,1.8,0>} // 1st order upwards
#object {Mlig(0) translate <4,-.65,0>} // 0th order
#object {Mlig(1) translate <3.1,-2.1,0>} // 1st order downwards
#object {Mlig(2) translate <.3,-2.3,0>} // 2nd order downwards
// Angle-measuring "arcs" to indicate angles of diffraction:
#macro Angle(Degrees,Index,Radius)
union {
difference { // The arc part:
cylinder {<0,0,-.1>,<0,0,-.11>,Radius} // A cylinder, whose cur-
plane {<0,Degrees,0>,0} // ved surface defines the
plane {<0,-Degrees,0>,0 rotate <0,0,Degrees>} // arc, then parts of it
pigment { // are cut away using pla-
cylindrical // ne. Then it gets a cy-
color_map { // lindrical pigment thats
[0 color rgbt <1,1,1,0.5>] // transparent at the cen-
[0.2 color rgbt <1,1,1,0.75>] // ter so you only see it
[1 color rgbt <1,1,1,1.0>] // out near the curved
} // part.
rotate <90,0,0>
scale Radius
}
finish {ambient 1}
}
union { // "Nametag"; Greek "theta" with the given Index number:
text {ttf "symbol.ttf","q",0.1,0 pigment {color rgb 1} finish {ambient 1} scale .6 translate <-.2,-.2,0>}
text {ttf "timesbd.ttf",str(Index,0,0),0.1,0 pigment {color rgb 1} finish {ambient 1} scale .4 translate <.1,-.3,0>}
translate <(Radius+.3)*cos(radians(Degrees/2)),(Radius+.3)*sin(radians(Degrees/2)),-.2>
}
}
#end
// Use the above macro to indicate the angles of diffraction:
#object {Angle( 21.71561728,1,3)} // Show 1st order diffraction angle upwards
#object {Angle(-47.73141557,2,1.6)} // Show 2nd order diffraction angle downwards
#local Hole=-.5; // Loop run twice; once for
#while (Hole<1) // each slit in the barrier.
box {<-.6,Hole-.02,-.2>,<-.2,Hole+.02,-.1> // Little lines and
pigment {color rgb 1} finish {ambient 1} // triangular arrow-
} // heads showing the
triangle { // distance between
<-.5,Hole*.98,-.2>,<-.4,Hole*.5,-.2>,<-.6,Hole*.5,-.2> // the two slits in
pigment {color rgb 1} finish {ambient 1} // the barrier.
}
#local Cnt=1; // Loop run "several" (20) times to render concentric
#while (Cnt<20) // wavefronts emanating from each slit in the barrier:
difference {
torus {(Cnt-.5)*0.37,.02} // Torus to form the arc, minus a plane to
plane {<1,0,0>,.1} // cut away part of arc left of the barrier
pigment {color rgb WavefrontColor} finish {ambient 1}
rotate <90,0,0> translate <0,Hole,0>
}
#local Cnt=Cnt+1;
#end
#local Hole=Hole+1;
#end
union { // Various letters and arrowheads:
text {ttf "timesbi.ttf","d",0.1,0 // The "d" representing the distance
scale .6 translate <-.66,-.2,-.2>} // between the slits in the barrier
text {ttf "symbol.ttf","l",0.1,0 // Greek letter "lambda" representing
scale .6 translate <-.89,1.5,-.2>} // the wavelength
triangle {<-0.525,1.7,0>,<-0.325,1.6,0>,<-0.325,1.8,0>} // Arrowheads left and
triangle {<-0.955,1.7,0>,<-1.155,1.6,0>,<-1.155,1.8,0>} // right of "lambda"
pigment {color rgb 1} finish {ambient 1}
}
camera { // Viewpoint:
orthographic // No perspective
location <2.1,0,-5> // Looking from this position
look_at <2.1,0,0> // Looking towards this position
}