| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- /*
- * Author: Axel Antoine
- * mail: ax.antoine@gmail.com
- * website: http://axantoine.com
- * Created on Tue Oct 25 2022
- *
- * Loki, Inria project-team with Université de Lille
- * within the Joint Research Unit UMR 9189
- * CNRS - Centrale Lille - Université de Lille, CRIStAL
- * https://loki.lille.inria.fr
- *
- * Licence: Licence.md
- */
-
- import { Vector3 } from "three";
- import { Halfedge } from "../core/Halfedge";
- import { HalfedgeDS } from "../core/HalfedgeDS";
- import { Vertex } from "../core/Vertex";
-
- export function splitEdge(
- struct: HalfedgeDS,
- halfedge: Halfedge,
- position: Vector3,
- tolerance = 1e-10) {
-
- /**
- * From
- * A -------------- he -------------> B
- * A <------------ twin ------------- B
- * To
- * A ---- he ----> v ---- newhe ----> B
- * A <--- twin --- v <--- newtwin --- B
- */
-
- const twin = halfedge.twin;
- const A = halfedge.vertex;
- const B = twin.vertex;
-
- // No need to split if position matches A or B
- if (A.matchesPosition(position, tolerance)) {
- return A;
- }
- if (B.matchesPosition(position, tolerance)) {
- return B;
- }
-
- const newVertex = new Vertex();
- newVertex.position.copy(position);
-
- // Create the new halfegdes
- const newHalfedge = new Halfedge(newVertex);
- const newTwin = new Halfedge(B);
- newHalfedge.twin = newTwin;
- newTwin.twin = newHalfedge;
-
- // Update vertices halfedge refs
- A.halfedge = halfedge;
- newVertex.halfedge = newHalfedge;
- B.halfedge = newTwin;
-
-
- // Copy the face refs
- newHalfedge.face = halfedge.face;
- newTwin.face = twin.face;
-
- // Update next and prev refs
- newHalfedge.next = halfedge.next;
- newHalfedge.prev = halfedge;
- halfedge.next = newHalfedge;
- newTwin.next = twin;
- newTwin.prev = twin.prev;
- twin.prev = newTwin;
-
- // Update structure
- struct.vertices.push(newVertex);
- struct.halfedges.push(newHalfedge);
- struct.halfedges.push(newTwin);
-
- return newVertex;
- }
|