Beschreibungen und Beispiele zum Raytracer POV-Ray von Friedrich A. Lohmüller
English English English
Italiano Italiano
Français français

Übersicht meine Macro-Objekte Übersicht meine Makro-Objekte macro "Segment_of_Torus (...)"

Dieses Objekt ist in meiner Include_Datei "shapes_lo.inc" als Makro definiert:

Cylinder_Ring_Segment

Segment_of_CylinderRing


    Segment eines zylindrischen Rings
 
Syntax:
object{ Segment_of_CylinderRing (R_out, R_in, Height, Segment_Angle)
        texture{ ... ... }
      } // end of object ------------
Mit:
R_out = der äußere Radius des zylindrischen Rings,
R_in = der innere Radius des zylindrischen Rings,
Height = die Höhe des Ringsegments,
Segment_Angle = der Winkel des Ringsegments, links-händig orientiert!
Für Segment_Angle = 0 ergibt sich ein geschlossener Ring oder ein Rohr.
Aus Kompatibilitätsgründen wurde das alte Makro "Cylinder_Ring_Segment"
beibehalten - dort war der Winkel rechtshändig definiert!
Beispiele:
#include "shapes_lo.inc"
// --------------------------------------------------------------------------
object{ Segment_of_CylinderRing ( 3.75, 2.25, 0.20,-300)
        texture { Chrome_Metal
                  finish { ambient 0.1 diffuse 0.85  phong 1}
                } // end of texture
        scale <1,1,1> rotate<0,0,0> translate<0,0,0>
      } // ------------------------------------------------------------------

// --------------------------------------------------------------------------
object{ Segment_of_CylinderRing ( 1.75, 1.50, 2.00,-270)
        texture{ pigment {color White*1.1}
                 finish { ambient 0.15 diffuse 0.85 phong 1 }
               } // end of texture
      } // ------------------------------------------------------------------

// --------------------------------------------------------------------------
object{ Segment_of_CylinderRing ( 2.50, 3.00, 1.00, -80)
        texture { pigment{ color rgb< 0.7, 1, 0.0> }
                  finish { ambient 0.15 diffuse 0.75  phong 1 reflection 0.2}
                } // end of texture
      } // ------------------------------------------------------------------

// --------------------------------------------------------------------------
object{ Segment_of_CylinderRing ( 1.1, 0.80, 1.50,  0)
        texture { pigment{ color rgb< 1,0.7, 0.0> }
                  finish { ambient 0.15 diffuse 0.75  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. 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):

 
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






Übersicht meine Macro-Objekte Übersicht meine Macro-Objekte macro "Segment_of_Torus (...)"

© Friedrich A. Lohmüller, 2010
email email: (legacy email redacted)
homepage:www.f-lohmueller.de