internal static void CollapseEdge(this Kernel kernel, HalfEdge edge) { if (EdgeLinker.IsDummyPairEdge(edge)) { edge = edge.Pair; } // if the edge is naked, we don't have to change the other face if (EdgeLinker.IsDummyPairEdge(edge.Pair)) { CollapseNakedEdge(edge, kernel); return; } CollapseEdgeBetweenFaces(edge, kernel); }
/// <summary> /// Removes all unused Edges from the kernel /// Unused edges are edge-pairs, where both pairs are naked /// </summary> /// <param name="kernel"></param> internal static void RemoveUnusedEdges(this Kernel kernel) { foreach (var edge in kernel.Edges) { if (!EdgeLinker.IsDummyPairEdge(edge)) { continue; } if (!EdgeLinker.IsDummyPairEdge(edge.Pair)) { continue; } kernel.Remove(edge); } }
/// <summary> /// Removes a <see cref="HalfEdge"/>. This also removes its pair, /// as HalfEdges are not allowed to be single ;) /// </summary> /// <param name="edge"></param> /// <returns></returns> public override bool Remove(HalfEdge edge) { // handle active references to edge if (!EdgeLinker.IsDummyPairEdge(edge)) { RemoveReferences(edge); } // handle active references to its pair if (!EdgeLinker.IsDummyPairEdge(edge.Pair)) { RemoveReferences(edge.Pair); } // unlink the edges EdgeLinker.UnlinkEdge(edge); EdgeLinker.UnlinkEdge(edge.Pair); // remove edges from inner collection _elements.Remove(edge); _elements.Remove(edge.Pair); return(true); }
internal static bool TrySplitEdge(this Kernel kernel, HalfEdge edge, double t, out (HalfEdge, HalfEdge) parts) { parts = (null, null); // TODO: Error checks if (EdgeLinker.IsDummyPairEdge(edge)) { edge = edge.Pair; } // test valid param if (0 > t || t > 1) { return(false); } // calculate vec at param var vec = edge.Origin.Position.VecAtParameter(edge.Target.Position, t); // convert to a vertex var vertex = kernel.GetVertexForPosition(vec); // store edge pair, and conditionals var pair = edge.Pair; var isDummy = EdgeLinker.IsDummyPairEdge(pair); var isStart = edge.Face.Start == edge; // create new edges var firstHalf = new HalfEdge { Face = edge.Face, Previous = edge.Previous, Origin = edge.Origin }; var secondHalf = new HalfEdge { Face = edge.Face, Next = edge.Next, Origin = vertex }; var pairFirstHalf = new HalfEdge { Face = pair.Face, Previous = pair.Previous, Origin = pair.Origin, Pair = secondHalf, }; var pairSecondHalf = new HalfEdge { Face = pair.Face, Next = pair.Next, Origin = vertex, Pair = firstHalf }; // link halves firstHalf.Next = secondHalf; pairFirstHalf.Next = pairSecondHalf; // remove original edges kernel.Remove(edge); // add new halves if (!isDummy) { kernel.Insert(firstHalf); kernel.Insert(secondHalf); kernel.Insert(pairFirstHalf); kernel.Insert(pairSecondHalf); } else { firstHalf.Pair = null; secondHalf.Pair = null; kernel.Insert(firstHalf); kernel.Insert(secondHalf); } // set start to first half if (isStart) { firstHalf.Face.Start = firstHalf; } parts = (firstHalf, secondHalf); return(true); }