|
|
|
|
|
|
| |
| |
|
|
|
|
| |
| |
|
|
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
|
|
| |
| |
|
|
From: JC (Exether)
Subject: Re: Integration of Gradient functions. Fun with gradients :P
Date: 4 Sep 2003 11:41:46
Message: <3f575d3a@news.povray.org>
|
|
|
| |
| |
|
|
Cool, stuff but I fear it's a lot of fun the CPU too ... :-)
JC
Pyry wrote:
> 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
|
|
| |
| |
|
|
|
|
| |
|
|