Beschreibungen und Beispiele zum Raytracer POV-Ray von Friedrich A. Lohmüller
Geometrische Körper in POV-Ray
English English English
Italiano Italiano
Français 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

Cylinder_Ring_Segment
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):

Cylinder_Ring_Segment 145 degrees Cylinder_Ring_Segment 215 degrees
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()

© Friedrich A. Lohmüller, 2013
www.f-lohmueller.de