POV-Ray : Newsgroups : povray.binaries.images : Sphere Sponge : Re: Sphere Sponge Server Time
1 Aug 2024 06:18:11 EDT (-0400)
  Re: Sphere Sponge  
From: Dre
Date: 27 Oct 2008 20:03:12
Message: <490656c0$1@news.povray.org>
"Jonathan Hunt" <jon### [at] xlcuscom> wrote in message 
news:49064f8c@news.povray.org...
> Thanks for the nice comments.  Here's some information for those 
> interested in the structure of the object.
>
> I started with my non-recursive Menger Sponger isosurface function...
>
> function
> {
>  max
>  (
>   #declare Level = 4;
>   #declare Size = 0.5;
>   #while (Level > 0)
>    #declare Size = Size / 3;
>    min(Size-abs(mod(x,Size*6)-Size*3),Size-abs(mod(y,Size*6)-Size*3)),
>    min(Size-abs(mod(y,Size*6)-Size*3),Size-abs(mod(z,Size*6)-Size*3)),
>    min(Size-abs(mod(z,Size*6)-Size*3),Size-abs(mod(x,Size*6)-Size*3))
>    #declare Level = Level - 1;
>    #if (Level > 0) , #end
>   #end
>  )
> }
>
>
>
> Contained and chopped the corners off with further "max" constraints to 
> form a cuboctahedron...
>
> #declare Sponge = function
> {
>  max
>  (
>   #declare Level = 4;
>   #declare Size = 0.5;
>   #while (Level > 0)
>    #declare Size = Size / 3;
>    min(Size-abs(mod(x,Size*6)-Size*3),Size-abs(mod(y,Size*6)-Size*3)),
>    min(Size-abs(mod(y,Size*6)-Size*3),Size-abs(mod(z,Size*6)-Size*3)),
>    min(Size-abs(mod(z,Size*6)-Size*3),Size-abs(mod(x,Size*6)-Size*3)),
>    #declare Level = Level - 1;
>   #end
>   x-1, -x,
>   y-1, -y,
>   z-1, -z,
>
>   -x+y-z-0.5,
>   +x+y-z-1.5,
>   -x-y-z+0.5,
>   +x-y-z-0.5,
>   -x+y+z-1.5,
>   +x+y+z-2.5,
>   -x-y+z-0.5,
>   +x-y+z-1.5
>  )
> }
>
>
> Then made a mapping that transformed any coordinate within a sphere to a 
> coordinate within the cuboctahedron such that any point on the surface of 
> the sphere would also fall on the surface of the cuboctahedron...
>
> #declare SphereTransX = function { x * sqrt(x*x+y*y+z*z) / 
> max(abs(x),abs(y),abs(z),(abs(x)+abs(y)+abs(z))/2) }
> #declare SphereTransY = function { y * sqrt(x*x+y*y+z*z) / 
> max(abs(x),abs(y),abs(z),(abs(x)+abs(y)+abs(z))/2) }
> #declare SphereTransZ = function { z * sqrt(x*x+y*y+z*z) / 
> max(abs(x),abs(y),abs(z),(abs(x)+abs(y)+abs(z))/2) }
>
>
> From there I could simply define my Sphere Sponge as...
>
> #declare SphereSponge = isosurface
> {
>  function
>  {
>   Sponge
>   (
>    SphereTransX(x-0.5,y-0.5,z-0.5)+0.5,
>    SphereTransY(x-0.5,y-0.5,z-0.5)+0.5,
>    SphereTransZ(x-0.5,y-0.5,z-0.5)+0.5
>   )
>  }
>  contained_by { sphere { 0.5, 0.5 } }
> }

Great, thanks for that, I'm going to have a play with that later tonight!

Cheers Dre


Post a reply to this message

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