From 88c73ca3289410f4de29b3585166c2bacb6c2891 Mon Sep 17 00:00:00 2001 From: Marian Date: Sat, 10 Feb 2024 21:46:31 +0000 Subject: [PATCH] Add a helper function to get a vector on a triangle edge --- src/export/STLExporter.ts | 44 +++++++++++++++++++-------------------- src/geometry/Triangle.ts | 14 ++++++++++++- 2 files changed, 35 insertions(+), 23 deletions(-) diff --git a/src/export/STLExporter.ts b/src/export/STLExporter.ts index a6d30cc..eb80e95 100644 --- a/src/export/STLExporter.ts +++ b/src/export/STLExporter.ts @@ -95,45 +95,45 @@ class STLExporter { for (var i = 0; i < edge1Hits.length - 1; i++) { result.push(new Triangle( - Vector3.interpolate(triangle.v1, triangle.v2, edge1Hits[i]), - Vector3.interpolate(triangle.v1, triangle.v2, edge1Hits[i + 1]), - Vector3.interpolate(triangle.v3, triangle.v1, edge3Hits[edge3Hits.length - 1]) + triangle.getOnEdge1(edge1Hits[i]), + triangle.getOnEdge1(edge1Hits[i + 1]), + triangle.getOnEdge3(edge3Hits[edge3Hits.length - 1]) )); } for (var i = 0; i < edge2Hits.length - 1; i++) { result.push(new Triangle( - Vector3.interpolate(triangle.v2, triangle.v3, edge2Hits[i]), - Vector3.interpolate(triangle.v2, triangle.v3, edge2Hits[i + 1]), - Vector3.interpolate(triangle.v1, triangle.v2, edge1Hits[edge1Hits.length - 1]) + triangle.getOnEdge2(edge2Hits[i]), + triangle.getOnEdge2(edge2Hits[i + 1]), + triangle.getOnEdge1(edge1Hits[edge1Hits.length - 1]) )); } for (var i = 0; i < edge3Hits.length - 1; i++) { result.push(new Triangle( - Vector3.interpolate(triangle.v3, triangle.v1, edge3Hits[i]), - Vector3.interpolate(triangle.v3, triangle.v1, edge3Hits[i + 1]), - Vector3.interpolate(triangle.v2, triangle.v3, edge2Hits[edge2Hits.length - 1]) - )) + triangle.getOnEdge3(edge3Hits[i]), + triangle.getOnEdge3(edge3Hits[i + 1]), + triangle.getOnEdge2(edge2Hits[edge2Hits.length - 1]) + )); } if (edge1Hits.length > 1 && edge2Hits.length == 1) { result.push(new Triangle( - Vector3.interpolate(triangle.v1, triangle.v2, edge1Hits[edge1Hits.length - 1]), - Vector3.interpolate(triangle.v2, triangle.v3, edge2Hits[0]), - Vector3.interpolate(triangle.v3, triangle.v1, edge3Hits[edge3Hits.length - 1]), - )) + triangle.getOnEdge1(edge1Hits[edge1Hits.length - 1]), + triangle.getOnEdge2(edge2Hits[0]), + triangle.getOnEdge3(edge3Hits[edge3Hits.length - 1]) + )); } else if (edge2Hits.length > 1 && edge3Hits.length == 1) { result.push(new Triangle( - Vector3.interpolate(triangle.v2, triangle.v3, edge2Hits[edge2Hits.length - 1]), - Vector3.interpolate(triangle.v3, triangle.v1, edge3Hits[0]), - Vector3.interpolate(triangle.v1, triangle.v2, edge1Hits[edge1Hits.length - 1]), - )) + triangle.getOnEdge2(edge2Hits[edge2Hits.length - 1]), + triangle.getOnEdge3(edge3Hits[0]), + triangle.getOnEdge1(edge1Hits[edge1Hits.length - 1]) + )); } else if (edge3Hits.length > 1 && edge1Hits.length == 1) { result.push(new Triangle( - Vector3.interpolate(triangle.v3, triangle.v1, edge3Hits[edge3Hits.length - 1]), - Vector3.interpolate(triangle.v1, triangle.v2, edge1Hits[0]), - Vector3.interpolate(triangle.v2, triangle.v3, edge2Hits[edge2Hits.length - 1]), - )) + triangle.getOnEdge3(edge3Hits[edge3Hits.length - 1]), + triangle.getOnEdge1(edge1Hits[0]), + triangle.getOnEdge2(edge2Hits[edge2Hits.length - 1]) + )); } } diff --git a/src/geometry/Triangle.ts b/src/geometry/Triangle.ts index dfad3d6..14a3bb0 100644 --- a/src/geometry/Triangle.ts +++ b/src/geometry/Triangle.ts @@ -15,7 +15,19 @@ class Triangle { } } - normal(): Vector3 { + public normal(): Vector3 { return this.v3.minus(this.v1).cross(this.v2.minus(this.v1)).normalized(); } + + public getOnEdge1(progress: number): Vector3 { + return Vector3.interpolate(this.v1, this.v2, progress); + } + + public getOnEdge2(progress: number): Vector3 { + return Vector3.interpolate(this.v2, this.v3, progress); + } + + public getOnEdge3(progress: number): Vector3 { + return Vector3.interpolate(this.v3, this.v1, progress); + } } \ No newline at end of file