POV-Ray : Newsgroups : povray.newusers : Isosurface and f_spiral - bug or feature? Server Time21 Sep 2023 22:29:38 EDT (-0400)
 Isosurface and f_spiral - bug or feature? (Message 1 to 10 of 23)
 From: Ronkhar Subject: Isosurface and f_spiral - bug or feature? Date: 24 Sep 2017 13:25:01 Message:
```
{
"@context": "https://schema.org",
"@type": "DiscussionForumPosting",
"@id": "#web.59c7e943ff4768ea832bdcda0%40news.povray.org",
"headline": "Isosurface and f_spiral - bug or feature?",
"dateCreated": "2017-09-24T17:25:01+00:00",
"datePublished": "2017-09-24T17:25:01+00:00",
"author": {
"@type": "Person",
"name": "Ronkhar"
}
}
Hello everyone,

I'm currently playing with the isosurface and f_spiral function, and I'm
experiencing 2 curious artifacts.
I hope someone could point me in the right direction to solve this.

Image: http://ronkhar.fr/Informatique/3D/Povray_isosurface/ten_spirals.png

Problem 1: There is something like a dark sphere at the origin of the spirals
(in fact, there are ten of these spheres at the same position, 5 red and 5 black
each one created by a spiral)

Here is a smaller version of the code I wrote (1 spiral only) :
============================================================
#version 3.7;
global_settings { assumed_gamma 1 }
#include "colors.inc"
#include "transforms.inc"

light_source { <-1,8,2> color White}

camera {
location <0,4,0>
look_at  <0,0,0>
}

plane {y, 0 pigment { checker Grey, White }}

isosurface{ function{f_spiral(
x,y,z,
6,   // distance between windings,
0.2, // thickness,
2,    // outer diameter of the spiral,
0,0,  // not used,
0
)}
accuracy 0.01
threshold 0 // default value
max_gradient 37 // high value = more precision = more render time (ideal
value indicated in "messages")
contained_by{sphere{<0,0,0>,15}}
texture{pigment{ color Red filter 1 }}
}
============================================================
Image obtained:
http://ronkhar.fr/Informatique/3D/Povray_isosurface/one_spiral.png

Problem 2: Near the center, the exterior part of the spirals end with a straight
line, where I was expecting the curve to continue.

To help see the lines, I hid the central dark sphere inside a slightly bigger
white sphere
sphere{<0,-0,0>,r1 texture{pigment{ color White }}})

Here is the result:
http://ronkhar.fr/Informatique/3D/Povray_isosurface/ten_spirals_zoom_lines.png

Are these bugs, features or something wrong in my code?
Does anyone know how I could fix it?

Ronkhar
```
 From: Bald Eagle Subject: Re: Isosurface and f_spiral - bug or feature? Date: 24 Sep 2017 15:00:01 Message:
```
{
"@context": "https://schema.org",
"@type": "DiscussionForumPosting",
"@id": "#web.59c80047808cf4025cafe28e0%40news.povray.org",
"headline": "Re: Isosurface and f_spiral - bug or feature?",
"dateCreated": "2017-09-24T19:00:01+00:00",
"datePublished": "2017-09-24T19:00:01+00:00",
"author": {
"@type": "Person",
"name": "Bald Eagle"
}
}
"Ronkhar" <nomail@nomail> wrote:

I'm going to speculate that the darkness arises from the angle of viewing
_through_ the highly filtered texture.   The more you look through, the darker
it gets.   At extreme angles, this may add up quickly and get VERY dark.

http://life.nthu.edu.tw/~labcjw/BioPhyChem/Spectroscopy/beerslaw.htm

>    texture{pigment{ color Red filter 1 }}

> Problem 2: Near the center, the exterior part of the spirals end with a straight
> line, where I was expecting the curve to continue.

This might [also] be a matter of perspective.
I'd suggest rotating your isosurface or repositioning the camera to see if it
goes away, and what you _think_ you should see is actually there, or an illusion
or unexpected result of the texture and/or lighting.
(align your spiral so that it is symmetric around the y-axis)

I might also move the light source, and perhaps add one or two more.

http://3drender.com/light/3point.html
```
 From: omniverse Subject: Re: Isosurface and f_spiral - bug or feature? Date: 24 Sep 2017 16:25:01 Message:
```
{
"@context": "https://schema.org",
"@type": "DiscussionForumPosting",
"@id": "#web.59c81409808cf4029c5d6c810%40news.povray.org",
"headline": "Re: Isosurface and f_spiral - bug or feature?",
"dateCreated": "2017-09-24T20:25:01+00:00",
"datePublished": "2017-09-24T20:25:01+00:00",
"author": {
"@type": "Person",
"name": "omniverse"
}
}
"Ronkhar" <nomail@nomail> wrote:
>
> I'm currently playing with the isosurface and f_spiral function, and I'm
> experiencing 2 curious artifacts.

I looked at the f_spiral in source code but couldn't be sure where it creates
the initial sphere, which apparently is merely the result of the diameter used
for spiral arm.

The outer straight edge might be a result of couple things. One is that as it
tapers off due to overall size given to it there's a clipping (or rather
differencing) effect because of the "outer size" parameter.
And the other might simply be related to max_gradient.

At least that's my guess.

Bald Eagle makes a good point about the filtered transparency, although the
problem here seems to be how this spiral function does indeed create a sphere at
the origin. Same seen in version 3.6.2 and the latest 3.8 alpha.
```
 From: Kenneth Subject: Re: Isosurface and f_spiral - bug or feature? Date: 25 Sep 2017 03:10:01 Message:
```
{
"@context": "https://schema.org",
"@type": "DiscussionForumPosting",
"@id": "#web.59c8aa9f808cf402883fb31c0%40news.povray.org",
"headline": "Re: Isosurface and f_spiral - bug or feature?",
"dateCreated": "2017-09-25T07:10:01+00:00",
"datePublished": "2017-09-25T07:10:01+00:00",
"author": {
"@type": "Person",
"name": "Kenneth"
}
}
"omniverse" <omn### [at] charternet> wrote:

>
> I looked at the f_spiral in source code but couldn't be sure where it creates
> the initial sphere, which apparently is merely the result of the diameter used
> for spiral arm.

That seems to be the case, just from experimenting with the OP's test code. The
sphere diameter is some percentage of the 'thickness' parameter (maybe 100%,
although it's hard to tell.) That sphere makes me wonder what it's purpose is--
maybe it hides some other kind of anomoly at the beginning of the spiral ;-)
Otherwise, it would seem natural for the spiral shape to both begin and end at a
nice sharp point.
>
> The outer straight edge might be a result of couple things. One is that as it
> tapers off due to overall size given to it there's a clipping (or rather
> differencing) effect because of the "outer size" parameter.

Agreed (and which is different from the isosurface's own contained_by sphere.)

> And the other might simply be related to max_gradient.

Nope, that doesn't affect the 'inner' straight-line anomoly. It's actually just
an optical illusion (which took me awhile to figure out-- I had to rotate the
spiral around in an animation, to see the true cause.) The 'straight line' is
just the join-line between the OP's 'square' spiral shape and the center sphere,
where they blend together ('blend' is probably the wrong word.) In other words,
it just a result of the different geometries. It is naturally more pronounded as
the 'thickness' value increases...and actually appears worse when using a
'round' shape for the spiral. The OP's original image of multiple stacked
spirals (with transmit 1 in the colors, as well as the camera position) was
making the problem hard to see.

Here's my re-worked test code, with only a few minor changes. It's a close-up of
the center sphere. Comment-out both of the rotations at the end, to see the
'straight-line' effect.

#version 3.7;
global_settings { assumed_gamma 1 }
#include "colors.inc"
#include "transforms.inc"

light_source { <-1,8,3> color White}

camera {
perspective
location  <0, 12, 0>
look_at   <0, 0, .1>
right     x*image_width/image_height
angle 4 // 15 or 4
}

plane {y, -20 pigment { checker Grey, White}}

isosurface{ function{f_spiral(x,y,z,
6,   // distance between windings-- 6
.2, // thickness-- .2
2.0,    // outer radius of the spiral-- 2
0,  // not used
0,  // not used
0   // cross-section type-- 0 for square. Or 1.0 for round.
)}
accuracy 0.001
threshold 0
contained_by{sphere{<0,0,0>,3}} // [originally <0,0,0>,15 -- too big]
texture{pigment{ color Red}}
rotate 30*x
rotate 30*z
}
```
 From: Kenneth Subject: Re: Isosurface and f_spiral - bug or feature? Date: 25 Sep 2017 03:35:01 Message:
```
{
"@context": "https://schema.org",
"@type": "DiscussionForumPosting",
"@id": "#web.59c8b089808cf402883fb31c0%40news.povray.org",
"headline": "Re: Isosurface and f_spiral - bug or feature?",
"dateCreated": "2017-09-25T07:35:01+00:00",
"datePublished": "2017-09-25T07:35:01+00:00",
"author": {
"@type": "Person",
"name": "Kenneth"
}
}
"Kenneth" <kdw### [at] gmailcom> wrote:
>
> The OP's original image of multiple stacked
> spirals (with transmit 1 in the colors...

Sorry; I meant filter 1 in the colors.

And the rotations at the end should be...
rotate 30*x
rotate -30*z
....for a better illustration of the effect.. which also shows some additional
straight-line segments or surfaces. I have no clue as to what they are; more
optical illusions?
```
 From: Ronkhar Subject: Re: Isosurface and f_spiral - bug or feature? Date: 29 Sep 2017 10:35:00 Message:
```
{
"@context": "https://schema.org",
"@type": "DiscussionForumPosting",
"@id": "#web.59ce596f808cf402832bdcda0%40news.povray.org",
"headline": "Re: Isosurface and f_spiral - bug or feature?",
"dateCreated": "2017-09-29T14:35:00+00:00",
"datePublished": "2017-09-29T14:35:00+00:00",
"author": {
"@type": "Person",
"name": "Ronkhar"
}
}
Hello,

I watched the animation with the rotations suggested by Kenneth and it's really
useful in seing the real shape of the spiral. I'll try to remember this trick in
the future.

Regarding omniverse message, where did you find the f_spiral source code,
I searched *.ini *.pov and *.inc files for "f_spiral" and "internal", but the
occurrences did not look like a mathematical definition of the spiral.
Did I miss something?
Or is it in the source code located at github and it's only in binary form in
the windows executable?

Bye
Ronkhar
```
 From: Bald Eagle Subject: Re: Isosurface and f_spiral - bug or feature? Date: 29 Sep 2017 11:55:00 Message:
```
{
"@context": "https://schema.org",
"@type": "DiscussionForumPosting",
"@id": "#web.59ce6c33808cf402c437ac910%40news.povray.org",
"headline": "Re: Isosurface and f_spiral - bug or feature?",
"dateCreated": "2017-09-29T15:55:00+00:00",
"datePublished": "2017-09-29T15:55:00+00:00",
"author": {
"@type": "Person",
"name": "Bald Eagle"
}
}
"Ronkhar" <nomail@nomail> wrote:

> Or is it in the source code located at github and it's only in binary form in
> the windows executable?

It's in the source code.
There are a lot of very cool functions in there, and lots to learn just by
seeing some of them are implemented.
```
 From: Bald Eagle Subject: Re: Isosurface and f_spiral - bug or feature? Date: 29 Sep 2017 13:00:01 Message:
```
{
"@context": "https://schema.org",
"@type": "DiscussionForumPosting",
"@id": "#web.59ce7b04808cf402c437ac910%40news.povray.org",
"headline": "Re: Isosurface and f_spiral - bug or feature?",
"dateCreated": "2017-09-29T17:00:01+00:00",
"datePublished": "2017-09-29T17:00:01+00:00",
"author": {
"@type": "Person",
"name": "Bald Eagle"
}
}
This is from the 3.7-stable source:

DBL f_spiral(FPUContext *ctx, DBL *ptr, unsigned int) // 64
{
DBL r, r2, th, temp;
/* spiral shape                *
*                             */
r = sqrt(PARAM_X * PARAM_X + PARAM_Z * PARAM_Z);
if ((PARAM_X == 0) && (PARAM_Z == 0))
PARAM_X = 0.000001;
th = atan2(PARAM_Z, PARAM_X);
r = r + PARAM(0) * th / TWO_M_PI;
r2 = fmod(r, PARAM(0)) - PARAM(0) * 0.5;

if (PARAM(5) == 1)
r2 = sqrt(r2 * r2 + PARAM_Y * PARAM_Y);
else if (PARAM(5) != 0)
{
temp = 2 / PARAM(5);
r2 = pow((pow(fabs(r2), temp) + pow(fabs(PARAM_Y), temp)), 1. / temp);
}
else
r2 = max(fabs(r2), fabs(PARAM_Y));

r = sqrt(PARAM_X * PARAM_X + PARAM_Y * PARAM_Y + PARAM_Z * PARAM_Z);

return (-min(PARAM(2) - r, PARAM(1) - min(r2, r)));
}
```
 From: omniverse Subject: Re: Isosurface and f_spiral - bug or feature? Date: 29 Sep 2017 13:45:02 Message:
```
{
"@context": "https://schema.org",
"@type": "DiscussionForumPosting",
"@id": "#web.59ce866f808cf4029c5d6c810%40news.povray.org",
"headline": "Re: Isosurface and f_spiral - bug or feature?",
"dateCreated": "2017-09-29T17:45:02+00:00",
"datePublished": "2017-09-29T17:45:02+00:00",
"author": {
"@type": "Person",
"name": "omniverse"
}
}
"Bald Eagle" <cre### [at] netscapenet> wrote:
> This is from the 3.7-stable source:
>
> DBL f_spiral(FPUContext *ctx, DBL *ptr, unsigned int) // 64

I'm glad you posted it, I was afraid of breaking a law about posting program
code. LOL

Still don't see where it produces the central sphere, not that I would be able
to guess anyhow but I thought maybe the r= before all the 'if' switching takes
place. Except r looks like the spiral shape not sphere size...?

I shouldn't even try to guess.  :)
```
 From: Bald Eagle Subject: Re: Isosurface and f_spiral - bug or feature? Date: 29 Sep 2017 15:15:00 Message:
```
{
"@context": "https://schema.org",
"@type": "DiscussionForumPosting",
"@id": "#web.59ce9b17808cf402c437ac910%40news.povray.org",
"headline": "Re: Isosurface and f_spiral - bug or feature?",
"dateCreated": "2017-09-29T19:15:00+00:00",
"datePublished": "2017-09-29T19:15:00+00:00",
"author": {
"@type": "Person",
"name": "Bald Eagle"
}
}
DBL f_spiral(FPUContext *ctx, DBL *ptr, unsigned int fn); // 64
.....
{ f_spiral,                  6 + 3 }, // 64
.....

DBL f_spiral (FPUContext *ctx, DBL *ptr, unsigned int) // 64

{
DBL r, r2, th, temp;

r = sqrt(PARAM_X * PARAM_X + PARAM_Z * PARAM_Z);
if ((PARAM_X == 0) && (PARAM_Z == 0))
PARAM_X = 0.000001;
th = atan2(PARAM_Z, PARAM_X);
r = r + PARAM(0) * th / TWO_M_PI;
r2 = fmod(r, PARAM(0)) - PARAM(0) * 0.5;

if (PARAM(5) == 1)
r2 = sqrt(r2 * r2 + PARAM_Y * PARAM_Y);

else if (PARAM(5) != 0)
{
temp = 2 / PARAM(5);
r2 = pow((pow(fabs(r2), temp) + pow(fabs(PARAM_Y), temp)), 1. / temp);
}

else
r2 = max(fabs(r2), fabs(PARAM_Y));
r = sqrt(PARAM_X * PARAM_X + PARAM_Y * PARAM_Y + PARAM_Z * PARAM_Z);

return (-min(PARAM(2) - r, PARAM(1) - min(r2, r)));
}

I'd say that the very last r defines sqrt of x-squared + y-squared + z-squared -
which is the implicit / closed form of the surface of a sphere.
So, I'd start looking there....

Maybe rewrite it out in SDL so it's easier to play with.
```