|
|
|
|
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Hello all, could you please advice on following problem. For example, I have two
functions
#declare frac = function (x) {
x - floor (x)
}
#declare menger = function (x, order) {
floor (3*frac(x*pow(3,order))) - floor (3*frac(x*pow(3,order))/2)*2
}
In procedural language like C++ to avoid recalculation of frac/pow I would write
in 2nd function
double tmp = frac(x*pow(3,order));
return floor (3*tmp) - floor (3*tmp/2)*2;
But how do I explain this to pov?
Ok, in this particular case I could use intermediate function
#declare menger2 = function (tmp) {
floor (3*tmp) - floor (3*tmp/2)*2
}
#declare menger = function (x, order) {
menger2(frac(x*pow(3,order)))
}
but
1) not sure if this can be done for arbitrary combination
2) wont stacking functions like that actually slow things down
Thanks.
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
"makc" <mak### [at] gmailspamcom> wrote:
> Hello all, could you please advice on following problem. For example, I have two
> functions
>
> #declare frac = function (x) {
> x - floor (x)
> }
>
> #declare menger = function (x, order) {
> floor (3*frac(x*pow(3,order))) - floor (3*frac(x*pow(3,order))/2)*2
> }
....
> But how do I explain this to pov?
>
> Ok, in this particular case I could use intermediate function
>
> #declare menger2 = function (tmp) {
> floor (3*tmp) - floor (3*tmp/2)*2
> }
>
> #declare menger = function (x, order) {
> menger2(frac(x*pow(3,order)))
> }
>
> but
>
> 1) not sure if this can be done for arbitrary combination
Neither do I.
I can't remember having seen a function where this way of doing it is
not possible.
But if you or anyone else can come up with a good challenge, then
please post it.
> 2) wont stacking functions like that actually slow things down
I have mostly experienced speed-ups.
But sometimes extra functions calls is not worth simple recalculations.
--
Tor Olav
http://subcube.com
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
"Tor Olav Kristensen" <tor### [at] TOBEREMOVEDgmailcom> wrote:
> "makc" <mak### [at] gmailspamcom> wrote:
> I can't remember having seen a function where this way of doing it is
> not possible.
>
> But if you or anyone else can come up with a good challenge, then
> please post it.
Not exactly my original problem, but nevertheless major waste of cpu: the
absence of "if"-like function (or am I overlooking it?)
Simple condition (x > 0) ? func (x) : 0 can be modelled, for example, with
something like func (x) * ceil ((1 + abs(x) - abs (x - 1)) / 2), but this means
pov will calculate func (x) for every x < 0 where it is not needed.
I am actually trying to render 3D fractals with isosurface, and it works, but is
painfully slow, and I don't see anything I can do about it without recompiling
povray with added internal functions :(
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
On 20.01.10 11:24, makc wrote:
> "Tor Olav Kristensen"<tor### [at] TOBEREMOVEDgmailcom> wrote:
>> "makc"<mak### [at] gmailspamcom> wrote:
>> I can't remember having seen a function where this way of doing it is
>> not possible.
>>
>> But if you or anyone else can come up with a good challenge, then
>> please post it.
>
> Not exactly my original problem, but nevertheless major waste of cpu: the
> absence of "if"-like function (or am I overlooking it?)
You are overlooking it: What you want is "select", which is available both
inside and outside functions. A description of its parameters, just like
those of all other parameters, may be found in the documentation, i.e. at
<http://www.povray.org/documentation/view/3.6.1/228/>. It can do everything
the ternary operator in C can do, and a bit more.
Thorsten
Post a reply to this message
|
|
| |
| |
|
|
From: Thorsten Froehlich
Subject: Re: optimisation of functions - how to?
Date: 20 Jan 2010 06:45:31
Message: <4b56ecdb@news.povray.org>
|
|
|
| |
| |
|
|
On 20.01.10 00:33, makc wrote:
> Hello all, could you please advice on following problem. For example, I have two
> functions
>
> #declare frac = function (x) {
> x - floor (x)
> }
>
> #declare menger = function (x, order) {
> floor (3*frac(x*pow(3,order))) - floor (3*frac(x*pow(3,order))/2)*2
> }
>
> In procedural language like C++ to avoid recalculation of frac/pow I would write
> in 2nd function
>
> double tmp = frac(x*pow(3,order));
> return floor (3*tmp) - floor (3*tmp/2)*2;
>
> But how do I explain this to pov?
You don't need a second function to declare a variable. While it is probably
the easiest to read, if you really want you can reuse the sum or prod
functions. In the documentation, i.e. at
<http://www.povray.org/documentation/view/3.6.1/231/> you can find a few
examples. The trick here is of course to reuse the iteration variable.
Thorsten
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Thorsten Froehlich <tho### [at] trfde> wrote:
> You are overlooking it: What you want is "select"
Wow thanks, that does give some noticeable boost (and so hope to it).
Re sum/prod, can't see how that is different, except that I can put expression
as argument vs it being function body. Is it faster that way?
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
"makc" <mak### [at] gmailspamcom> wrote:
> "Tor Olav Kristensen" <tor### [at] TOBEREMOVEDgmailcom> wrote:
> > "makc" <mak### [at] gmailspamcom> wrote:
> > I can't remember having seen a function where this way of doing it is
> > not possible.
> >
> > But if you or anyone else can come up with a good challenge, then
> > please post it.
>
> Not exactly my original problem, but nevertheless major waste of cpu: the
> absence of "if"-like function (or am I overlooking it?)
>
> Simple condition (x > 0) ? func (x) : 0 can be modelled, for example, with
> something like func (x) * ceil ((1 + abs(x) - abs (x - 1)) / 2), but this means
> pov will calculate func (x) for every x < 0 where it is not needed.
>
> I am actually trying to render 3D fractals with isosurface, and it works, but is
> painfully slow, and I don't see anything I can do about it without recompiling
> povray with added internal functions :(
You might want to have a look at this post:
http://news.povray.org/povray.binaries.scene-files/message/%3Cweb.4b43d232b2edd653527a960f0%40news.povray.org%3E
http://tinyurl.com/yfsl9nt
Group: povray.binaries.scene-files
Subject: "Re: Happy 2,0,1,0 Quaternion-power 'Bulb!"
From: Tor Olav Kristensen
Date: 6th January 2010
--
Tor Olav
http://subcube.com
Post a reply to this message
|
|
| |
| |
|
|
From: Thorsten Froehlich
Subject: Re: optimisation of functions - how to?
Date: 20 Jan 2010 08:34:57
Message: <4b570681@news.povray.org>
|
|
|
| |
| |
|
|
On 20.01.10 13:13, makc wrote:
> Thorsten Froehlich<tho### [at] trfde> wrote:
>> You are overlooking it: What you want is "select"
>
> Wow thanks, that does give some noticeable boost (and so hope to it).
>
> Re sum/prod, can't see how that is different, except that I can put expression
> as argument vs it being function body. Is it faster that way?
Indeed, the overhead is somewhat lower than for a function call (due to the
internal structure of the function VM). What you need to know is that you
can you the local variable as the end value, i.e.
sum(i, ... compute variable i ..., i, ... your function here ...)
That way the sum function iterates exactly once. This works because i is
initialized as soon as the start value is computed, hence it can be used by
the end value computation, which is only computed once, too.
Thorsten
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
Hey makc, I'm trying to render 3d fractals with pov too but am a little
stuck. If you want to share ideas email me!
Dave.
makc wrote:
> I am actually trying to render 3D fractals with isosurface, and it works, but is
> painfully slow, and I don't see anything I can do about it without recompiling
> povray with added internal functions :(
>
>
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
hti### [at] gmailcom wrote:
> Hey makc, I'm trying to render 3d fractals with pov too but am a little
> stuck. If you want to share ideas email me!
>
> Dave.
>
Hey Dave, if you want to see where I am at this point, visit
http://preview.tinyurl.com/menger4D (scroll to the bottom for my last pov file)
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
|
|