Exemple #1
0
        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);
        }
Exemple #2
0
        /// <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);
            }
        }
Exemple #3
0
        /// <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);
        }
Exemple #4
0
        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);
        }