UNPKG

xtorcga

Version:

Xtor Compute Geometry Algorithm Libary 计算几何算法库

278 lines (277 loc) 8.94 kB
"use strict"; /** * 当向量以数组的方式出现,一个计算单元库 * @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 */ var __spreadArrays = (this && this.__spreadArrays) || function () { for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length; for (var r = Array(s), k = 0, i = 0; i < il; i++) for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++) r[k] = a[j]; return r; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.vector = void 0; var Polygon_1 = require("../struct/3d/Polygon"); var Polyline_1 = require("../struct/3d/Polyline"); var Vec2_1 = require("./Vec2"); var Vec3_1 = require("./Vec3"); var ckeckVec = function (vs, component) { if (vs.length % component !== 0) throw ("向量组件数量不一样"); }; var vector = /** @class */ (function () { function vector() { } /** * 检测相邻没有重复点 */ vector.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; }; /** * 去除任意重复点 * @param vs 向量数组 * @param component 向量组件数量 * @returns 无重复向量数组 */ vector.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; }; /** * 翻转向量数组 * @param vecs 向量数组 * @param component 组件数量 * @returns */ vector.reverse = function (vecs, component) { if (component === void 0) { component = 3; } ckeckVec(vecs, component); var length = vecs.length; for (var i = 0; i < length; i += component) { vecs.unshift.apply(vecs, vecs.splice(i, component)); } return vecs; }; /** * 点积 * @param vecs * @returns */ vector.dot = function () { var vecs = []; for (var _i = 0; _i < arguments.length; _i++) { vecs[_i] = arguments[_i]; } if (vecs.length % 2 !== 0) throw ("两个向量组件数量不一样"); var len = vecs.length / 2; var dot = 0; for (var i = 0; i < len; i++) { dot += vecs[i] * vecs[len + i]; } return dot; }; /** * 长度平方 * @param vecs * @returns */ vector.distanceSq = function () { var vecs = []; for (var _i = 0; _i < arguments.length; _i++) { vecs[_i] = arguments[_i]; } if (vecs.length % 2 !== 0) throw ("向量组件数量不一样"); 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; }; /** * 长度 * @param vecs * @returns */ vector.distance = function () { var vecs = []; for (var _i = 0; _i < arguments.length; _i++) { vecs[_i] = arguments[_i]; } return Math.sqrt(this.distanceSq.apply(this, vecs)); }; /** * 相加 * @param vecs * @returns */ vector.add = function () { var vecs = []; for (var _i = 0; _i < arguments.length; _i++) { vecs[_i] = arguments[_i]; } if (vecs.length % 2 !== 0) throw ("两个向量组件数量不一样"); 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; }; /** * 相减 * @param vecs * @returns */ vector.sub = function () { var vecs = []; for (var _i = 0; _i < arguments.length; _i++) { vecs[_i] = arguments[_i]; } ckeckVec(vecs, 2); 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; }; /** * 相乘 * @param vecs * @returns */ vector.mul = function () { var vecs = []; for (var _i = 0; _i < arguments.length; _i++) { vecs[_i] = arguments[_i]; } ckeckVec(vecs, 2); 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; }; /** * 获取矢量数组的i个矢量 * @param vecs * @param i * @param component * @returns */ vector.getVecAt = function (vecs, i, component) { if (component === void 0) { component = 3; } return [vecs[3 * i], vecs[3 * i + 1], vecs[3 * i + 2]]; }; /** * 在第 i 个位置插入一个向量 * @param vecs * @param i * @param vec */ vector.insertAt = function (vecs, i) { var vec = []; for (var _i = 2; _i < arguments.length; _i++) { vec[_i - 2] = arguments[_i]; } vecs.splice.apply(vecs, __spreadArrays([i * vecs.length, 0], vecs)); }; // /** * 是否逆时针 * counterclockwise */ vector.isCCW = function (shape, component) { if (component === void 0) { component = 3; } var d = 0; if (shape instanceof Polyline_1.Polyline || shape instanceof Polygon_1.Polygon) for (var i = 0; i < shape.length; i++) { var pt = shape.get(i); var ptnext = shape.get((i + 1) % shape.length); d += -0.5 * (ptnext.y + pt.y) * (ptnext.x - pt.x); } else if (Array.isArray(shape) && shape.length > 0) { if (shape[0] instanceof Vec3_1.Vec3 || shape[0] instanceof Vec2_1.Vec2) { for (var i = 0; i < shape.length; i++) { var pt = shape[i]; var ptnext = shape[(i + 1) % shape.length]; d += -0.5 * (ptnext.y + pt.y) * (ptnext.x - pt.x); } } else if (!isNaN(shape[0])) { for (var i = 0; i < shape.length; i += component) { var ptx = shape[i]; var pty = shape[(i + 1) % shape.length]; var ptnextx = shape[(i + 3) % shape.length]; var ptnexty = shape[(i + 4) % shape.length]; d += -0.5 * (ptnexty + pty) * (ptnextx - ptx); } } } return d > 0; }; return vector; }()); exports.vector = vector;