POV-Ray : Newsgroups : povray.advanced-users : Spherical isosurface Server Time
19 Apr 2024 09:42:20 EDT (-0400)
  Spherical isosurface (Message 8 to 17 of 17)  
<<< Previous 7 Messages Goto Initial 10 Messages
From: Bald Eagle
Subject: Re: Spherical isosurface
Date: 29 Nov 2016 15:05:00
Message: <web.583ddf60c3db15afc437ac910@news.povray.org>
Mike Horvath <mik### [at] gmailcom> wrote:

> > What would be a formula for a sphere? L should be latitude, H longitude,
> > and C radius.

https://en.wikipedia.org/wiki/Spherical_coordinate_system
Conversely, the Cartesian coordinates may be retrieved from the spherical
coordinates
https://wikimedia.org/api/rest_v1/media/math/render/svg/d7bcd516d317c31ac48ed36e2ead9537a5f16e2e

> Problem: L ranges from 0..100, and C ranges from 0..128, and I want to
> avoid generating a flattened ellipsoid.
>
> Mike

#declare C = C*(100/128);


Post a reply to this message

From: clipka
Subject: Re: Spherical isosurface
Date: 29 Nov 2016 15:26:51
Message: <583de48b$1@news.povray.org>
Am 29.11.2016 um 00:42 schrieb Mike Horvath:
> Clipka gave me these formulas to generate a cylindrical isosurface.
> 
> #declare fL = function(x,y,z) {y*100}
> #declare fC = function(x,y,z) {sqrt(x*x+z*z)*128}
> #declare fH = function(x,y,z) {atan2d(x,z)}
> 
> What would be a formula for a sphere? L should be latitude, H longitude,
> and C radius.

What you need is _not_ "formulas to generate a [spherical] isosurface".

What you need is formulas to convert from a point in cartesian space to
a colour in the spherical (as oppsed to cylindrical) LCh model.

This is just a small building block in your isosurface function, and in
and of itself has no special relation to isosurfaces whatsoever. (You'll
need to use the same formula to eventually compute an RGB colour pigment.)


If Chroma (C) is to be (spherical) radius, that part is easy:

    #declare fC = function(x,y,z) { sqrt(x*x+y*y+z*z)*CONST }

Hue (H) should be unchanged:

    #declare fH = function(x,y,z) { atan2(x,z)*CONST }

Luminance gets a bit more complicated: You have to use an atan-based
formula to get an angle, but you must plug in the y coordinate and the
distance between the y axis; the latter is equal to sqrt(x*x+z*z), so
this gives you:

    #declare fL = function(x,y,z) { atan2(sqrt(x*x+z*z),y)*CONST }

Choose CONST values as needed; atan2()*CONST may happen to be replacable
by atan2d() again.


Post a reply to this message

From: Mike Horvath
Subject: Re: Spherical isosurface
Date: 29 Nov 2016 15:59:10
Message: <583dec1e@news.povray.org>
On 11/29/2016 3:04 PM, Bald Eagle wrote:
> Mike Horvath <mik### [at] gmailcom> wrote:
>
>>> What would be a formula for a sphere? L should be latitude, H longitude,
>>> and C radius.
>
> https://en.wikipedia.org/wiki/Spherical_coordinate_system
> Conversely, the Cartesian coordinates may be retrieved from the spherical
> coordinates
>
https://wikimedia.org/api/rest_v1/media/math/render/svg/d7bcd516d317c31ac48ed36e2ead9537a5f16e2e
>
>> Problem: L ranges from 0..100, and C ranges from 0..128, and I want to
>> avoid generating a flattened ellipsoid.
>>
>> Mike
>
> #declare C = C*(100/128);
>
>

THANK YOU!!

This had what I needed:

https://en.wikipedia.org/wiki/Spherical_coordinate_system#Cartesian_coordinates


I'm not sure I'm 100% correct, but here are my calculations:

#declare fD = function(C) {abs(C-0.5)-0.5}
#declare fDist = function(Dr,Dg,Db) {max(Dr,Dg,Db)}
#declare fR = function(L,C,H) {convertLCH2RGBa1(L,C,H)}
#declare fG = function(L,C,H) {convertLCH2RGBa2(L,C,H)}
#declare fB = function(L,C,H) {convertLCH2RGBa3(L,C,H)}
#declare fL = function(x,y,z) {acosd(y/sqrt(x*x+y*y+z*z))/180*100}
#declare fC = function(x,y,z) {sqrt(x*x+y*y+z*z)*128}
#declare fH = function(x,y,z) {atan2d(z,x)}

#declare fFinal = function(L,C,H)
{
	fDist
	(
		fD(fR(L,C,H)),
		fD(fG(L,C,H)),
		fD(fB(L,C,H))
	)
}


I just wish the results were more interesting.


Mike


Post a reply to this message


Attachments:
Download 'cielch_color_solid_sphere_isosurface_light.png' (61 KB)

Preview of image 'cielch_color_solid_sphere_isosurface_light.png'
cielch_color_solid_sphere_isosurface_light.png


 

From: Mike Horvath
Subject: Re: Spherical isosurface
Date: 29 Nov 2016 17:04:33
Message: <583dfb71$1@news.povray.org>
On 11/29/2016 3:26 PM, clipka wrote:
> Luminance gets a bit more complicated: You have to use an atan-based
> formula to get an angle, but you must plug in the y coordinate and the
> distance between the y axis; the latter is equal to sqrt(x*x+z*z), so
> this gives you:
>
>     #declare fL = function(x,y,z) { atan2(sqrt(x*x+z*z),y)*CONST }
>
> Choose CONST values as needed; atan2()*CONST may happen to be replacable
> by atan2d() again.
>

Wikipedia says it should be more like

	#declare fL = function(x,y,z) { atan2(sqrt(x*x+y*y+z*z),y)*CONST }

Do you agree?

Mike


Post a reply to this message

From: Mike Horvath
Subject: Re: Spherical isosurface
Date: 29 Nov 2016 17:07:14
Message: <583dfc12$1@news.povray.org>
On 11/29/2016 5:04 PM, Mike Horvath wrote:
> On 11/29/2016 3:26 PM, clipka wrote:
>> Luminance gets a bit more complicated: You have to use an atan-based
>> formula to get an angle, but you must plug in the y coordinate and the
>> distance between the y axis; the latter is equal to sqrt(x*x+z*z), so
>> this gives you:
>>
>>     #declare fL = function(x,y,z) { atan2(sqrt(x*x+z*z),y)*CONST }
>>
>> Choose CONST values as needed; atan2()*CONST may happen to be replacable
>> by atan2d() again.
>>
>
> Wikipedia says it should be more like
>
>     #declare fL = function(x,y,z) { atan2(sqrt(x*x+y*y+z*z),y)*CONST }
>
> Do you agree?
>
> Mike

Wait! I scanned your response too quickly. Wikipedia gives this:

	acos(y/r)

which is totally different from what you suggest. Are they equivalent?

Mike


Post a reply to this message

From: Mike Horvath
Subject: Re: Spherical isosurface
Date: 29 Nov 2016 17:12:52
Message: <583dfd64$1@news.povray.org>
On 11/29/2016 3:26 PM, clipka wrote:
> Luminance gets a bit more complicated: You have to use an atan-based
> formula to get an angle, but you must plug in the y coordinate and the
> distance between the y axis; the latter is equal to sqrt(x*x+z*z), so
> this gives you:
>
>     #declare fL = function(x,y,z) { atan2(sqrt(x*x+z*z),y)*CONST }
>
> Choose CONST values as needed; atan2()*CONST may happen to be replacable
> by atan2d() again.
>

Also, don't I need to divide by 180 first before multiplying by the 
constant?

atan2d(sqrt(x*x+z*z),y)/180*100

Mike


Post a reply to this message

From: clipka
Subject: Re: Spherical isosurface
Date: 29 Nov 2016 19:01:44
Message: <583e16e8$1@news.povray.org>
Am 29.11.2016 um 23:07 schrieb Mike Horvath:
> On 11/29/2016 5:04 PM, Mike Horvath wrote:
>> On 11/29/2016 3:26 PM, clipka wrote:
>>> Luminance gets a bit more complicated: You have to use an atan-based
>>> formula to get an angle, but you must plug in the y coordinate and the
>>> distance between the y axis; the latter is equal to sqrt(x*x+z*z), so
>>> this gives you:
>>>
>>>     #declare fL = function(x,y,z) { atan2(sqrt(x*x+z*z),y)*CONST }
>>>
>>> Choose CONST values as needed; atan2()*CONST may happen to be replacable
>>> by atan2d() again.
>>>
>>
>> Wikipedia says it should be more like
>>
>>     #declare fL = function(x,y,z) { atan2(sqrt(x*x+y*y+z*z),y)*CONST }
>>
>> Do you agree?
>>
>> Mike
> 
> Wait! I scanned your response too quickly. Wikipedia gives this:
> 
>     acos(y/r)
> 
> which is totally different from what you suggest. Are they equivalent?

I think so. Wikipedia is right, and I'm confident my formula is also
correct. I haven't verified the equivalence algebraically though.


Post a reply to this message

From: clipka
Subject: Re: Spherical isosurface
Date: 29 Nov 2016 19:07:26
Message: <583e183e$1@news.povray.org>
Am 29.11.2016 um 23:12 schrieb Mike Horvath:
> On 11/29/2016 3:26 PM, clipka wrote:
>> Luminance gets a bit more complicated: You have to use an atan-based
>> formula to get an angle, but you must plug in the y coordinate and the
>> distance between the y axis; the latter is equal to sqrt(x*x+z*z), so
>> this gives you:
>>
>>     #declare fL = function(x,y,z) { atan2(sqrt(x*x+z*z),y)*CONST }
>>
>> Choose CONST values as needed; atan2()*CONST may happen to be replacable
>> by atan2d() again.
>>
> 
> Also, don't I need to divide by 180 first before multiplying by the
> constant?
> 
> atan2d(sqrt(x*x+z*z),y)/180*100

Well, that's equivalent to

    atan2(...)/pi*100

so it's just a matter of choosing a fitting CONST for your purposes ;)

But yes, the way you're doing it is probably right for your application.

I later noticed that you may need to add another constant though,
depending on the nominal value range.


Post a reply to this message

From: Alain
Subject: Re: Spherical isosurface
Date: 1 Dec 2016 18:40:40
Message: <5840b4f8$1@news.povray.org>
Le 16-11-28 à 18:42, Mike Horvath a écrit :
> Clipka gave me these formulas to generate a cylindrical isosurface.
>
> #declare fL = function(x,y,z) {y*100}
> #declare fC = function(x,y,z) {sqrt(x*x+z*z)*128}
> #declare fH = function(x,y,z) {atan2d(x,z)}
>
> What would be a formula for a sphere? L should be latitude, H longitude,
> and C radius.
>
> Thanks.

When I want a isosurface sphere, I use the following:

#include "functions.inc"

Then, I use the f_sphere(x,y,z,radius) function that use an internal 
function. Faster and simple.

If you want the function to use in an isosurface, it's
sqrt(pow(x,2)+pow(y,2)+pow(z,2))-Radius to be used with a threshold of zero.
Also, you can use sqrt(pow(x,2)+pow(y,2)+pow(z,2)) and use the threshold 
to controll the radius.

Using 3 functions is if you want to make a parametric sphere. It's not 
the same thing.


Alain


Post a reply to this message

From: Mike Horvath
Subject: Re: Spherical isosurface
Date: 1 Dec 2016 20:16:12
Message: <5840cb5c$1@news.povray.org>
On 12/1/2016 6:41 PM, Alain wrote:
> Le 16-11-28 à 18:42, Mike Horvath a écrit :
>> Clipka gave me these formulas to generate a cylindrical isosurface.
>>
>> #declare fL = function(x,y,z) {y*100}
>> #declare fC = function(x,y,z) {sqrt(x*x+z*z)*128}
>> #declare fH = function(x,y,z) {atan2d(x,z)}
>>
>> What would be a formula for a sphere? L should be latitude, H longitude,
>> and C radius.
>>
>> Thanks.
>
> When I want a isosurface sphere, I use the following:
>
> #include "functions.inc"
>
> Then, I use the f_sphere(x,y,z,radius) function that use an internal
> function. Faster and simple.
>
> If you want the function to use in an isosurface, it's
> sqrt(pow(x,2)+pow(y,2)+pow(z,2))-Radius to be used with a threshold of
> zero.
> Also, you can use sqrt(pow(x,2)+pow(y,2)+pow(z,2)) and use the threshold
> to controll the radius.
>
> Using 3 functions is if you want to make a parametric sphere. It's not
> the same thing.
>
>
> Alain

I don't want a sphere. I want an irregular shape in a spherical 
coordinate system.

Mike


Post a reply to this message

<<< Previous 7 Messages Goto Initial 10 Messages

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