Beschreibungen und Beispiele zum Raytracer POV-Ray von Friedrich A. Lohmüller Geometrische Körper in POV-Ray English Italiano Français

Home
- POV-Ray Tutorial

Geometrische Körper
Inhaltsübersicht

Objekte in "shapes3.inc"
>Segment_of_CylinderRing
- Segment_of_Torus
- Segment_of_Object
- Egg
- Egg_Shape
- Facetted_Egg
- Facetted_Egg_Shape
- Facetted_Sphere
- Ring_Sphere
- Column_N
- Column_N_AB
- Pyramid_N
- Pyramid_N_AB
- Round_Pyramid_N_out
- Round_Pyramid_N_in
- Round_Cylinder_Tube
- Rounded_Tube_AB
- Rounded_Tube
- Round_N_Tube_Polygon
- Round_Conic_Torus
- Round_Conic_Prism
- Half_Hollowed_Rounded_Cyl1
- Half_Hollowed_Rounded_Cyl2

Geometrische Körper aus meiner Include-Datei "shapes3.inc" ( ehemals "shapes_lo.inc"):
Segment_of_CylinderRing
Segment eines zylindrischen Rings

Syntax:
 ```object{ Segment_of_CylinderRing( R_out, R_in, Height_in_Y, Segment_Angle ) //--------------- texture{ ... ... } scale <1,1,1> rotate<0,0,0> translate<0,0,0> } // end of object ---------```
R_out = äußerer Radius des Zylinderrings,
R_in = innerer Radius des Zylinderrings,,
Height = Höhe des Ringsegments,
Segment_Angle = Winkel des Ringsegments, links-händig orientiert!
Für Segment_Angle = 0 ergibt sich ein geschlossener Ring oder ein Rohr.
Beispiele:
 ```#include "shapes3.inc" // ------------------------------------------------- object{ Segment_of_CylinderRing( 3.75,2.25,0.2,-300) texture{ Chrome_Metal finish { phong 1} } // end of texture } // ----------------------------------------- object{ Segment_of_CylinderRing( 1.75,1.5,2.0,-270) texture{ pigment {color White*1.1} finish { phong 1 } } // end of texture } // ----------------------------------------- object{ Segment_of_CylinderRing( 2.5, 3.0, 1.0, -80) texture{ pigment{ color rgb< 0.7, 1, 0.0> } finish { phong 1 reflection 0.2} } // end of texture } // ----------------------------------------- object{ Segment_of_CylinderRing( 1.1, 0.8, 1.5, 0) texture{ pigment{ color rgb< 1,0.7, 0.0> } finish { phong 1 reflection 0.2} } // end of texture } // -----------------------------------------```

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. abs(Segment_Angle) <= 180 180 Grad (Nur die Schnittmenge von Torus und den zwei Quadern) und
2. abs(Segment_Angle) > 180 Grad (Eine Schnittmenge (intersection) des Torus mit einer Vereinigungsmenge (union) der beiden Quader):

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
 ```//--------------------------- Segment_of_CylinderRing() #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> }// 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 (Negativ_Flag = 0)" ------------ #end // of "#if (Segment_Angle > 0)" ------------ } // end of intersection #end // --------- end of macro Segment_of_CylinderRing()```