public void MergeConvexFaces(int maxVertsPerFace) { for (var f = _fHead._next; f != _fHead; f = f._next) { // Skip faces which are outside the result if (!f._inside) { continue; } var eCur = f._anEdge; var vStart = eCur._Org; while (true) { var eNext = eCur._Lnext; var eSym = eCur._Sym; if (eSym != null && eSym._Lface != null && eSym._Lface._inside) { // Try to merge the neighbour faces if the resulting polygons // does not exceed maximum number of vertices. int curNv = f.VertsCount; int symNv = eSym._Lface.VertsCount; if ((curNv + symNv - 2) <= maxVertsPerFace) { // Merge if the resulting poly is convex. if (Geom.VertCcw(eCur.Lprev._Org, eCur._Org, eSym._Lnext._Lnext._Org) && Geom.VertCcw(eSym.Lprev._Org, eSym._Org, eCur._Lnext._Lnext._Org)) { eNext = eSym._Lnext; Delete(eSym); eCur = null; } } } if (eCur != null && eCur._Lnext._Org == vStart) { break; } // Continue to next edge. eCur = eNext; } } }