Questo oggetto è definito con una macro nel mio
include file "shapes3.inc"
( precedentemente "shapes_lo.inc" ).
Segment_of_Object, un segmento di un oggetto.
|
Sintassi generale:
object{ Segment_of_Object( Ogetto_Mio,
Angolo_di_Segmento
) //------------
texture{ ... ... }
scale<1,1,1>
rotate<0,0,0>
translate<0,0,0>
} // end of object ---------------- |
Ogetto_Mio = un oggetto declarato
Angolo_di_Segmento = l'angolo della sezione,
orientato in senso di mano sinistra!
Esempio:
#declare My_Test_Object =
difference{
sphere{ <0,0,0>, 2.75
texture{ pigment{ color rgb<0.5,1,0>}
finish { phong 1}
} // end of texture
} // end of sphere -------------------
sphere{ <0,0,0>, 2.25
texture{ pigment{ color rgb<1,0.6,0>}
finish { phong 1}
} // end of texture
} // end of sphere -------------------
cylinder{ <0,-3.5,0>,<0,3.5,0>, 1.5
texture{ pigment{ color rgb<1,1,1>}
finish { phong 0.5}
} // end of texture
} // end of cylinder ---------------
scale<1,0.6,1>
} // end of difference -----------------------
//--------------------------------------------
#include "shapes3.inc"
//--------------------------------------------
object{ Segment_of_Object(My_Test_Object,-235)
texture{ pigment{ color rgb<1,1,1>}
finish { phong 1}
} // end of texture
}
// ------------------------------------------- |
|
Un alto esempio:
|
L'oggetto originale
|
Segment_Angle = 225
|
La macro nel dettaglio
Quanto a la tecnica di ritagliare il segmento con due parallelepipedi si può vedere
le illustrazioni delle macro precedenti.
Le dimensioni dei parallelepipedi usato qui per ritagliare il segmento, sono calcolati automaticamente
con i funzioni "min_extent ( Object )" e "max_extent ( Object )":
//-----------------------------Segment_of_Object macro()
#macro Segment_of_Object( SEgment_OBject, Segment_Angle)
#local D = 0.0001; // just a little bit
#if (Segment_Angle = 0)
#local Segment_Angle = D;
#end
#if (abs(Segment_Angle) >= 360)
#local Segment_Angle = mod (Segment_Angle, 360);
#end
#local O_min = min_extent ( SEgment_OBject );
#local O_max = max_extent ( SEgment_OBject );
#local O_max_x = max (O_min.x, O_max.x);
#local O_max_z = max (O_min.z, O_max.z);
#local R_max = 1.5*max(O_max_x,O_max_z);
#if (Segment_Angle > 0)
#local Box_z = R_max+D;
#else
#local Box_z = -R_max+D;
#end
intersection{
object{ SEgment_OBject }
#if (abs(Segment_Angle) >= 180)
union{
#end // then use union!
box{<-R_max+D,O_min.y-D,0>,<R_max+D,O_max.y+D,-Box_z>
}// end of box
box{<-R_max+D,O_min.y-D,Box_z>,<R_max+D,O_max.y+D,0>
rotate<0, Segment_Angle,0>
}// end of box
#if (abs(Segment_Angle) >= 180)
} // end of union
#end // end of union, if union is used!
} // end of intersection
#end // -------------- end of macro Segment_of_Object() |
|
|