"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var three_1 = require("three"); var Matrix2_1 = require("./Matrix2"); exports.cZeroVec = new three_1.Vector3(); exports.cXAxis = new three_1.Vector3(1, 0, 0); exports.cYAxis = new three_1.Vector3(0, 1, 0); exports.cZAxis = new three_1.Vector3(0, 0, 1); /** * 旋转一个点,旋转中心在原点 * * @export * @param {Vector3} pt 点 * @param {number} ang 角度. * @returns {Vector3} 返回pt不拷贝. */ function rotatePoint(pt, ang) { new Matrix2_1.Matrix2().setRotate(ang).applyVector(pt); return pt; } exports.rotatePoint = rotatePoint; function equaln(v1, v2, fuzz) { if (fuzz === void 0) { fuzz = 1e-3; } return Math.abs(v1 - v2) < fuzz; } exports.equaln = equaln; function equalv3(v1, v2, fuzz) { if (fuzz === void 0) { fuzz = 1e-8; } return equaln(v1.x, v2.x, fuzz) && equaln(v1.y, v2.y, fuzz) && equaln(v1.z, v2.z, fuzz); } exports.equalv3 = equalv3; function equal(v1, v2) { return v1.distanceToSquared(v2) < 1e-8; } exports.equal = equal; function fixAngle(an, fixAngle, fuzz) { if (fuzz === void 0) { fuzz = 0.1; } if (an < 0) an += Math.PI * 2; an += fuzz; var rem = an % fixAngle; if (rem < fuzz * 2) { an -= rem; } else { an -= fuzz; } return an; } exports.fixAngle = fixAngle; /** * 按照极坐标的方式移动一个点 * * @export * @template * @param {T} v 向量(2d,3d) * @param {number} an 角度 * @param {number} dis 距离 * @returns {T} */ function polar(v, an, dis) { v.x += Math.cos(an) * dis; v.y += Math.sin(an) * dis; return v; } exports.polar = polar; function angle(v) { if (equaln(v.y, 0) && v.x > 0) return 0; var angle = Math.atan2(v.y, v.x); if (angle < 0) angle += Math.PI * 2; return angle; } exports.angle = angle; /** * 求两个向量的夹角,顺时针为负,逆时针为正 * * @param {Vector3} v1 * @param {Vector3} v2 * @param {Vector3} [ref] 参考向量,如果为世界坐标系则为0,0,1 * @returns */ function angleTo(v1, v2, ref) { if (ref === void 0) { ref = new three_1.Vector3(0, 0, 1); } if (!ref.equals(new three_1.Vector3(0, 0, 1))) { //任意轴坐标系. 使用相机的构造矩阵. ref.multiplyScalar(-1); var up = getLoocAtUpVec(ref); var refOcs = new three_1.Matrix4(); refOcs.lookAt(exports.cZeroVec, ref, up); var refOcsInv = new three_1.Matrix4().getInverse(refOcs); v1.applyMatrix4(refOcsInv); v2.applyMatrix4(refOcsInv); v1.z = 0; v2.z = 0; } if (v1.equals(exports.cZeroVec) || v2.equals(exports.cZeroVec)) return 0; var cv = new three_1.Vector3().crossVectors(v1, v2).normalize(); return cv.z === 0 ? v1.angleTo(v2) : v1.angleTo(v2) * cv.z; } exports.angleTo = angleTo; function getLoocAtUpVec(dir) { if (dir.equals(exports.cZeroVec)) { throw ("zero vector"); } var norm = dir.clone().normalize(); if (norm.equals(exports.cZAxis)) { return new three_1.Vector3(0, 1, 0); } else if (norm.equals(exports.cZAxis.clone().negate())) { return new three_1.Vector3(0, -1, 0); } else { var xv = new three_1.Vector3(); xv.crossVectors(exports.cZAxis, norm); var up = new three_1.Vector3(); up.crossVectors(norm, xv); return up; } } exports.getLoocAtUpVec = getLoocAtUpVec; function createLookAtMat4(dir) { var up = getLoocAtUpVec(dir); var mat = new three_1.Matrix4(); mat.lookAt(exports.cZeroVec, dir, up); return mat; } exports.createLookAtMat4 = createLookAtMat4; function isParallelTo(v1, v2) { return v1.clone().cross(v2).lengthSq() < 1e-9; } exports.isParallelTo = isParallelTo; function ptToString(v, fractionDigits) { if (fractionDigits === void 0) { fractionDigits = 3; } return v.toArray().map(function (o) { return o.toFixed(fractionDigits); }).join(","); } exports.ptToString = ptToString; function midPoint(v1, v2) { return v1.clone().add(v2).multiplyScalar(0.5); } exports.midPoint = midPoint; function midPoint2(v1, v2) { return v1.clone().add(v2).multiplyScalar(0.5); } exports.midPoint2 = midPoint2; function midPtCir(v1, v2) { var baseline = new three_1.Vector3(1, 0, 0); var outLine = v2.clone().sub(v1); var ang = angleTo(baseline, outLine) / 2; var midLine = rotatePoint(outLine, -ang); return v1.clone().add(midLine); } exports.midPtCir = midPtCir; /** * 获得Three对象的包围盒. * @param obj * @param [updateMatrix] 是否应该更新对象矩阵 * @returns box */ function GetBox(obj, updateMatrix) { var box = new three_1.Box3(); if (updateMatrix) obj.updateMatrixWorld(false); if (!obj.visible) return box; obj.traverse(function (o) { //因为实体Erase时,实体仍然保存在Scene中. if (o.visible === false) return; //@ts-ignore var geo = o.geometry; if (geo) { if (!geo.boundingBox) geo.computeBoundingBox(); box.union(geo.boundingBox.clone().applyMatrix4(o.matrixWorld)); } }); return box; } exports.GetBox = GetBox; function GetBoxArr(arr) { var box = new three_1.Box3(); for (var _i = 0, arr_1 = arr; _i < arr_1.length; _i++) { var o = arr_1[_i]; var b = GetBox(o); if (!b.isEmpty()) box.union(b); } return box; } exports.GetBoxArr = GetBoxArr; function MoveMatrix(v) { var mat = new three_1.Matrix4(); mat.makeTranslation(v.x, v.y, v.z); return mat; } exports.MoveMatrix = MoveMatrix; function getProjectDist(v1, v2) { var ang = v1.angleTo(v2); var dist = v1.length(); return { h: dist * Math.cos(ang), v: dist * Math.sin(ang) }; } exports.getProjectDist = getProjectDist; //获得输入点在2线组成的4个区间的位置 function getPtPostion(sp, ep, c, inPt) { var l1 = sp.clone().sub(c); var l2 = ep.clone().sub(c); var l3 = l1.clone().negate(); var l4 = l2.clone().negate(); var inputLine = inPt.clone().sub(c); var ang1 = angleTo(l1, l2); var ang2 = Math.PI; var ang3 = ang2 + Math.abs(ang1); var inputAng = angleTo(l1, inputLine); if (ang1 * inputAng < 0) { inputAng = (Math.PI * 2 - Math.abs(inputAng)); } ang1 = Math.abs(ang1); inputAng = Math.abs(inputAng); if (inputAng <= ang1) { return { sp: sp, ep: ep }; } else if (inputAng > ang1 && inputAng <= ang2) { return { sp: c.clone().add(l3), ep: ep }; } else if (inputAng > ang2 && inputAng <= ang3) { return { sp: c.clone().add(l3), ep: c.clone().add(l4) }; } else { return { sp: sp, ep: c.clone().add(l4) }; } } exports.getPtPostion = getPtPostion; function angleAndX(v) { return v.x ? Math.atan(v.y / v.x) : Math.PI / 2; } exports.angleAndX = angleAndX; /** * 将角度调整为0-2pi之间 * * @export * @param {number} an */ function angleTo2Pi(an) { an = an % (Math.PI * 2); if (an < 0) an += Math.PI * 2; return an; } exports.angleTo2Pi = angleTo2Pi; function updateGeometry(l, geometry) { var geo = l.geometry; geo.dispose(); l.geometry = geometry; geometry.verticesNeedUpdate = true; geometry.computeBoundingSphere(); } exports.updateGeometry = updateGeometry; //# sourceMappingURL=GeUtils.js.map