|
|
|
|
|
|
| |
| |
|
|
From: marabou
Subject: single point on spline and a vector: comparison
Date: 2 Nov 2006 13:47:29
Message: <454a3d41@news.povray.org>
|
|
|
| |
| |
|
|
hello,
for some reason I want to check if one point at spline-creation time is
equal to one point in an array.
More concrete:
There is an array[] of vectors which holds points of one future spline.
A macro creates a spline from it. While this macro creates spline I wish to
compare if actual processed point hits one predefined point from array[x].
pseudo-code:
>>>>>>>>>>>>>>>>>>>>>>>>
// define spline
#declare splinepoints = array[]{<x,y,z>,...}
// create spline
#declare splinepath = spline{cubic_spline #while...}
// draw balls on splinepath
#macro happyspline(splinepath)
#while (clock_counter <= maxpoint)
sphere {
splinepath(clock_counter), radius
}
// the comparison, which fails:
#if ( splinepath(clock_counter) = splinepoints[10] )
"HIT"
#end
clock_counter += anystep
#end //while
#end //macro
<<<<<<<<<<<<<<<<<<<<<<<<<
Then comes a parse error: "Float expected but vector or color expression
found."
And I ask: Why is splinepath(at_one_moment) no vector? What did I wrong?
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
It's difficult to debug what's likely a syntax error when looking at psuedo
code. So not getting into that, what line of actual code is showing the
error?
On the another note, for each defined point where are you storing the
"value" which says how far along it is on the spline? I deal with splines
in arrays of 4D vectors rather than 3 so that the same vector that holds
the 3D points will also hold the "value" position for each point.
Unfortunately this means that when converting it to a spline it looks
something like this for each value of the array:
#local Tempfloat=The_Array[ctr].t;
Tempfloat, <The_Array[ctr].x, The_Array[ctr].y, The_Array[ctr].z>
Using the Tempfloat variable was a workaround - Pov-Ray didn't like
The_Array[ctr].t directly in the spline statement.
> And I ask: Why is splinepath(at_one_moment) no vector? What did I wrong?
Have you tried something like the following?
#debug concat(" x = ", str(splinepath(clock_counter).x,5,5),
" y = ", str(splinepath(clock_counter).y,5,5),
" z = ", str(splinepath(clock_counter).z,5,5),
" ")
Hope something here is useful... :)
Charles
marabou <not### [at] availableyet> wrote:
> hello,
> for some reason I want to check if one point at spline-creation time is
> equal to one point in an array.
> More concrete:
> There is an array[] of vectors which holds points of one future spline.
> A macro creates a spline from it. While this macro creates spline I wish to
> compare if actual processed point hits one predefined point from array[x].
>
> pseudo-code:
> >>>>>>>>>>>>>>>>>>>>>>>>
> // define spline
> #declare splinepoints = array[]{<x,y,z>,...}
>
> // create spline
> #declare splinepath = spline{cubic_spline #while...}
>
> // draw balls on splinepath
> #macro happyspline(splinepath)
> #while (clock_counter <= maxpoint)
> sphere {
> splinepath(clock_counter), radius
> }
> // the comparison, which fails:
> #if ( splinepath(clock_counter) = splinepoints[10] )
> "HIT"
> #end
> clock_counter += anystep
> #end //while
> #end //macro
> <<<<<<<<<<<<<<<<<<<<<<<<<
>
> Then comes a parse error: "Float expected but vector or color expression
> found."
> And I ask: Why is splinepath(at_one_moment) no vector? What did I wrong?
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
"marabou" <not### [at] availableyet> wrote in message
news:454a3d41@news.povray.org...
> hello,
> I want to check if one point at spline-creation time is
> equal to one point in an array.
> ... snip ...
> #if ( splinepath(clock_counter) = splinepoints[10] )
> ... snip ...
> Then comes a parse error: "Float expected but vector or color expression
> found."
> And I ask: Why is splinepath(at_one_moment) no vector? What did I wrong?
>
Hi,
splinepath(clock_counter) does return a vector, but, in an #if statement you
need something that evaluates to a 'float expression that is interpreted as
a boolean value' and vector1=vector2 doesn't give you that, which is why you
get the error that complains that it came across a vector rather than
finding a float.
I believe you'll need to test the individual elements of the vector, (though
someone may know an easier way):
#declare A = <1,1,1>;
#declare B = <1,1,1>;
#if (A.x=B.x & A.y=B.y & A.z=B.z)
sphere {0,1 pigment {color rgb 1}}
#end
Also, even if the condition is theoretically met, you may well run into
precision errors that you'll need to deal with.
ie if splinepath(clock_counter) returns <1.0000001,0.999999999,1.000000005>
then you'll need to handle that in your logic.
Typically you could end up with something like:
#declare Threshold = 0.001;
#if (A.x-B.x<Threshold &
A.y-B.y<Threshold &
A.z-B.z<Threshold)
Regards,
Chris B.
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
| |
|
|
> #if (A.x-B.x<Threshold &
> A.y-B.y<Threshold &
> A.z-B.z<Threshold)
You're going to want to put abs() around the left hand sides of those
comparisons.
A simpler (though slower) option is
#if ( vlength(A-B) < Threshold )
- Slime
[ http://www.slimeland.com/ ]
Post a reply to this message
|
|
| |
| |
|
|
From: Warp
Subject: Re: single point on spline and a vector: comparison
Date: 3 Nov 2006 07:11:07
Message: <454b31db@news.povray.org>
|
|
|
| |
| |
|
|
Slime <fak### [at] emailaddress> wrote:
> > #if (A.x-B.x<Threshold &
> > A.y-B.y<Threshold &
> > A.z-B.z<Threshold)
> A simpler (though slower) option is
> #if ( vlength(A-B) < Threshold )
Slower?-o
There's much less to parse there. POV-Ray will spend 99% of the time
parsing that expression and 1% of the time calculating its result. You
do the math on which option is faster.
--
- Warp
Post a reply to this message
|
|
| |
| |
|
|
|
|
| |
|
|