DNA Double Helix
// Deoxyribose Nucleic Acid molecule
// James Kermode, October 1999
// Scale: 1 unit = 1 ångström (1e-10 m)
// I N C L U D E S ////////////////////////////////////////////////////////////
#include "colors.inc"
// D E C L A R E S ////////////////////////////////////////////////////////////
#declare GeneticSeed = 52;
#declare RandSeed = seed(GeneticSeed);
#declare Helix = union
{
#declare Angle = 0;
#while (Angle<360)
#declare StartPt=vrotate(10*x,-y*Angle)+y*34*(Angle/360);
#declare EndPt=vrotate(10*x,-y*(Angle+1))+y*34*((Angle+1)/360);
polygon
{
5,StartPt-1.5*y,EndPt-1.5*y,EndPt+1.5*y,StartPt+1.5*y,StartPt-1.5*y
pigment { Red }
}
#declare StartPt=vrotate(9.95*x,-y*Angle)+y*34*(Angle/360);
#declare EndPt=vrotate(9.95*x,-y*(Angle+1))+y*34*((Angle+1)/360);
polygon
{
5,StartPt-1.5*y,EndPt-1.5*y,EndPt+1.5*y,StartPt+1.5*y,StartPt-1.5*y
pigment { Blue }
}
#declare Angle=Angle+1;
#end
}
#declare DoubleHelix = union
{
object { Helix }
object { Helix rotate y*120 }
}
#declare Adenine = Green;
#declare Thymine = Yellow;
#declare Guanine = White;
#declare Cytosine = Black;
#declare BasePairs = array[4][2]
{
{Adenine,Thymine},
{Thymine,Adenine},
{Guanine,Cytosine},
{Cytosine,Guanine}
}
#declare Bases = union
{
#declare Angle = 0;
#while (Angle<360)
#declare StartPt=vrotate(9.6*x,-y*Angle)+y*34*(Angle/360);
#declare EndPt=vrotate(StartPt,120*y);
#declare MidPt=(StartPt+EndPt)/2;
#declare RandBase = int(4*rand(RandSeed));
cylinder
{
StartPt,MidPt,0.6
pigment { BasePairs[RandBase][0] }
}
cylinder
{
MidPt,EndPt,0.6
pigment { BasePairs[RandBase][1] }
}
#declare Angle=Angle+36;
#end
}
#declare DeoxyriboseNucleicAcid = union
{
object { DoubleHelix }
object { Bases }
}
// V I E W P O R T ////////////////////////////////////////////////////////////
camera
{
location <0,-34,-80>
look_at <0,-34,0>
rotate 360*y*clock
translate y*20*sin(pi*clock*0.5)
}
background { White }
// L I G H T S ////////////////////////////////////////////////////////////////
light_source
{
<0,0,-80>
White
}
// O B J E C T S //////////////////////////////////////////////////////////////
union
{
#declare i = 0;
#while (i<4)
object { DeoxyriboseNucleicAcid translate i*y*-34}
#declare i=i+1;
#end
rotate z*30
translate x*-30
}