POV-Ray : Newsgroups : povray.binaries.scene-files : Cristal.inc : cristals (as in LiquidGlass) : Cristal.inc : cristals (as in LiquidGlass) Server Time
2 Sep 2024 06:17:01 EDT (-0400)
  Cristal.inc : cristals (as in LiquidGlass)  
From: Steven Pigeon
Date: 13 Jun 2002 11:48:36
Message: <3d08bed4$1@news.povray.org>
Ok

min_sides: the minimum number of sides your cristal will have
max_sides: the maximum;
diam: the edges are on a circle of diameter diam
height: the heigth of the crown
var: the variance of the points
top: the absolute topmost points
rand_seed... welll

ex:

mesh_cristal(4,7, 1, 3, 0.1, 4, s)

produces a cristal of 4 to 7 faces, contained in a cylinder of diameter 1,
that have its pointy end starting at 3 +- 0.1, and culminates at 4.


Same with the two-ended version

best,

    S.



#macro mesh_cristal(min_sides,max_sides,diam, height,var,top,rand_seed)
 #local nb_sides = min_sides+floor (0.5 +
(max_sides-min_sides)*rand(rand_seed) );
 #declare angles = array [ nb_sides ]; // angles
 #declare bases  = array [ nb_sides ];
 #declare mi_hauteurs = array [ nb_sides ];
 #declare sommets = array [ nb_sides] ;

 // some random values
 #local i=0;
 #while (i<nb_sides)
  #declare angles[i]=rand(rand_seed) * 360;
  #declare i=i+1;
 #end


 // sort them
 #local i=0;
 #while (i < nb_sides - 1 )
  #local j=i+1;
  #while (j < nb_sides )
   #if (angles[i]>angles[j])
    #local temp = angles[i];
    #declare angles[i]=angles[j];
    #declare angles[j]=temp;
   #end //if

   #declare j=j+1;
  #end // while (j

  #declare i=i+1;
 #end // while (i


 #local i=0;
 #while (i<nb_sides)

  #declare bases[i] = vrotate( < 0,0,diam>, <0,angles[i],0 >);
  #declare mi_hauteurs[i]=bases[i]+<0,height+rand(rand_seed)*var,0>;

  #declare i=i+1;
 #end

 mesh
  {
   #local i=0;
   #while (i<nb_sides)
    triangle { bases[i],mi_hauteurs[i],mi_hauteurs[mod(i+1,nb_sides)] }
    triangle { bases[i],bases[mod(i+1,nb_sides)],
mi_hauteurs[mod(i+1,nb_sides)] }
    #declare i=i+1;
   #end

   #declare sommets = bases ;
   #local random_vect = vrotate(<0,0,10>,rand(rand_seed)*360); // some
vector in the x-z plane
   #local random_angle = rand(rand_seed)*15;

   #local i=0;
   #while (i<nb_sides)
    #declare sommets[i]=vaxis_rotate(sommets[i]/2,random_vect,random_angle)
+ <0,top,0>;
    #declare i=i+1;
   #end

   #local i=0;
   #while (i<nb_sides)
    triangle { sommets[i],mi_hauteurs[i],mi_hauteurs[mod(i+1,nb_sides)] }
    triangle { sommets[i],sommets[mod(i+1,nb_sides)],
mi_hauteurs[mod(i+1,nb_sides)] }
    #declare i=i+1;
   #end

   #local i=0;
   #while (i<nb_sides)
    triangle { bases[0],bases[i],bases[mod(i+1,nb_sides)] }
    triangle { sommets[0],sommets[i],sommets[mod(i+1,nb_sides)] }
    #declare i=i+1;
   #end


  } // mesh
#end // macro


//////////////////////////////////////////////////////////////

#macro two_ended_mesh_cristal(min_sides,max_sides,diam,
height,var,top,rand_seed)
 #local nb_sides = min_sides+floor (0.5 +
(max_sides-min_sides)*rand(rand_seed) );
 #declare angles = array [ nb_sides ]; // angles
 #declare bases  = array [ nb_sides ];
 #declare mi_hauteurs = array [ nb_sides ];
 #declare mi_profondeurs = array[ nb_sides ];
 #declare sommets = array [ nb_sides ] ;
 #declare fonds   = array [ nb_sides ];

 // some random values
 #local i=0;
 #while (i<nb_sides)
  #declare angles[i]=rand(rand_seed) * 360;
  #declare i=i+1;
 #end


 // sort them
 #local i=0;
 #while (i < nb_sides - 1 )
  #local j=i+1;
  #while (j < nb_sides )
   #if (angles[i]>angles[j])
    #local temp = angles[i];
    #declare angles[i]=angles[j];
    #declare angles[j]=temp;
   #end //if

   #declare j=j+1;
  #end // while (j

  #declare i=i+1;
 #end // while (i


 #local i=0;
 #while (i<nb_sides)

  #declare bases[i] = vrotate( < 0,0,diam>, <0,angles[i],0 >);
  #declare mi_hauteurs[i]=bases[i]+<0,height+rand(rand_seed)*var,0>;
  #declare mi_profondeurs[i]=bases[i]-<0,height+rand(rand_seed)*var,0>;

  #declare i=i+1;
 #end

 mesh
  {
   #local i=0;
   #while (i<nb_sides)
    triangle {
mi_profondeurs[i],mi_hauteurs[i],mi_hauteurs[mod(i+1,nb_sides)] }
    triangle { mi_profondeurs[i],mi_profondeurs[mod(i+1,nb_sides)],
mi_hauteurs[mod(i+1,nb_sides)] }
    #declare i=i+1;
   #end

   // sommets

   #declare sommets = bases ;
   #local random_vect = vrotate(<0,0,10>,rand(rand_seed)*360); // some
vector in the x-z plane
   #local random_angle = rand(rand_seed)*15;

   #local i=0;
   #while (i<nb_sides)
    #declare sommets[i]=vaxis_rotate(sommets[i]/2,random_vect,random_angle)
+ <0,top,0>;
    #declare i=i+1;
   #end

   #local i=0;
   #while (i<nb_sides)
    triangle { sommets[i],mi_hauteurs[i],mi_hauteurs[mod(i+1,nb_sides)] }
    triangle { sommets[i],sommets[mod(i+1,nb_sides)],
mi_hauteurs[mod(i+1,nb_sides)] }
    #local i=i+1;
   #end

   #local i=0;
   #while (i<nb_sides)
    triangle { sommets[0],sommets[i],sommets[mod(i+1,nb_sides)] }
    #local i=i+1;
   #end

   // fonds

   #declare fonds = bases ;
   #local random_vect = vrotate(<0,0,10>,rand(rand_seed)*360); // some
vector in the x-z plane
   #local random_angle = rand(rand_seed)*15;

   #local i=0;
   #while (i<nb_sides)
    #declare fonds[i]=vaxis_rotate(fonds[i]/2,random_vect,random_angle) -
<0,top,0>;
    #local i=i+1;
   #end

   #local i=0;
   #while (i<nb_sides)
    triangle {
fonds[i],mi_profondeurs[i],mi_profondeurs[mod(i+1,nb_sides)] }
    triangle { fonds[i],mi_profondeurs[mod(i+1,nb_sides)],
fonds[mod(i+1,nb_sides)] }
    #local i=i+1;
   #end

   #local i=0;
   #while (i<nb_sides)
    triangle { fonds[0],fonds[i],fonds[mod(i+1,nb_sides)] }
    #local i=i+1;
   #end


  } // mesh
#end // macro


Post a reply to this message

Copyright 2003-2023 Persistence of Vision Raytracer Pty. Ltd.