Das Makro im Detail:
Zunächst von einem Zylinder mit Radius R_out ein kleinerer Zylinder mit Radius R_in abgezogen,
indem man die Schnittmenge des ersten Zylinders mit dem Inversen (Komplement) des zweiten Zylinders
bildet. Dann werden 2 gegeneinander gedrehte Quader ("box") verwendet um das
gewünschte Segment auszuschneiden.
Dafür müssen wir zwei Fälle betrachten:
1. Betrag(Segmentwinkel) <= 180 Grad (Nur die Schnittmenge von Torus und den zwei Quadern) und
2. Betrag(Segmentwinkel) > 180 Grad (Eine Schnittmenge (intersection) des Torus mit einer Vereinigungsmenge (union) der beiden Quader):
//--------------------------------------------------- Segment_of_CylinderRing macro
#macro Segment_of_CylinderRing ( R_out, R_in, Height, Segment_Angle)
#local D = 0.0001; // just a little bit
#if (Height = 0 ) #local Height = D; #end
#if (Height < 0 ) #local D = -D; #end
#if (R_out < R_in) #local X=R_out; #local R_out=R_in; #local R_in=X; #end
#if (Segment_Angle < 0)
#local Negativ_Flag = 1;
#local Segment_Angle = -Segment_Angle;
#else
#local Negativ_Flag = 0;
#end
#if (Segment_Angle >= 360) #local Segment_Angle = mod (Segment_Angle, 360); #end
intersection{
cylinder { <0,0,0>,<0,Height,0>, R_out
} // end of outer cylinder ----------
cylinder { <0,-D,0>,<0,Height+D,0>, R_in
inverse
} // end of inner cylinder ----------
#if (Segment_Angle > 0) // ------------------------------------------------------
#if (Segment_Angle >= 180)
union{
#end // then use union!
box { <-R_out+D,-D,0>,< R_out+D, Height+D, R_out+D>
rotate<0,0,0>
}// end of box
box { <-R_out+D,-D,-R_out+D>,< R_out+D, Height+D,0>
rotate<0,-Segment_Angle,0>
}// end of box
#if (Segment_Angle >= 180)
} // end of union
#end // end of union, if union is used!
#if (Negativ_Flag = 0) rotate<0,-Segment_Angle,0>
scale<-1,1,-1>
#end // of "#if (Segment_Angle > 0)" --------------------------------------------
} // end of intersection
#end // end of macro ------------------------- end of macro Segment_of_CylinderRing - |
Die folgenden Bilder zeigen wie dieses Makro arbeitet
(Die Quader wurden in Textur "glass" verdeutlicht):
|
abs(Segment_Angle) <= 180 degrees R_out = 1.25, R_in = 0.75, Angle = -145 |
abs(Segment_Angle) > 180 degrees R_out = 1.25, R_in = 0.75, Angle = -215 |
|