示例#1
0
        public static List <int[]> ComputeNonConcaveSubPolygons(
            this V3d[] vertexArray, int polyCount,
            V3d[] normalArray, int[] firstIndices, int[] vertexIndices,
            List <int> faceBackMap,
            double absoluteEpsilon)
        {
            var polyList = new List <int[]>();
            var eps2     = absoluteEpsilon * absoluteEpsilon;

            for (int fvi = 0, fi = 0; fi < polyCount; fi++)
            {
                int fve = firstIndices[fi + 1], fvc = fve - fvi;
                var n  = normalArray[fi];
                var l2 = n.LengthSquared;
                if (l2 < eps2)
                {
                    polyList.Add(new int[fvc].SetByIndex(i => vertexIndices[fvi + i]));
                    if (faceBackMap != null)
                    {
                        faceBackMap.Add(fi);
                    }
                    fvi = fve;
                    continue;
                }
                M44d local2global, global2local;
                M44d.NormalFrame(V3d.Zero, n, out local2global, out global2local);
                var polygon = new Polygon2d(fvc,
                                            i => global2local.TransformPos(vertexArray[vertexIndices[fvi + i]]).XY);
                var subPolyList = polygon.ComputeNonConcaveSubPolygons(absoluteEpsilon);
                foreach (var poly in subPolyList)
                {
                    polyList.Add(poly.Map(i => fvi + i));
                }
                if (faceBackMap != null)
                {
                    for (int i = 0; i < subPolyList.Count; i++)
                    {
                        faceBackMap.Add(fi);
                    }
                }
                fvi = fve;
            }

            return(polyList);
        }