POV-Ray : Newsgroups : povray.advanced-users : Math help : Re: Math help Server Time
1 Jul 2024 04:56:10 EDT (-0400)
  Re: Math help  
From: SharkD
Date: 24 Sep 2009 22:53:19
Message: <4abc309f$1@news.povray.org>
clipka wrote:
> SharkD schrieb:
>> The following function transforms a sphere such that it is expanded
>> logarithmically along the y axis. What I would like to do next is to
>> expand a sphere based on its distance from the origin instead. Any 
>> ideas? Of course, if the sphere is located a the origin like my 
>> example it will still look like a sphere.
> 
> You'd need to (a) define the center of the sphere, (b) compute the 
> desired radius from the distance to the origin, (c) redefine your 
> Temp_fnc1 to take into account a radius, and (e) offset the parameters 
> to Temp_fnc1 by the center, as in:
> 
> #local Center = <...>; // (a)
> #local Radius = log(vlength(Center)+1) / log(2); // (b)
> #local Temp_fnc1 = function
> {
>     1 - min(1, sqrt(x*x + y*y + z*z)/Radius) // (c)
> }
> #local Temp_fnc3 = function
> {
>     Temp_fnc1(x-Center.x,y-Center.y,z-Center.z) // (d)
> }
> 
> I guess this definition for Temp_fnc3 might run into problems though, 
> due to POV-Ray's general inability to use vector stuff in functions; you 
> may need to define temporary variables for the Center vector components, 
> as in:
> 
> #local CenterX = Center.x;
> #local CenterY = Center.y;
> #local CenterZ = Center.z;
> #local Temp_fnc3 = function
> {
>     Temp_fnc1(x-CenterX,y-CenterY,z-CenterZ)
> }
> 
> 
> Note that this will produce just a single sphere. To get multiples of 
> them, you might want to add multiple instances of that function, as in:
> 
> #macro Temp_Fnc(Center)
>   #local Radius = log(vlength(Center)+1)
>   #local Temp_fnc1 = function
>   {
>     1 - min(1, sqrt(x*x + y*y + z*z)/Radius)
>   }
>   #local CenterX = Center.x;
>   #local CenterY = Center.y;
>   #local CenterZ = Center.z;
>   ( Temp_fnc1(x-CenterX,y-CenterY,z-CenterZ) )
> #end
> 
> #local Temp_fnc3 = function
> {
>   Temp_Fnc(<0,1,0>) +
>   Temp_Fnc(<0,3,0>) +
>   Temp_Fnc(<0,10,0>) +
>   ...
> }

I finally got around to trying this, and it didn't produce the results I 
want. The main problem as I see it is that the Sphere parameter is 
defined outside the function and stores only a single parameter.

-Mike


Post a reply to this message

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