mirror of
https://github.com/xibyte/jsketcher
synced 2025-12-06 16:33:15 +01:00
84 lines
No EOL
1.9 KiB
JavaScript
84 lines
No EOL
1.9 KiB
JavaScript
TCAD.math = {};
|
|
|
|
TCAD.math._arr = function(size) {
|
|
var out = [];
|
|
out.length = size;
|
|
for (var i = 0; i < size; ++i) {
|
|
out[i] = 0;
|
|
}
|
|
return out;
|
|
};
|
|
|
|
TCAD.math._matrix = function(m, n) {
|
|
var out = [];
|
|
out.length = m;
|
|
for (var i = 0; i < m; ++i) {
|
|
out[i] = TCAD.math._arr(n);
|
|
}
|
|
return out;
|
|
};
|
|
|
|
TCAD.math.distanceAB = function(a, b) {
|
|
return TCAD.math.distance(a.x, a.y, b.x, b.y);
|
|
};
|
|
|
|
TCAD.math.distance = function(x1, y1, x2, y2) {
|
|
var dx = x1 - x2;
|
|
var dy = y1 - y2;
|
|
return Math.sqrt(dx * dx + dy * dy);
|
|
};
|
|
|
|
TCAD.math.ORIGIN = new TCAD.Vector(0, 0, 0);
|
|
|
|
TCAD.math.AXIS = {
|
|
X : new TCAD.Vector(1, 0, 0),
|
|
Y : new TCAD.Vector(0, 1, 0),
|
|
Z : new TCAD.Vector(0, 0, 1)
|
|
};
|
|
|
|
TCAD.math.rotateMatrix = function(angle, axis, pivot) {
|
|
var sin = Math.sin(angle);
|
|
var cos = Math.cos(angle);
|
|
var axisX, axisY, axisZ;
|
|
var m = new TCAD.Matrix();
|
|
|
|
var AXIS = TCAD.math.AXIS;
|
|
|
|
if (axis === AXIS.X || axis === AXIS.Y || axis === AXIS.Z) {
|
|
axisX = axis.x;
|
|
axisY = axis.y;
|
|
axisZ = axis.z;
|
|
} else {
|
|
// normalize
|
|
var mag = axis.length();
|
|
|
|
if (mag == 0.0) {
|
|
return m;
|
|
} else {
|
|
axisX = axis.x / mag;
|
|
axisY = axis.y / mag;
|
|
axisZ = axis.z / mag;
|
|
}
|
|
}
|
|
|
|
var px = pivot.x;
|
|
var py = pivot.y;
|
|
var pz = pivot.z;
|
|
|
|
m.mxx = cos + axisX * axisX * (1 - cos);
|
|
m.mxy = axisX * axisY * (1 - cos) - axisZ * sin;
|
|
m.mxz = axisX * axisZ * (1 - cos) + axisY * sin;
|
|
|
|
m.tx = px * (1 - m.mxx) - py * m.mxy - pz * m.mxz;
|
|
|
|
m.myx = axisY * axisX * (1 - cos) + axisZ * sin;
|
|
m.myy = cos + axisY * axisY * (1 - cos);
|
|
m.myz = axisY * axisZ * (1 - cos) - axisX * sin;
|
|
m.ty = py * (1 - m.myy) - px * m.myx - pz * m.myz;
|
|
|
|
m.mzx = axisZ * axisX * (1 - cos) - axisY * sin;
|
|
m.mzy = axisZ * axisY * (1 - cos) + axisX * sin;
|
|
m.mzz = cos + axisZ * axisZ * (1 - cos);
|
|
m.tz = pz * (1 - m.mzz) - px * m.mzx - py * m.mzy;
|
|
return m;
|
|
}; |