Without further ado, here's the heart of what I've been trying to get at.

multi method Evaluate($t, KnotBasisDirection $direction = Left)

{

my $n0 = $.knot_vector.N0_index($.degree, $t, $direction);

return [+] ($.knot_vector.N_local($n0, $.degree, $t)

>>*<< @.control_points[$n0 .. ($n0 + $.degree)]);

}

multi method Evaluate($base_t, $actual_t, KnotBasisDirection $direction = Left)

{

my $n0 = $.knot_vector.N0_index($.degree, $base_t, $direction);

return [+] ($.knot_vector.N_local($n0, $.degree, $actual_t)

>>*<< @.control_points[$n0 .. ($n0 + $.degree)]);

}

Notice these two routines are exactly the same, except where the second uses

`$base_t`

and `$actual_t`

, the first uses just `$t`

both times. This allows us to always set `$base_t`

with an actual number (so that it can be used to calculate `$n0`

), but pass anything that logically works for `$actual_t`

. If `$actual_t`

is a number, then Evaluate will calculate the curve's value at that parameter value. If it is a Polynomial representing a single variable (call it what you will, I keep switching between u, t, and x in my thinking), then Evaluate will return the Polynomial representing the section of the curve specified by `$base_t`

. If (as I keep toying around with), you passed a class representing a closure you can do math on, then you'll get a fancy closure that can evaluate that section of the curve. And so on and so forth. It's not tied to a particular implementation of Polynomial; all that's required is something that can handle a few basic math functions.
## No comments:

## Post a Comment