Math-Vector-Real-XS
view release on metacpan or search on metacpan
OUTPUT:
RETVAL
void
add_me(v0, v1, rev = 0)
mvr v0
mvr v1
SV *rev = NO_INIT
PREINIT:
I32 len, i;
PPCODE:
len = mvr_len(aTHX_ v0);
mvr_check_len(aTHX_ v1, len);
mvr_add_me(aTHX_ v0, v1, len);
XSRETURN(1);
mvr
neg(v, v1 = 0, rev = 0)
mvr v
SV *v1 = NO_INIT
SV *rev = NO_INIT
OUTPUT:
RETVAL
void
sub_me(v0, v1, rev = 0)
mvr v0
mvr v1
SV *rev = NO_INIT
PREINIT:
I32 len, i;
PPCODE:
len = mvr_len(aTHX_ v0);
mvr_check_len(aTHX_ v1, len);
mvr_subtract_me(aTHX_ v0, v1, len);
XSRETURN(1);
void
mul(v0, sv1, rev = 0)
mvr v0;
SV *sv1
SV *rev = NO_INIT
PREINIT:
I32 len, i;
mvr v1;
PPCODE:
/* fprintf(stderr, "using mul operator from XS\n"); fflush(stderr); */
len = mvr_len(aTHX_ v0);
if (SvROK(sv1) && (SvTYPE(v1 = (AV*)SvRV(sv1)) == SVt_PVAV)) {
NV acu = 0;
mvr_check_len(aTHX_ v1, len);
ST(0) = sv_2mortal(newSVnv(mvr_dot_product(aTHX_ v0, v1, len)));
XSRETURN(1);
}
else {
mvr r = mvr_new(aTHX_ len);
}
void
mul_me(v0, sv1, rev = 0)
mvr v0
SV *sv1
SV *rev = NO_INIT
PREINIT:
int len, i;
NV nv1;
PPCODE:
if (SvROK(sv1) && (SvTYPE(SvRV(sv1)) == SVt_PVAV))
Perl_croak(aTHX_ "can not multiply by a vector in place as the result is not a vector");
nv1 = SvNV(sv1);
len = mvr_len(aTHX_ v0);
for (i = 0; i <= len; i++) {
SV *sv = mvr_get_sv(aTHX_ v0, i);
sv_setnv(sv, nv1 * SvNV(sv));
}
XSRETURN(1);
}
else {
XSRETURN(0);
}
OUTPUT:
RETVAL
void
box(klass, ...)
SV *klass = NO_INIT
PPCODE:
if (items <= 1) XSRETURN(0);
else {
I32 len, j;
mvr min, max;
mvr v = mvr_from_sv(aTHX_ ST(1));
len = mvr_len(aTHX_ v);
min = mvr_clone(aTHX_ v, len);
max = mvr_clone(aTHX_ v, len);
for (j = 2; j < items; j++) {
I32 i;
}
void
decompose(v0, v1)
mvr v0
mvr v1
PREINIT:
I32 len, i;
mvr p, n;
NV f, nr;
PPCODE:
len = mvr_len(aTHX_ v0);
mvr_check_len(aTHX_ v1, len);
nr = mvr_norm(aTHX_ v0, len);
if (nr == 0) Perl_croak(aTHX_ "Illegal division by zero");
p = mvr_new(aTHX_ len);
mvr_scalar_product(aTHX_ v0, mvr_dot_product(aTHX_ v0, v1, len) / nr, len, p);
if (GIMME_V == G_ARRAY) {
n = mvr_new(aTHX_ len);
mvr_subtract(aTHX_ v1, p, len, n);
EXTEND(SP, 2);
sv_set_mvr(aTHX_ ST(0), p);
XSRETURN(1);
}
void
canonical_base(klass, dim)
SV *klass = NO_INIT
I32 dim
PREINIT:
I32 j;
PPCODE:
if (dim <= 0) Perl_croak(aTHX_ "negative dimension");
EXTEND(SP, dim);
for (j = 0; j < dim; j++) {
mvr v = mvr_new(aTHX_ dim - 1);
ST(j) = sv_newmortal();
sv_set_mvr(aTHX_ ST(j), v);
mvr_axis_versor(aTHX_ dim - 1, j, v);
}
XSRETURN(dim);
void
rotation_base_3d(dir)
mvr dir
PREINIT:
I32 len, i;
mvr u, v, w;
NV n;
PPCODE:
len = mvr_len(aTHX_ dir);
if (len != 2) Perl_croak(aTHX_ "rotation_base_3d requires a 3D vector");
n = mvr_norm(aTHX_ dir, len);
if (n == 0) Perl_croak(aTHX_ "Illegal division by zero");
EXTEND(SP, 3);
u = mvr_new(aTHX_ 2);
ST(0) = sv_newmortal();
sv_set_mvr(aTHX_ ST(0), u);
v = mvr_new(aTHX_ 2);
ST(1) = sv_newmortal();
void
select_in_ball(v, r, ...)
mvr v
NV r
PREINIT:
I32 len, i, to;
NV r2;
PPCODE:
len = mvr_len(aTHX_ v);
r2 = r * r;
for (to = 0, i = 2; i < items; i++) {
mvr e = mvr_from_sv(aTHX_ ST(i));
mvr_check_len(aTHX_ e, len);
if (mvr_dist2(aTHX_ v, e, len) <= r2) {
ST(to) = sv_newmortal();
sv_set_mvr(aTHX_ ST(to), mvr_clone(aTHX_ e, len));
to++;
}
( run in 1.616 second using v1.01-cache-2.11-cpan-5511b514fd6 )