xtorcga
Version:
Xtor Compute Geometry Algorithm Libary 计算几何算法库
142 lines (141 loc) • 4.68 kB
JavaScript
;
/**
* 当向量以数组的方式出现,一个计算单元库
* @Description : 向量数组
* @Author : 赵耀圣
* @QQ : 549184003
* @Date : 2021-08-02 15:09:33
* @LastEditTime : 2021-08-02 15:50:16
* @FilePath : \cga.js\src\math\VecArray.ts
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.VecArray = void 0;
var VecArray = /** @class */ (function () {
function VecArray() {
}
/**
* 检测相邻没有重复点
*/
VecArray.uniqueNeighbor = function (vs, component) {
if (component === void 0) { component = 3; }
for (var i = 0; i < vs.length; i += component) {
for (var j = i + 3; j < vs.length;) {
var lensq = 0;
for (var c = 0; c < component; c++) {
lensq += (vs[i + c] - vs[j + c]) * (vs[i + c] - vs[j + c]);
}
if (Math.sqrt(lensq) < 1e-5)
vs.splice(j, component);
else
break;
}
}
return vs;
};
/**
* 去除任意重复点
*
*/
VecArray.unique = function (vs, component) {
if (component === void 0) { component = 3; }
for (var i = 0; i < vs.length; i += component) {
for (var j = i + 3; j < vs.length;) {
var lensq = 0;
for (var c = 0; c < component; c++) {
lensq += (vs[i + c] - vs[j + c]) * (vs[i + c] - vs[j + c]);
}
if (Math.sqrt(lensq) < 1e-5)
vs.splice(j, component);
else
j += component;
}
}
return vs;
};
VecArray.distanceSq = function () {
var vecs = [];
for (var _i = 0; _i < arguments.length; _i++) {
vecs[_i] = arguments[_i];
}
if (vecs.length % 2 !== 0)
console.error("VecArray:distanceSq 向量错误!!!");
var len = vecs.length / 2;
var lenSq = 0;
for (var i = 0; i < len; i++) {
var d = (vecs[i] - vecs[len + i]);
lenSq += d * d;
}
return lenSq;
};
VecArray.distance = function () {
var vecs = [];
for (var _i = 0; _i < arguments.length; _i++) {
vecs[_i] = arguments[_i];
}
return Math.sqrt(this.distanceSq.apply(this, vecs));
};
VecArray.reverse = function (vs, component) {
if (component === void 0) { component = 3; }
var length = vs.length;
for (var i = 0; i < length; i += component) {
vs.unshift.apply(vs, vs.splice(i, component));
}
return vs;
};
VecArray.dot = function () {
var vecs = [];
for (var _i = 0; _i < arguments.length; _i++) {
vecs[_i] = arguments[_i];
}
if (vecs.length % 2 !== 0)
console.error("VecArray:distanceSq 向量错误!!!");
var len = vecs.length / 2;
var dot = 0;
for (var i = 0; i < len; i++) {
dot += vecs[i] * vecs[len + i];
}
return dot;
};
VecArray.add = function () {
var vecs = [];
for (var _i = 0; _i < arguments.length; _i++) {
vecs[_i] = arguments[_i];
}
if (Array.isArray(vecs[0]) && Array.isArray(vecs[1])) {
for (var i = 0; i < vecs[0].length; i++) {
vecs[0][i] += vecs[1][i];
}
return vecs[0];
}
if (vecs.length % 2 !== 0)
console.error("VecArray:distanceSq 向量错误!!!");
var len = vecs.length / 2;
var res = [];
for (var i = 0; i < len; i++) {
res[i] = res[len + i] + res[i];
}
return res;
};
VecArray.sub = function () {
var vecs = [];
for (var _i = 0; _i < arguments.length; _i++) {
vecs[_i] = arguments[_i];
}
if (Array.isArray(vecs[0]) && Array.isArray(vecs[1])) {
for (var i = 0; i < vecs[0].length; i++) {
vecs[0][i] -= vecs[1][i];
}
return vecs[0];
}
if (vecs.length % 2 !== 0)
console.error("VecArray:distanceSq 向量错误!!!");
var len = vecs.length / 2;
var res = [];
for (var i = 0; i < len; i++) {
res[i] = res[i] - res[len + i];
}
return res;
};
return VecArray;
}());
exports.VecArray = VecArray;