POV-Ray : Newsgroups : povray.binaries.images : Helical SDF for Isosurfaces : Re: Helical SDF for Isosurfaces Server Time
4 Jan 2025 18:10:54 EST (-0500)
  Re: Helical SDF for Isosurfaces  
From: Chris R
Date: 26 Dec 2024 10:00:00
Message: <web.676d6eaf4a98c6d64d6accde5cc1b6e@news.povray.org>
"Tor Olav Kristensen" <tor### [at] TOBEREMOVEDgmailcom> wrote:
> "Tor Olav Kristensen" <tor### [at] TOBEREMOVEDgmailcom> wrote:
> > "Chris R" <car### [at] comcastnet> wrote:
> > >...
> > > I got it to work by making the following change:
> > >
> > > #declare natan2 = function(a,b) { select(a, 2*pi+atan2(a,b), atan2(a,b)) }
> > > #declare Theta = function {((natan2 (y, z))/pi)*tau + x*tau}
> > >
> > > The problem is that atan2 has that discontinuity where it jumps from pi/2 to
> > > -pi/2, ...
> >
> > Hi Chris
> >
> > I think that should be "from +pi to -pi".
> >
> > I would also suggest that you define your new atan2() function like this;
> >
> > #declare natan2 =
> >     function(a, b) {
> >         atan2(a, b) + select(a, 2*pi, 0)
> >     }
> > ;
> >
> > It makes what happens a little bit clearer at the expense of an extra addition.
>
> I just noticed that both these variants have a little problem:
> They have a discontinuity at a = -0
>
> natan2(+1e-100, -1) = +3.141592653589793
> natan2(     +0, -1) = +3.141592653589793
> natan2(     -0, -1) = -3.141592653589793
> natan2(-1e-100, -1) = +3.141592653589793
>
> This variant does not have this problem:
>
> #declare natan2 =
>     function(a, b) {
>         mod(atan2(a, b) + 2*pi, 2*pi)
>     }
> ;
>
> --
> Tor Olav
> http://subcube.com
> https://github.com/t-o-k

Good catch!

I actually modified f_normalized_atan2 as follows:

#declare f_normalized_atan2 = function(x,y) {
    select(x,
        tau + atan2(x,y),
        pi,
        atan2(x,y)
    )
}

It's infinitesimally more efficient because you don't have to calculate
atan2(+/-0,N), and gets rid of the mod arithmetic and addition where it isn't
needed.

-- Chris R


Post a reply to this message

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