예제 #1
0
        private static HashSet <CommonEdge> GetEdgesDistinct(PolyMesh m, Dictionary <int, int> lookup, out List <CommonEdge> duplicates)
        {
            int[] tris  = m.GetTriangles();
            int   count = tris.Length;

            HashSet <CommonEdge> edges = new HashSet <CommonEdge>();

            duplicates = new List <CommonEdge>();

            for (int i = 0; i < count; i += 3)
            {
                CommonEdge a = new CommonEdge(tris[i + 0], tris[i + 1], lookup[tris[i + 0]], lookup[tris[i + 1]]);
                CommonEdge b = new CommonEdge(tris[i + 1], tris[i + 2], lookup[tris[i + 1]], lookup[tris[i + 2]]);
                CommonEdge c = new CommonEdge(tris[i + 2], tris[i + 0], lookup[tris[i + 2]], lookup[tris[i + 0]]);

                if (!edges.Add(a))
                {
                    duplicates.Add(a);
                }

                if (!edges.Add(b))
                {
                    duplicates.Add(b);
                }

                if (!edges.Add(c))
                {
                    duplicates.Add(c);
                }
            }

            return(edges);
        }
예제 #2
0
        /// <summary>
        /// Returns all vertex indices that are on an open edge.
        /// </summary>
        /// <param name="mesh"></param>
        /// <returns></returns>
        internal static HashSet <int> GetNonManifoldIndices(PolyMesh mesh)
        {
            if (mesh == null)
            {
                return(null);
            }

            List <CommonEdge>    duplicates;
            HashSet <CommonEdge> edges = GetEdgesDistinct(mesh, out duplicates);

            edges.ExceptWith(duplicates);
            HashSet <int> hash = CommonEdge.ToHashSet(edges);

            return(hash);
        }