POV-Ray : Newsgroups : povray.beta-test : Buglist 22 Apr 2002 (RC2) : Re: Buglist 22 Apr 2002 (RC2) Server Time
29 Jul 2024 20:23:07 EDT (-0400)
  Re: Buglist 22 Apr 2002 (RC2)  
From: Christoph Hormann
Date: 23 Apr 2002 07:42:00
Message: <3CC54881.BC5FFDD5@gmx.de>
Warp wrote:
> 
>   It would be really nice to get a short (and undivided) example code that
> demonstrates this. It's not nice to have to get some include file from
> somewhere.

All right, but i'm afraid it's no more that short then.

// BEGIN POV-Code

camera {
  location <0.2,0.2,-1>  
  look_at  <0,0,0>
  right (4/3)*x                
} 

light_source {     
  <1000, 2500, -5000> 
  color rgb 1.2
}     
                              
#include "transforms.inc" 

#declare IC_Arr=array[12] 

#macro IC_Merge_Array(Array)
  #local Size=dimension_size(Array,1);

  function {
    min(
      #local Counter=0;
      #while (Counter<Size)
        #if (Counter>0) , #end
          Array[Counter] (x,y,z)
        #local Counter=Counter+1;
      #end
    )
  }
#end  


#macro IC_Matrix (Fn, Mtrx)  

  function {
    Fn(x*Mtrx[0][0] + y*Mtrx[0][1] + z*Mtrx[0][2],
       x*Mtrx[1][0] + y*Mtrx[1][1] + z*Mtrx[1][2],
       x*Mtrx[2][0] + y*Mtrx[2][1] + z*Mtrx[2][2])
  }
#end

#macro IC_RotateR (Fn, Vect)
  #local Vect=Vect+<0,0,0>;

  #local Cx=-Vect.x;
  #local Cy=-Vect.y;
  #local Cz=-Vect.z;

  #local MtrxA=array[3][3]
  #local MtrxB=array[3][3]
  #local MtrxC=array[3][3]

  #local MtrxA[0][0] = 1.0;
  #local MtrxA[0][1] = 0;
  #local MtrxA[0][2] = 0;
  #local MtrxA[1][0] = 0;
  #local MtrxA[1][1] = cos(Cx);
  #local MtrxA[1][2] = -sin(Cx);
  #local MtrxA[2][0] = 0;
  #local MtrxA[2][1] = sin(Cx);
  #local MtrxA[2][2] = cos(Cx);

  #local MtrxB[0][0] = cos(Cy);
  #local MtrxB[0][1] = 0;
  #local MtrxB[0][2] = sin(Cy);
  #local MtrxB[1][0] = 0;
  #local MtrxB[1][1] = 1;
  #local MtrxB[1][2] = 0;
  #local MtrxB[2][0] = -sin(Cy);
  #local MtrxB[2][1] = 0;
  #local MtrxB[2][2] = cos(Cy);

  #local MtrxC[0][0] = cos(Cz);
  #local MtrxC[0][1] = -sin(Cz);
  #local MtrxC[0][2] = 0;
  #local MtrxC[1][0] = sin(Cz);
  #local MtrxC[1][1] = cos(Cz);
  #local MtrxC[1][2] = 0;
  #local MtrxC[2][0] = 0;
  #local MtrxC[2][1] = 0;
  #local MtrxC[2][2] = 1;

  #local fn_X=IC_Matrix (function(x, y, z){ Fn(x, y, z) }, MtrxA)
  #local fn_Y=IC_Matrix (function(x, y, z){ fn_X(x, y, z) }, MtrxB)

  IC_Matrix (function(x, y, z){ fn_Y(x, y, z) }, MtrxC)

#end

#macro IC_Rotate (Fn, Vect) 
  #local Vect=Vect+<0,0,0>;

  #local Cx=(Vect.x/180)*pi;
  #local Cy=(Vect.y/180)*pi;
  #local Cz=(Vect.z/180)*pi;
  IC_RotateR (function(x, y, z){ Fn(x, y, z) }, <Cx, Cy, Cz>)
#end

#macro IC_Cone (Start, Radius1, End, Radius2)
  #local Start=Start+<0,0,0>;

  #local Cx=Start.x;
  #local Cy=Start.y;
  #local Cz=Start.z;

  #local Len=vlength(End-Start);

  #if (Len=0)
    #error "iso_csg.inc: Error: zero height cone"
  #end

  #local fn_T=function { Reorient_Trans(End-Start, x)  }

  #local fn_X=function(x, y, z){
    max(sqrt(y^2 + z^2) - Radius1+x*((Radius1-Radius2)/Len), -x, x-Len)
  }
  #local fn_Y=
  function(x, y, z){
    fn_X(fn_T(x, y, z).x,
         fn_T(x, y, z).y,
         fn_T(x, y, z).z)
  }

  function {
    (fn_Y((x-Cx),(y-Cy),(z-Cz)))
  }
#end

#declare IC_Arr=array[12]

#macro IC_Merge_Array(Array)  
  #local Size=dimension_size(Array,1);

  function {
    min(
      #local Counter=0;
      #while (Counter<Size)
        #if (Counter>0) , #end
          Array[Counter] (x,y,z)
        #local Counter=Counter+1;
      #end
    )
  }
#end

#declare IC_Arr[0]=IC_Cone(0, 0, x+y, 1)                     
#declare IC_Arr[1]=IC_Rotate(IC_Arr[0], 30*z)                   
#declare IC_Arr[2]=IC_Rotate(IC_Arr[1], 60*z)
#declare IC_Arr[3]=IC_Rotate(IC_Arr[2], 90*z)
#declare IC_Arr[4]=IC_Rotate(IC_Arr[3], 120*z)
#declare IC_Arr[5]=IC_Rotate(IC_Arr[4], 150*z)     
#declare IC_Arr[6]=IC_Rotate(IC_Arr[5], 180*z)
#declare IC_Arr[7]=IC_Rotate(IC_Arr[6], 210*z)
#declare IC_Arr[8]=IC_Rotate(IC_Arr[7], 240*z)      
#declare IC_Arr[9]=IC_Rotate(IC_Arr[8], 270*z)    
#declare IC_Arr[10]=IC_Rotate(IC_Arr[9], 300*z)      
#declare IC_Arr[11]=IC_Rotate(IC_Arr[10], 330*z)   

#declare fn_XX= IC_Merge_Array(IC_Arr) 

isosurface
{                                                                                     
  function { fn_XX(x, y, z) }  
  max_gradient 1.6 
  contained_by { box { -2, 2 } }
  pigment { rgb <0, 0.2, 1.1> } 
  finish { specular 0.3 } 
  scale 0.1
} 

// END POV-Code


-- 
POV-Ray tutorials, IsoWood include,                 
TransSkin and more: http://www.tu-bs.de/~y0013390/  
Last updated 20 Apr. 2002 _____./\/^>_*_<^\/\.______


Post a reply to this message

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