POV-Ray : Newsgroups : povray.advanced-users : Integration of Gradient functions. Fun with gradients :P : Integration of Gradient functions. Fun with gradients :P Server Time
28 Jul 2024 22:16:41 EDT (-0400)
  Integration of Gradient functions. Fun with gradients :P  
From: Pyry
Date: 3 Sep 2003 04:00:02
Message: <web.3f559df779434d6b1f55322c0@news.povray.org>
I've been trying to get the inverse function of fn_Gradient_Directional(s)
and I think I finaly got it and here it is (named it fn_Integradient, just
copy it to your math.inc and it should work like the rest of the
Gradient-functions):






//Inverse of gradient_dir functions as a function by:Pyry Pakkanen
//_fn_Gradient_X;Y;Z is the vector-function component of the gradient at
//that point of space
//_Interations must even(2,4,6,20,100 etc.) It is not checked just in case
//someone wants to experiment with it :P
//High _Interations produces more accturate results but will be slower
//The method(Simpson) used is quite slow and does not always produce wanted
//results.
//(for example _fn_Gradient_X = function{y} _fn_Gradient_Y = function{0}
//creates a gradient in the y direction[wich should be zero] for the result
//function )
//anything like 1/x does not work because its infinite at <0,0,0> You'll
//have to move your gradient functions away from <0,0,0> first and move them
//back for the final function
//exapmle of usage:
/*
//Sphere with a noisy surface without "bubbles" that noise added to
//functions usually produces (the gradient of the noise gets higher than the
//gradient of the function)
//this is fixed by making the gradient of noise porpotional to the gradient
//of the function
#declare TTx =function{x/f_r(x,y,z)*pow(f_noise3d(x*4,y*4,z*4),3)*6};
#declare TTy =function{y/f_r(x,y,z)*pow(f_noise3d(x*4,y*4+100,z*4),3)*6};
#declare TTz =function{z/f_r(x,y,z)*pow(f_noise3d(x*4,y*4,z*4+100),3)*6};

#declare TT = fn_Integradient(TTx,TTy,TTz,40);//quite high _Interations
//have to be used
//Now TT(x,y,z)-1 can be used to make an isosurface (it looks like blobby
//combination of spikes)
//
*/

#macro
fn_Integradient(_fn_Gradient_X,_fn_Gradient_Y,_fn_Gradient_Z,_Interations)

function{0 //start at zero
 #local _C = 1;
  +(
   _fn_Gradient_X(x/_Interations,y/_Interations,z/_Interations)*x+
   _fn_Gradient_Y(x/_Interations,y/_Interations,z/_Interations)*y+
   _fn_Gradient_Z(x/_Interations,y/_Interations,z/_Interations)*z
   )/_Interations/3
 #while(_C<_Interations-1)
 #local _C = _C+1;
 +(
   _fn_Gradient_X(x*_C/_Interations,y*_C/_Interations,z*_C/_Interations)*x+
   _fn_Gradient_Y(x*_C/_Interations,y*_C/_Interations,z*_C/_Interations)*y+
   _fn_Gradient_Z(x*_C/_Interations,y*_C/_Interations,z*_C/_Interations)*z
   )/_Interations*4/3
 #local _C = _C+1;
 +(
   _fn_Gradient_X(x*_C/_Interations,y*_C/_Interations,z*_C/_Interations)*x+
   _fn_Gradient_Y(x*_C/_Interations,y*_C/_Interations,z*_C/_Interations)*y+
   _fn_Gradient_Z(x*_C/_Interations,y*_C/_Interations,z*_C/_Interations)*z
   )/_Interations*2/3
 #end
  +(
   _fn_Gradient_X(x,y,z)*x+
   _fn_Gradient_Y(x,y,z)*y+
   _fn_Gradient_Z(x,y,z)*z
   )/_Interations/3
}
#end //fn_Integradient
/*
//Non simpson method
#macro
fn_Integradient(_fn_Gradient_X,_fn_Gradient_Y,_fn_Gradient_Z,_Interations)

function{0
 #local _C = 0;
 #while(_C<_Interations)
 #local _C = _C+1;
 +(
   _fn_Gradient_X(x*_C/_Interations,y*_C/_Interations,z*_C/_Interations)*x+
   _fn_Gradient_Y(x*_C/_Interations,y*_C/_Interations,z*_C/_Interations)*y+
   _fn_Gradient_Z(x*_C/_Interations,y*_C/_Interations,z*_C/_Interations)*z
   )/_Interations
 #end
}
#end //fn_Integradient
*/


Post a reply to this message

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