// Persistence of Vision Ray Tracer version 3.5/3.6 Include File // File: analytical_g.inc // Last updated: 25-March-2004 // Description: Macros for Analytical Geometry // // Author: Friedrich A. Lohmueller, 2004 // email: Friedrich.Lohmueller_at_t-online.de // homepage: http://wwww.f-lohmueller.de // //------------------------------------------------------------------------ #ifndef(ANALYTICAL_G_INC_TEMP) #declare ANALYTICAL_G_INC_TEMP = version; #version 3.5; #ifdef(View_POV_Include_Stack) #debug "including analytical_g.inc\n" #end #include "math.inc" #include "transforms.inc" #include "functions.inc" //------------------------------------------------------------------------ //------------------------------------------------------------------------ //--------------------------------------------------------------------------------------------- //----------------------------------------------------------- macro "Vector(Start,End,Radius)"! #macro Vector(P_start,P_end, R_Vector) union{ cylinder{ P_start, P_end - ( vnormalize(P_end - P_start)*9.5*R_Vector), R_Vector } cone { P_end - ( vnormalize(P_end - P_start)*10*R_Vector), 3*R_Vector, P_end, 0 } }// end of union #end //-------------------------------------------------------------------------- end of macro //----------------------------------------------------------- macro "Distance_Marker(Start,End,Radius)"! #macro Distance_Marker(P_start,P_end, R_Vector) union{ cylinder{ P_start + ( vnormalize(P_end - P_start)*9.5*R_Vector), P_end - ( vnormalize(P_end - P_start)*9.5*R_Vector), R_Vector } cone { P_end - ( vnormalize(P_end - P_start)*10*R_Vector), 3*R_Vector, P_end, 0 } cone { P_start + ( vnormalize(P_end - P_start)*10*R_Vector), 3*R_Vector, P_start, 0 } }// end of union #end //-------------------------------------------------------------------------- end of macro //------------------------------------------------ macros to show the components ! #macro Show_Y(Point, R_line) // macro "Show_Y(Point,Radius)"! #if (Point.y != 0) cylinder { , Point , R_line} #else sphere{Point , R_line} #end // of "if" #end //-------------------------------------------------------- end of macro #macro Show_Z(Point, R_line) #if (Point.z != 0) cylinder { , Point , R_line} #else sphere{Point , R_line} #end // of "if" #end //-------------------------------------------------------- end of macro #macro Show_X(Point, R_line) #if (Point.x != 0) cylinder { <0,Point.y,Point.z>, Point , R_line} #else sphere{Point , R_line} #end // of "if" #end //-------------------------------------------------------- end of macro #macro Show_Yxz(Point, R_line) // macro "Show_Yxz(Point,Radius)"! union{ #if (Point.y != 0) cylinder { , Point , R_line} #else sphere{Point , R_line} #end // of "if" #if (Point.x != 0) cylinder { ,<0,0,Point.z> , R_line} #else sphere{Point , R_line} #end // of "if" #if (Point.z != 0) cylinder { , , R_line} #else sphere{Point , R_line} #end // of "if" }// end of union #end //-------------------------------------------------------- end of macro #macro Show_Yxy(Point, R_line) // macro "Show_Yxy(Point,Radius)"! union{ #if (Point.y != 0) cylinder { ,, R_line} #else sphere{Point , R_line} #end // of "if" #if (Point.x != 0) cylinder { ,<0,Point.y,0> , R_line} #else sphere{Point , R_line} #end // of "if" #if (Point.z != 0) cylinder { ,Point , R_line} #else sphere{Point , R_line} #end // of "if" }// end of union #end //-------------------------------------------------------- end of macro #macro Show_Yyz(Point, R_line) // macro "Show_Yxy(Point,Radius)"! union{ #if (Point.y != 0) cylinder { <0,Point.y,Point.z>,<0,0,Point.z> R_line} #else sphere{Point , R_line} #end // of "if" #if (Point.x != 0) cylinder { <0,Point.y,Point.z>,Point , R_line} #else sphere{Point , R_line} #end // of "if" #if (Point.z != 0) cylinder { <0, Point.y,Point.z>,<0,Point.y,0> , R_line} #else sphere{Point , R_line} #end // of "if" }// end of union #end //-------------------------------------------------------- end of macro //------------------------------------------------------------------------------------------------ //--------------------------------------------------------------------------- Plane in normal form #macro Plane_Nor(Nor_Vector,D,Intervall_start,Intervall_end) // normal + D (?dist*|N|) // Plane in normal form normal vector n1,n2,n3> // Ebene in Normalenform "n1*x1 + n2*x2 + n3*x3 + Dist = 0" #local A=Nor_Vector.x; #local B=Nor_Vector.y; #local C=Nor_Vector.z; isosurface { function { A*x + B*y + C*z + D } contained_by { box { Intervall_start, Intervall_end } } // container shape accuracy 0.01 // accuracy of calculation [0.001] max_gradient 60 // maximum gradient the function can have [1.1] open // remove visible container surface } #end //sample: ------------------------------------------- //object{ Plane_N(Nor_Vector, D, Intervall_start, Intervall_end) texture{ pigment{color Red}}} //------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------- Plane in normal form #macro Plane_NoP(Nor_Vector,Point,Intervall_start,Intervall_end) // normal + point // Plane in normal form normal vector n1,n2,n3> // Ebene in Normalenform "n1*x1 + n2*x2 + n3*x3 + Dist = 0" #local A=Nor_Vector.x; #local B=Nor_Vector.y; #local C=Nor_Vector.z; isosurface { function { A*x + B*y + C*z + 0 } contained_by { box { Intervall_start-Point, Intervall_end-Point } } // container shape accuracy 0.01 // accuracy of calculation [0.001] max_gradient 60 // maximum gradient the function can have [1.1] open // remove visible container surface translate Point } #end //sample: ------------------------------------------- //object{ Plane_N(Nor_Vector, Point, Intervall_start, Intervall_end) texture{ pigment{color Red}}} //------------------------------------------------------------------------------------------------- //--------------------------------------------------------------------------- Plane by directions #macro Plane_Dir(Start,M_1,M_2,Intervall_start,Intervall_end) // Parameterform // Ebene aus Richtungsvektoren -> Normalenform "n1*x1 + n2*x2 + n3*x3+D = 0" #local Nor_Vector = VPerp_To_Plane(M_1,M_2); //normierter Normalenvektor von O weg zeigend!!! #local D = 0; #local A=Nor_Vector.x; #local B=Nor_Vector.y; #local C=Nor_Vector.z; isosurface { function { A*x + B*y + C*z + D } contained_by { box { Intervall_start-Start, Intervall_end-Start}}// container shape accuracy 0.01 // accuracy of calculation [0.001] max_gradient 60 // maximum gradient the function can have [1.1] open // remove visible container surface translate Start } #end //sample: ------------------------------------------- //object{ Plane_Dir(Start, M_1, M_2, Intervall_start, Intervall_end) texture{ pigment{color Red}}} //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------Startpunkt + Kantenvektoren #macro Parallelepiped_by_Corners (Corner_0, Corner_1, Corner_2, Corner_3, R_Base, R_Ang, Filled) #local Corner_4 = Corner_1+(Corner_2-Corner_0); #local Corner_5 = Corner_1+(Corner_3-Corner_0); #local Corner_6 = Corner_3+(Corner_2-Corner_0); #local Corner_7 = Corner_6+(Corner_1-Corner_0); union{ #if (R_Ang != 0) sphere { Corner_0, R_Ang} sphere { Corner_1, R_Ang} sphere { Corner_2, R_Ang} sphere { Corner_3, R_Ang} sphere { Corner_4, R_Ang} sphere { Corner_5, R_Ang} sphere { Corner_6, R_Ang} sphere { Corner_7, R_Ang} #end #if (R_Base != 0) cylinder{ Corner_0, Corner_1, R_Base } cylinder{ Corner_0, Corner_2, R_Base } cylinder{ Corner_0, Corner_3, R_Base } cylinder{ Corner_1, Corner_4, R_Base } cylinder{ Corner_1, Corner_5, R_Base } cylinder{ Corner_2, Corner_4, R_Base } cylinder{ Corner_2, Corner_6, R_Base } cylinder{ Corner_3, Corner_6, R_Base } cylinder{ Corner_3, Corner_5, R_Base } cylinder{ Corner_4, Corner_7, R_Base } cylinder{ Corner_5, Corner_7, R_Base } cylinder{ Corner_6, Corner_7, R_Base } #end #if (Filled = 1) triangle{ Corner_0, Corner_1, Corner_2 } triangle{ Corner_1, Corner_2, Corner_4 } triangle{ Corner_0, Corner_3, Corner_2 } triangle{ Corner_2, Corner_3, Corner_6 } triangle{ Corner_0, Corner_1, Corner_5 } triangle{ Corner_0, Corner_5, Corner_3 } triangle{ Corner_1, Corner_5, Corner_7 } triangle{ Corner_1, Corner_7, Corner_4 } triangle{ Corner_2, Corner_4, Corner_7 } triangle{ Corner_2, Corner_7, Corner_6 } triangle{ Corner_3, Corner_5, Corner_7 } triangle{ Corner_3, Corner_7, Corner_6 } #end // of "if (Filled = 1)" }// end of union #end //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------------ #macro Parallelflach_durch_Ecken (Point_P0d_, Corner_V1d_, Corner_V2d_, Corner_V3d_, R_Based_, R_Angd_, Filled_) object{ Parallelepiped_by_Corners (Point_P0d_, Corner_V1d_, Corner_V2d_, Corner_V3d_, R_Based_, R_Angd_, Filled_)} #end //------------------------------------------------------------------------------------------------- #macro Spat_durch_Ecken (Point_P0d_, Corner_V1d_, Corner_V2d_, Corner_V3d_, R_Based_, R_Angd_, Filled_) object{ Parallelepiped_by_Corners (Point_P0d_, Corner_V1d_, Corner_V2d_, Corner_V3d_, R_Based_, R_Angd_, Filled_)} #end //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------- //----------------------------------------------------------------------Startpunkt + Kantenvektoren #macro Parallelepiped_by_Edges (Point_P0, Edge_V1, Edge_V2, Edge_V3, R_Base, R_Ang, Filled) union{ #if (R_Ang != 0) sphere { o, R_Ang} sphere { Edge_V1, R_Ang} sphere { Edge_V2, R_Ang} sphere { Edge_V3, R_Ang} sphere { Edge_V1+Edge_V2, R_Ang} sphere { Edge_V1+Edge_V3, R_Ang} sphere { Edge_V2+Edge_V3, R_Ang} sphere { Edge_V1+Edge_V2+Edge_V3, R_Ang} #end #if (R_Base != 0) cylinder{ o, Edge_V1, R_Base } cylinder{ o, Edge_V2, R_Base } cylinder{ o, Edge_V3, R_Base } cylinder{ Edge_V1, Edge_V1+Edge_V2, R_Base } cylinder{ Edge_V1, Edge_V1+Edge_V3, R_Base } cylinder{ Edge_V2, Edge_V2+Edge_V1, R_Base } cylinder{ Edge_V2, Edge_V2+Edge_V3, R_Base } cylinder{ Edge_V3, Edge_V3+Edge_V1, R_Base } cylinder{ Edge_V3, Edge_V3+Edge_V2, R_Base } cylinder{ Edge_V1+Edge_V2,Edge_V1+Edge_V2+Edge_V3, R_Base } cylinder{ Edge_V1+Edge_V3,Edge_V1+Edge_V2+Edge_V3, R_Base } cylinder{ Edge_V2+Edge_V3,Edge_V1+Edge_V2+Edge_V3, R_Base } #end #if (Filled = 1) triangle{ o, Edge_V1, Edge_V2 } triangle{ Edge_V1, Edge_V2, Edge_V1+Edge_V2 } triangle{ Edge_V3, Edge_V1+Edge_V3, Edge_V2+Edge_V3 } triangle{ Edge_V1+Edge_V3, Edge_V2+Edge_V3, Edge_V1+Edge_V2+Edge_V3 } triangle{ o, Edge_V2, Edge_V3 } triangle{ Edge_V2, Edge_V3, Edge_V2+Edge_V3 } triangle{ Edge_V1, Edge_V2+Edge_V1, Edge_V3+Edge_V1 } triangle{ Edge_V2+Edge_V1, Edge_V3+Edge_V1, Edge_V2+Edge_V3+Edge_V1 } triangle{ o, Edge_V3, Edge_V1 } triangle{ Edge_V3, Edge_V1, Edge_V3+Edge_V1 } triangle{ Edge_V2, Edge_V3+Edge_V2, Edge_V1+Edge_V2 } triangle{ Edge_V3+Edge_V2, Edge_V1+Edge_V2, Edge_V3+Edge_V1+Edge_V2 } #end // of "if (Filled = 1)" translate Point_P0 }// end of union #end //------------------------------------------------------------------------------------------------- //------------------------------------------------------------------------------------------------------ #macro Parallelflach_durch_Kanten (Point_P0d_, Edge_V1d_, Edge_V2d_, Edge_V3d_, R_Based_, R_Angd_, Filled_) object{ Parallelepiped_by_Edges (Point_P0d_, Edge_V1d_, Edge_V2d_, Edge_V3d_, R_Based_, R_Angd_, Filled_)} #end //------------------------------------------------------------------------------------------------- #macro Spat_durch_Kanten (Point_P0d_, Edge_V1d_, Edge_V2d_, Edge_V3d_, R_Based_, R_Angd_, Filled_) object{ Parallelepiped (Point_P0d_, Edge_V1d_, Edge_V2d_, Edge_V3d_, R_Based_, R_Angd_, Filled_)} #end //------------------------------------------------------------------------------------------------- #macro Tetrahedron_by_Corners(Corner_V0, Corner_V1, Corner_V2, Corner_V3, R_Base, R_Ang, Filled) union{ #if (R_Ang != 0) sphere { Corner_V0, R_Ang} sphere { Corner_V1, R_Ang} sphere { Corner_V2, R_Ang} sphere { Corner_V3, R_Ang} #end #if (R_Base != 0) cylinder{ Corner_V0, Corner_V1, R_Base } cylinder{ Corner_V0, Corner_V2, R_Base } cylinder{ Corner_V0, Corner_V3, R_Base } cylinder{ Corner_V1, Corner_V2, R_Base } cylinder{ Corner_V2, Corner_V3, R_Base } cylinder{ Corner_V3, Corner_V1, R_Base } #end #if (Filled = 1) triangle{ Corner_V0, Corner_V1, Corner_V2 } triangle{ Corner_V0, Corner_V2, Corner_V3 } triangle{ Corner_V0, Corner_V3, Corner_V1 } triangle{ Corner_V3, Corner_V1, Corner_V2 } #end // of "if (Filled = 1)" }// end of union #end //------------------------------------------------------------------------- //-------------------------------------------------------------- startpoint and vectors of the edges //-------------------------------------------------------------- Startpunkt und Kantenvektoren #macro Tetrahedron_by_Edges(Point_0, Edge_V1, Edge_V2, Edge_V3, R_Base, R_Ang, Filled) union{ #if (R_Ang != 0) sphere { o, R_Ang} sphere { Edge_V1, R_Ang} sphere { Edge_V2, R_Ang} sphere { Edge_V3, R_Ang} #end #if (R_Base != 0) cylinder{ o, Edge_V1, R_Base } cylinder{ o, Edge_V2, R_Base } cylinder{ o, Edge_V3, R_Base } cylinder{ Edge_V1, Edge_V2, R_Base } cylinder{ Edge_V1, Edge_V3, R_Base } cylinder{ Edge_V2, Edge_V3, R_Base } #end #if (Filled = 1) triangle{ o, Edge_V1, Edge_V2 } triangle{ o, Edge_V2, Edge_V3 } triangle{ o, Edge_V3, Edge_V1 } triangle{ Edge_V1, Edge_V2, Edge_V3 } #end // of "if" translate Point_0 }// end of union #end //------------------------------------------------------------------------------------------ //----------------------------------------------------------------------------------------------- #macro Tetraeder (Point_0d_, Edge_V1d_, Edge_V2d_, Edge_V3d_, R_Based_, R_Angd_, Filled_) object{ Tetrahedron (Point_0d_, Edge_V1d_, Edge_V2d_, Edge_V3d_, R_Based_, R_Angd_, Filled_)} #end //------------------------------------------------------------------------------------------ //------------------------------------------------------------------------------- //------------------------------------------------------------------------------- circle //------------------------------------------------------------------------------- Kreis // circle line of a circle #macro Circle_Line(C_Middle, C_Radius, Line_Radius, C_Normal) torus{ C_Radius, Line_Radius Reorient_Trans(y,C_Normal) translate C_Middle } #end // surface of a circle #macro Circle_Disc(C_Middle, C_Radius, C_Normal) disc { o,y, C_Radius Reorient_Trans(y,C_Normal) translate C_Middle } #end // circle line of the outer circle of a triangle #macro Circle_Line_out(Corner_1, Corner_2, Corner_3, Line_Radius) #local Middle = Triangle_M_out (Corner_1, Corner_2, Corner_3); #local Radius = Triangle_R_out (Corner_1, Corner_2, Corner_3); #local Normal = Triangle_Normal(Corner_1, Corner_2, Corner_3); Circle_Line ( Middle, Radius, Line_Radius, Normal) #end // surface of the outer circle of a triangle #macro Circle_Disc_out(Corner_1, Corner_2, Corner_3) #local Middle = Triangle_M_out (Corner_1, Corner_2, Corner_3); #local Radius = Triangle_R_out (Corner_1, Corner_2, Corner_3); #local Normal = Triangle_Normal(Corner_1, Corner_2, Corner_3); disc { o,y, Radius Reorient_Trans(y,Normal) translate Middle } #end // circle line of the inner circle of a triangle #macro Circle_Line_in (Corner_1, Corner_2, Corner_3, Line_Radius) #local Middle = Triangle_M_in (Corner_1, Corner_2, Corner_3); #local Radius = Triangle_R_in (Corner_1, Corner_2, Corner_3); #local Normal = Triangle_Normal(Corner_1, Corner_2, Corner_3); Circle_Line ( Middle, Radius, Line_Radius, Normal) #end // surface of the inner circle of a triangle #macro Circle_Disc_in (Corner_1, Corner_2, Corner_3) #local Middle = Triangle_M_in (Corner_1, Corner_2, Corner_3); #local Radius = Triangle_R_in (Corner_1, Corner_2, Corner_3); #local Normal = Triangle_Normal(Corner_1, Corner_2, Corner_3); disc { o,y, Radius Reorient_Trans(y,Normal) translate Middle } #end #macro Triangle_Normal(Corner_1, Corner_2, Corner_3) vnormalize(vcross((Corner_2-Corner_1),(Corner_3-Corner_1))) #end // Center of Mass_Center of the triangle #macro Triangle_Mass_Center (Corner_1, Corner_2, Corner_3) (Corner_1+Corner_2+Corner_3)/3 #end // Center M of the outer circle #macro Triangle_M_out (Corner_1, Corner_2, Corner_3) #local C1 = Corner_1; #local C2 = Corner_2; #local C3 = Corner_3; (C1+C2)/2 +sqrt( Triangle_R_out(C1,C2,C3)*Triangle_R_out(C1,C2,C3) - 1/4*vlength(C2-C1)*vlength(C2-C1)) * ( vcross( Triangle_Normal(C1,C2,C3), vnormalize(C2-C1)) ) #end // Radius R_out of the outer circle #macro Triangle_R_out (Corner_1, Corner_2, Corner_3) #local V1 = vnormalize(Corner_2-Corner_1); #local V2 = vnormalize(Corner_3-Corner_1); #local V3 = Corner_3-Corner_2; #local Sinus = vlength( vcross( V1, V2)); vlength(V3)/(2*Sinus) #end // Area A of the triangle #macro Triangle_Area (Corner_1, Corner_2, Corner_3) vlength( vcross( (Corner_2-Corner_1),(Corner_3-Corner_1) ) )/2 #end // Circumference of the triangle #macro Triangle_Circum (Corner_1, Corner_2, Corner_3) #local V1 = Corner_2-Corner_1; #local V2 = Corner_3-Corner_1; #local V3 = Corner_3-Corner_2; (vlength(V1) + vlength(V2) + vlength(V3)) #end // radius r_inner of the inner circle #macro Triangle_R_in (Corner_1, Corner_2, Corner_3) 2*Triangle_Area(Corner_1, Corner_2, Corner_3)/Triangle_Circum(Corner_1, Corner_2, Corner_3) #end // center M_in of the inner circle #macro Triangle_M_in (Corner_1, Corner_2, Corner_3) #local V1 = Corner_2-Corner_1 ; #local V2 = Corner_3-Corner_1 ; #local V3 = Corner_3-Corner_2 ; #local R_in = Triangle_R_in( Corner_1, Corner_2, Corner_3) ; #local T = vnormalize( vnormalize(V1) + vnormalize(V2) ); #local Sinus = vlength( vcross( T , vnormalize(V1) ) ); Corner_1 + R_in/Sinus * T #end //------------------------------------------------------------------------------- #version ANALYTICAL_G_INC_TEMP; #end //--------------------------------------------------------------------------- end