Math-BSpline-Curve

 view release on metacpan or  search on metacpan

lib/Math/BSpline/Curve.pm  view on Meta::CPAN

package Math::BSpline::Curve;
$Math::BSpline::Curve::VERSION = '0.002';
use 5.014;
use warnings;

# ABSTRACT: B-spline curves

use Moo 2.002005;
use List::Util 1.26 ('min');
use Ref::Util 0.010 ('is_plain_arrayref');
use Log::Any 1.044 ('$logger');
use Math::BSpline::Basis 0.001;



has '_degree' => (
    is       => 'ro',
    required => 1,
    init_arg => 'degree',
);



has '_knot_vector' => (
    is        => 'ro',
    init_arg  => 'knot_vector',
    predicate => 1,
);



has 'control_points' => (
    is      => 'lazy',
    builder => sub { return [] },
);



has 'basis' => (
    is      => 'lazy',
    handles => [
        'degree',
        'knot_vector',
    ],
    builder => sub {
        my ($self) = @_;

        return Math::BSpline::Basis->new(
            degree      => $self->_degree,
            (
                $self->_has_knot_vector
                    ? (knot_vector => $self->_knot_vector)
                    : (),
            ),
        )
    }
);



sub evaluate {
    my ($self, $u) = @_;
    my $basis      = $self->basis;

    my $p   = $self->degree;
    my $P   = $self->control_points;
    my $s   = $basis->find_knot_span($u);
    my $Nip = $basis->evaluate_basis_functions($s, $u);

    return undef if (!@$P);



( run in 2.076 seconds using v1.01-cache-2.11-cpan-98e64b0badf )