| 
  | 
Lonnie Ezell wrote:
> 
> I originally posted this in povray.advanced-users, and they suggested I post
> it here.
> 
> I have what I believe is a working 2D Perlin Noise macro. Eventually I hope
> to have 1D, 2D, 3D & 4D macros. After solving a number of small bugs in the
> script when I try to use it, POV crashes on me. I've tried reinstalling and
> the same results.
> 
> Could someone look it over for me to see if you can spot what's wrong.
See code below and my comments in povray.advanced-users
-- 
Best regards,
Tor Olav
mailto:tor### [at] hotmail com
http://www.crosswinds.net/~tok/tokrays.html
// ===== 1 ======= 2 ======= 3 ======= 4 ======= 5 ======= 6 ======= 7
#version 3.1;
#include "colors.inc"
// ===== 1 ======= 2 ======= 3 ======= 4 ======= 5 ======= 6 ======= 7
#macro LinearInterpolate(A, B, M_x)
  (A*(1 - M_x) + B*M_x)
#end // macro LinearInterpolate
#macro CosineInterpolate(A, B, M_x)
  LinearInterpolate(A, B, (1 - cos(M_x*pi))/2)
#end // macro CosineInterpolate
#macro CubicInterpolate(V0, V1, V2, V3, M_x)
  #local P = V3 - V2 - V0 + V1;
  #local Q = V0 - V1 - P;
  #local R = V2 - V0;
  #local S = V1; 
  
  (P*pow(M_x, 3) + Q*pow(M_x, 2) + R*M_x + S)
#end // macro CubicInterpolate
                 
	                                      
#macro NOISE_Init(N, SeedArray)
  #local NrOfOctaves = dimension_size(SeedArray, 1);
  #declare SeedArray[0] = seed(N);
  #local I = 1;
  #while (I < NrOfOctaves)
    #declare SeedArray[I] = seed(N*I*pow(I + 1, 2)/(I + 2));
    #local I = I + 1;
  #end
#end // macro NOISE_Init
// This macro should be rewritten
#macro NOISE_Rand_2D(M_x, M_y, Octave, SeedArray)
  (rand(SeedArray[Octave])*M_x + rand(SeedArray[Octave])*M_y)/2
#end // macro NOISE_Rand_2D
	                                      
#macro NOISE_Smooth_2D(M_x, M_y, Octave, SeedArray)
  #local Corners =
    NOISE_Rand_2D(M_x - 1, M_y - 1, Octave, SeedArray) +
    NOISE_Rand_2D(M_x + 1, M_y - 1, Octave, SeedArray) +
    NOISE_Rand_2D(M_x - 1, M_y + 1, Octave, SeedArray) +
    NOISE_Rand_2D(M_x + 1, M_y + 1, Octave, SeedArray);
  #local Sides =
    NOISE_Rand_2D(M_x - 1, M_y,     Octave, SeedArray) + 
    NOISE_Rand_2D(M_x + 1, M_y,     Octave, SeedArray) +
    NOISE_Rand_2D(M_x,     M_y - 1, Octave, SeedArray) +
    NOISE_Rand_2D(M_x,     M_y + 1, Octave, SeedArray);
  #local Center =
    NOISE_Rand_2D(M_x,     M_y,     Octave, SeedArray);
                              
  (Corners/16 + Sides/8 + Center/4)
#end // macro NOISE_Smooth_2D
#macro NOISE_Interp_2D(M_x, M_y, Octave, SeedArray)
  #local Int_x  = int(M_x);
  #local Frac_x = M_x - Int_x;
  #local Int_y  = int(M_y);
  #local Frac_y = M_y - Int_y;
   
  #local V1 = NOISE_Smooth_2D(Int_x,     Int_y,     Octave, SeedArray);
  #local V2 = NOISE_Smooth_2D(Int_x + 1, Int_y,     Octave, SeedArray);
  #local V3 = NOISE_Smooth_2D(Int_x,     Int_y + 1, Octave, SeedArray);
  #local V4 = NOISE_Smooth_2D(Int_x + 1, Int_y + 1, Octave, SeedArray);
   
  #local I1 = CosineInterpolate(V1, V2, Frac_x);
  #local I2 = CosineInterpolate(V3, V4, Frac_x);
   
  CosineInterpolate(I1, I2, Frac_y)
#end // macro NOISE_Interp_2D
#macro NOISE_Noise_2D(M_x, M_y, Persist, SeedArray)
  #local NrOfOctaves = dimension_size(SeedArray, 1);
  #local Total = 0;
  #local I = 0;
  #while(I < NrOfOctaves)
    #local Freq = pow(2, I);
    #local Ampl = pow(Persist, I);  
    #local Total = 
      Total + Ampl*NOISE_Interp_2D(M_x*Freq, M_y*Freq, I, SeedArray);
    #local I = I + 1;
  #end    
   
  Total   
#end // macro NOISE_Noise_2D
// ===== 1 ======= 2 ======= 3 ======= 4 ======= 5 ======= 6 ======= 7
#declare NOISE_Octaves = 2;
#declare NOISE_Persistence = 0.5;
#declare AnyNumber = 12345;
// ===== 1 ======= 2 ======= 3 ======= 4 ======= 5 ======= 6 ======= 7
#declare NOISE_SeedArray = array[NOISE_Octaves]
NOISE_Init(AnyNumber, NOISE_SeedArray)
#declare Xnr = 10;
#declare Znr = 10;
union {
  #declare I = 0;
  #while (I < Xnr)
    #declare J = 0;
    #while (J < Znr)
      #declare Perlin = 
        NOISE_Noise_2D(I, J, NOISE_Persistence, NOISE_SeedArray);
      box {
        -<1, 1, 1>/2,
         <1, 1, 1>/2
        pigment { color <0, Perlin, 0> }
        translate <I, 0, J>
      }
      #declare J = J + 1;
    #end // while         
    #declare I = I + 1;
  #end // while
  translate (<1, 0, 1> - <Xnr, 0, Znr>)/2
}
light_source {
  <0, 60, 0>
  color White
}                             
camera {
  location <0, 15, 0>
  look_at <0, 0, 0>
}                     
// ===== 1 ======= 2 ======= 3 ======= 4 ======= 5 ======= 6 ======= 7
 
 Post a reply to this message 
 | 
  |