public PlanarEdge(HardEdge edge, Triangle triangle, Plane plane)
            {
                Face             = triangle;
                OrigEdge         = edge;
                P1               = plane.ProjectPoint(edge.P1);
                P2               = plane.ProjectPoint(edge.P2);
                OutlineDirection = plane.ProjectVector(edge.OutlineDirection);

                IsTriangleEdge = triangle.ContainsVertex(edge.P1) &&
                                 triangle.ContainsVertex(edge.P2) &&
                                 triangle.Normal.Equals(edge.FaceNormal, 0.05f);


                Direction = (P2 - P1).Normalized();
            }
            public bool GetBySharedVertex(HardEdge edge, Vector3 vertex, out HardEdge result)
            {
                result = null;
                if (InnerDict.TryGetValue(vertex, out List <HardEdge> sharedEdges))
                {
                    var nearEdges = sharedEdges
                                    .Where(x => x != edge &&
                                           Vector3.AngleBetween(x.FaceNormal, edge.FaceNormal) <= BreakAngleRad &&
                                           Vector3.AngleBetween(x.OutlineDirection, edge.OutlineDirection) <= fPI * 0.85
                                           )
                                    .OrderBy(x => Vector3.AngleBetween(x.FaceNormal, edge.FaceNormal))
                                    .ThenBy(x => Vector3.AngleBetween(x.OutlineDirection, edge.OutlineDirection));

                    if (nearEdges.Count() > 0)
                    {
                        result = nearEdges.First();
                        return(true);
                    }
                }
                return(false);
            }
        static ProjectedEdge CreateClippingEdge(ProjectedEdge baseEdge, Vector3 edgeEnd, Plane facePlane)
        {
            var triangle   = baseEdge.PlanarEdge.Face;
            var oppVert    = baseEdge.PlanarEdge.GetOppositeVertex(edgeEnd);
            var outlineDir = (edgeEnd - oppVert).Normalized();

            var interEdge = new HardEdge(
                edgeEnd,
                edgeEnd + baseEdge.PlanarEdge.OutlineDirection,
                facePlane.Normal,
                outlineDir);

            interEdge.CorrectOrder();
            var planarEndEdge  = new PlanarEdge(interEdge, triangle, facePlane);
            var interProjected = planarEndEdge.ProjectTriangle(triangle, edgeEnd);

            interProjected.NeedsToBeClipped = true;

            baseEdge.CombineWith       = interProjected;
            interProjected.CombineWith = baseEdge;

            return(interProjected);
        }