|
|
|
|
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Hi.
I am trying to create a random phase within a sine function, but keep getting an
error that a 'function identifier' is expected and I do not understand why.
I am doing:
#declare R1=seed(1153);
#declare xspectrum =function{ sin ( x+ rand(R1) ) }
but it does not work. I do realize that for this case I could use:
#declare randomnum=rand(R1);
first and use that in my sine function, because this works, but I really need to
have the random number computed within the sine function. This is just a
simplified case, what I will really do is:
#declare xspectrum = function { sum(Kx,1,10, .025/2*( sin(Kx*6.2832*x +
2*3.14159*rand(R1) ) ) ) }
and here I definitely need the random number evaluated in the function.
Any ideas,
Mike
Post a reply to this message
|
|
| |
| |
|
|
From: Chris B
Subject: Re: trouble using rand inside of sine function
Date: 4 Dec 2008 17:39:04
Message: <49385c08@news.povray.org>
|
|
|
| |
| |
|
|
"Mike" <win### [at] hotmailcom> wrote in message
news:web.4938266b4d71081ac9b9f9f00@news.povray.org...
> Hi.
> I am trying to create a random phase within a sine function, but keep
> getting an
> error that a 'function identifier' is expected and I do not understand
> why.
>
> I am doing:
> #declare R1=seed(1153);
> #declare xspectrum =function{ sin ( x+ rand(R1) ) }
>
Hi Mike,
The help says it's not supported.
It's not one of the FLOAT_FUNCTIONS listed in the 'user defined functions'
section in the help.
Indeed the help specifies that only float functions that apply to float
values may be used, which excludes rand because it takes an Integer value
pointing to the predefined seed stream. Below the list of supported
functions in my copy of the help 'rand' is specifically used as an example
of functions that are not supported.
I think the reason for the constraint could be associated with the fact that
functions are able to be interpreted at render-time (rather than just during
the parse sequence). Someone may be able to give a more comprehensive
description (I'm at the limit of my understanding here).
Hate to be the bearer of bad news :-)
Regards,
Chris B.
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
"Mike" <win### [at] hotmailcom> wrote:
> I am doing:
> #declare R1=seed(1153);
> #declare xspectrum =function{ sin ( x+ rand(R1) ) }
>
> but it does not work.
Unfortunately, only a subset of float expressions is supported in function
definitions. The rand() built-in function doesn't seem to be one of them.
You will have to find some other way.
How about a "noisy" pattern function, e.g.:
#declare myRand = function { pattern { bozo } }
#declare xspectrum = function { sin ( x + myRand(x,y,z) ) }
would this help you, maybe with a lot of turbulence added to the pattern?
Post a reply to this message
|
|
| |
| |
|
|
From: Tor Olav Kristensen
Subject: Re: trouble using rand inside of sine function
Date: 4 Dec 2008 18:34:46
Message: <49386916$1@news.povray.org>
|
|
|
| |
| |
|
|
Mike wrote:
> Hi.
> I am trying to create a random phase within a sine function, but keep getting an
> error that a 'function identifier' is expected and I do not understand why.
>
> I am doing:
> #declare R1=seed(1153);
> #declare xspectrum =function{ sin ( x+ rand(R1) ) }
...
rand() can not be used inside functions.
See http://www.povray.org/documentation/view/3.6.1/231/
Do you really need it to be a function ?
If so you may want to have a look at f_noise3d(x, y, z) instead.
See http://www.povray.org/documentation/view/3.6.1/73/
To use it you will have to put
#include "functions.inc"
- somewhere in the beginning of your code.
If not, you can use a macro. Like this:
#version 3.6;
#macro X_Spectrum(X, SS)
#local Sum =0;
#local Kx = 1;
#while (Kx <= 10)
#local Sum = Sum + 0.025/2*sin(2*pi*(Kx*X + rand(SS)));
#local Kx = Kx + 1;
#end // while
(Sum)
#end // macro X_Spectrum
You can use it e.g. like this:
#declare SUM = X_Spectrum(0.5, seed(65189));
#debug concat("\n\n", str(SUM, 0, -1), "\n\n")
--
Tor Olav
http://subcube.com
Post a reply to this message
|
|
| |
| |
|
|
From: Tor Olav Kristensen
Subject: Re: trouble using rand inside of sine function
Date: 4 Dec 2008 19:07:12
Message: <493870b0$1@news.povray.org>
|
|
|
| |
| |
|
|
Tor Olav Kristensen wrote:
> Mike wrote:
>> Hi.
>> I am trying to create a random phase within a sine function, but keep
>> getting an
>> error that a 'function identifier' is expected and I do not understand
>> why.
>>
>> I am doing:
>> #declare R1=seed(1153);
>> #declare xspectrum =function{ sin ( x+ rand(R1) ) }
> ...
> rand() can not be used inside functions.
> See http://www.povray.org/documentation/view/3.6.1/231/
>
> Do you really need it to be a function ?
>
>
> If so you may want to have a look at f_noise3d(x, y, z) instead.
...
Or you can do something like this:
#version 3.6;
#macro BuildSpectrumFunction(Amplitude, Harmonics, SS)
function(x) {
Amplitude*
(
0
#local K = 1;
#while (K <= Harmonics)
#local Phase = rand(SS);
+ sin(2*pi*(K*x + Phase))
#local K = K + 1;
#end // while
)
}
#end // macro BuildSpectrumFunction
#local A = 0.025/2;
#local H = 10;
#declare X_SpectrumFn1 = BuildSpectrumFunction(A, H, seed(65189))
#declare X_SpectrumFn2 = BuildSpectrumFunction(A, H, seed(3520))
#declare SUM1 = X_SpectrumFn1(0.50000);
#debug "\n"
#debug str(SUM1, 0, -1)
#declare SUM1 = X_SpectrumFn1(0.50001);
#debug "\n"
#debug str(SUM1, 0, -1)
#debug "\n\n"
#declare SUM2 = X_SpectrumFn2(0.50000);
#debug "\n"
#debug str(SUM2, 0, -1)
#declare SUM2 = X_SpectrumFn2(0.50001);
#debug "\n"
#debug str(SUM2, 0, -1)
#debug "\n\n"
--
Tor Olav
http://subcube.com
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Wasn't it Mike who wrote:
>Hi.
>I am trying to create a random phase within a sine function, but keep
>getting an
>error that a 'function identifier' is expected and I do not understand why.
If you think about it, there's a pretty good reason why you can't use
RAND inside a function. Imagine what happens when the code tries to
solve such a function. The solver attempts to approach a solution by
finding a series of points on each side that get nearer and nearer to
the solution. If the function contains RAND, then the function is
discontinuous everywhere, and that approach doesn't home in on a
solution.
What you can do is write a macro instead of a function. You'll need to
write your own loop to perform the sum() operation.
--
Mike Williams
Gentleman of Leisure
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Thanks for all the help.
The macro seems to be working good.
-Mike Roberts
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
|
|