new object $math: $libraries;
var $math origin_2d = [0.0, 0.0];
var $math origin_3d = [0.0, 0.0, 0.0];
var $math pi = 3.14159;
var $math pi2 = 6.28318;
var $math transmat_2d = [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]];
var $math transmat_3d = [[1.0, 0.0, 0.0, 0.0], [0.0, 1.0, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0]];
var $root created_on = 845760297;
var $root flags = ['variables, 'methods, 'code, 'core];
var $root help_node = $help_obj_math;
var $root inited = 1;
var $root managed = [$math];
var $root manager = $math;
public method .add(): native;
public method .cross(): native;
public method .cylindrical_rectangular() {
arg coords;
return [(coords[1]) * cos(coords[2]), (coords[1]) * sin(coords[2]), coords[3]];
};
public method .deg_rad() {
arg angle;
return angle / 57.2958;
};
public method .distance(): native;
public method .dot(): native;
public method .ident_mat() {
arg n;
var x, y;
return map x in [1 .. n] to (map y in [1 .. n] to ((x == y) ? 1.0 : 0.0));
};
public method .is_lower(): native;
public method .major(): native;
public method .matrix_add() {
arg m1, m2;
var i;
return map i in [1 .. m1.length()] to (.add(m1[i], m2[i]));
};
public method .matrix_mul() {
arg m1, m2;
var x, y;
m2 = .transpose(m2);
return map x in (m1) to (map y in (m2) to (.dot(x, y)));
};
public method .matrix_scale() {
arg s, m;
var x;
return map x in (m) to (.scale(s, x));
};
public method .matrix_sub() {
arg m1, m2;
var i;
return map i in [1 .. m2.length()] to (.sub(m1[i], m2[i]));
};
public method .minor(): native;
public method .pi() {
return pi;
};
public method .pi2() {
return pi2;
};
public method .polar_rectangular() {
arg coords;
return [(coords[1]) * cos(coords[2]), (coords[1]) * sin(coords[2])];
};
public method .rad_deg() {
arg angle;
return angle * 57.2958;
};
public method .rectangular_cylindrical() {
arg coords;
var a;
a = atan2(coords[2], coords[1]);
if (a < 0)
a += pi2;
return [.distance(coords, origin_2d), a, coords[3]];
};
public method .rectangular_polar() {
arg coords;
var a;
a = atan2(coords[2], coords[1]);
if (a < 0)
a += pi2;
return [.distance(coords, origin_2d), a];
};
public method .rectangular_spherical() {
arg coords;
var a, d;
a = atan2(coords[2], coords[1]);
if (a < 0)
a += pi2;
return [(d = .distance(coords, origin_3d)), a, atan2(coords[3], .distance(coords.subrange(1, 2), origin_2d))];
};
public method .rotation_mat_2d() {
arg angle;
var s, c;
s = sin(angle);
c = cos(angle);
return [[c, s, 0.0], [-s, c, 0.0], [0.0, 0.0, 1.0]];
};
public method .rotation_mat_3d() {
arg axis, angle;
var s, c, m, tens;
s = sin(angle);
c = cos(angle);
if (type(axis) == 'list) {
axis = .scale(1.0 / (.distance(axis, origin_3d)), axis);
tens = .tensor(axis, axis);
m = .matrix_add(tens, .matrix_add(.matrix_scale(s, .skew(axis)), .matrix_scale(c, .matrix_sub(.ident_mat(3), tens))));
return [[@m[1], 0.0], [@m[2], 0.0], [@m[3], 0.0], [0.0, 0.0, 0.0, 1.0]];
} else {
switch (axis) {
case 'z:
return [[c, s, 0.0, 0.0], [-s, c, 0.0, 0.0], [0.0, 0.0, 1.0, 0.0], [0.0, 0.0, 0.0, 1.0]];
case 'y:
return [[c, 0.0, -s, 0.0], [0.0, 1.0, 0.0, 0.0], [s, 0.0, c, 0.0], [0.0, 0.0, 0.0, 1.0]];
case 'x:
return [[1.0, 0.0, 0.0, 0.0], [0.0, c, s, 0.0], [0.0, -s, c, 0.0], [0.0, 0.0, 0.0, 1.0]];
}
}
};
public method .runge() {
arg x, y, h, f, data;
var k1, k2, k3, k4, s;
// returns the next timestep for differential equation y'=f(x,y,data)
s = sender();
k1 = s.f(x, y, data);
k2 = s.f(x + (0.5 * h), .add(y, .scale(0.5 * h, k1)), data);
k3 = s.f(x + (0.5 * h), .add(y, .scale(0.5 * h, k2)), data);
k4 = s.f(x + h, .add(y, .scale(h, k3)), data);
return .add(y, .scale(h / 6.0, .add(.add(k1, .scale(2.0, .add(k2, k3))), k4)));
};
public method .scale(): native;
public method .scale_mat() {
arg scale;
if ((scale.length()) == 2)
return [[scale[1], 0.0, 0.0], [0, scale[2], 0.0], [0.0, 0.0, 1.0]];
else
return [[scale[1], 0.0, 0.0, 0.0], [0.0, scale[2], 0.0, 0.0], [0.0, 0.0, scale[3], 0.0], [0.0, 0.0, 0.0, 1]];
};
public method .skew() {
arg v;
return [[0.0, v[3], -(v[2])], [-(v[3]), 0.0, v[1]], [v[2], -(v[1]), 0.0]];
};
public method .spherical_rectangular() {
arg coords;
var r, phi, theta, r1;
r = coords[1];
phi = coords[2];
theta = coords[3];
r1 = r * cos(theta);
return [r1 * cos(phi), r1 * sin(phi), r * sin(theta)];
};
public method .sub(): native;
public method .tensor() {
arg v1, v2;
var x, y;
return map x in (v1) to (map y in (v2) to (x * y));
};
public method .transform_vect() {
arg m, v;
var x, outvect, flag;
if ((m.length()) == ((v.length()) + 1)) {
v += [1.0];
flag = 1;
}
outvect = map x in (m) to (.dot(x, v));
return flag ? (outvect.subrange(1, (outvect.length()) - 1)) : outvect;
};
public method .translation_mat() {
arg vector;
var x, y;
if ((vector.length()) == 2)
return transmat_2d + [vector + [1.0]];
else
return transmat_3d + [vector + [1.0]];
};
public method .transpose(): native;