diff --git a/__test__/Geometry/angleTo.test.ts b/__test__/Geometry/angleTo.test.ts index b00b779e7..cd28d0249 100644 --- a/__test__/Geometry/angleTo.test.ts +++ b/__test__/Geometry/angleTo.test.ts @@ -37,3 +37,11 @@ test('变量补全', () => let v = angleTo(new Vector3(1, 0, 0), new Vector3(0, 0, 1)); //? expect(v).toEqual(Math.PI * 0.5); }); + +test('几乎平行的2向量', () => +{ + let v1 = new Vector3(1); + let v2 = new Vector3(-1, 1.2246467991473532e-16, 5.041544910049491e-16); + let v = angleTo(v1, v2); //? + expect(v).toEqual(Math.PI); +}); diff --git a/src/Geometry/GeUtils.ts b/src/Geometry/GeUtils.ts index 40d3b85d6..68ee8ea75 100644 --- a/src/Geometry/GeUtils.ts +++ b/src/Geometry/GeUtils.ts @@ -97,7 +97,7 @@ export function polar(v: T, an: number, dis: number return v; } -export function angle(v: Vector3 | Vector2) +export function angle(v: Vector3 | Vector2): number { let angle = Math.atan2(v.y, v.x); if (equaln(angle, 0, 1e-8)) return 0; @@ -113,13 +113,17 @@ export function angle(v: Vector3 | Vector2) * @param {Vector3} [ref] 参考向量,如果为世界坐标系则为0,0,1 * @returns */ -export function angleTo(v1: Vector3, v2: Vector3, ref: Vector3 = new Vector3(0, 0, 1)) +export function angleTo(v1: Vector3, v2: Vector3, ref: Vector3 = ZAxis): number { - if (!ref.equals(new Vector3(0, 0, 1))) + if (v1.equals(ZeroVec) || v2.equals(ZeroVec)) + return 0; + + v1 = v1.clone(); + v2 = v2.clone(); + + if (ref !== ZAxis && !ref.equals(ZAxis)) { ref = ref.clone(); - v1 = v1.clone(); - v2 = v2.clone(); //任意轴坐标系. 使用相机的构造矩阵. ref.multiplyScalar(-1); let up = getLoocAtUpVec(ref); @@ -131,10 +135,10 @@ export function angleTo(v1: Vector3, v2: Vector3, ref: Vector3 = new Vector3(0, v1.z = 0; v2.z = 0; } - if (v1.equals(ZeroVec) || v2.equals(ZeroVec)) - return 0; - let cv = new Vector3().crossVectors(v1, v2).normalize(); - return cv.z === 0 ? v1.angleTo(v2) : v1.angleTo(v2) * cv.z; + + //法向量不能转成单位向量在判断,可能会导致原先z===0被转成大于0 + let cv = new Vector3().crossVectors(v1.normalize(), v2.normalize()); + return equaln(cv.z, 0) ? v1.angleTo(v2) : v1.angleTo(v2) * cv.z; } export function getLoocAtUpVec(dir: Vector3): Vector3 diff --git a/src/Production/Product.ts b/src/Production/Product.ts index a5a7112af..5d794d9ab 100644 --- a/src/Production/Product.ts +++ b/src/Production/Product.ts @@ -791,6 +791,9 @@ export namespace Production if (Math.max(z0, 0) < Math.min(z1, br.Thickness) - 1e-6 && outline.PtInCurve(p)) { let depth = z0 < 1e-2 ? z1 : br.Thickness - z0; + let angle = angleTo(XAxis, x); + if (equaln(angle, Math.PI)) + angle = 0; if (depth > 1e-2) data.frontBackHoles.push({ type: d.isThrough ? GangDrillType.TK : GangDrillType.Ymj, @@ -798,7 +801,7 @@ export namespace Production radius: cir.Radius, depth, face: z0 < 1e-6 ? DrillingFace.Back : DrillingFace.Front, - angle: angleTo(XAxis, x), + angle: angle, }); } }