public static IntPoint[][] nfpToClipperCoordinates(NFP nfp, double clipperScale = 10000000) { List <IntPoint[]> clipperNfp = new List <IntPoint[]>(); // children first if (nfp.Childrens != null && nfp.Childrens.Count > 0) { for (var j = 0; j < nfp.Childrens.Count; j++) { if (GeometryUtil.polygonArea(nfp.Childrens[j]) < 0) { nfp.Childrens[j].reverse(); } var childNfp = ClipperHelper.ScaleUpPaths(nfp.Childrens[j], clipperScale); clipperNfp.Add(childNfp); } } if (GeometryUtil.polygonArea(nfp) > 0) { nfp.reverse(); } var outerNfp = ClipperHelper.ScaleUpPaths(nfp, clipperScale); clipperNfp.Add(outerNfp); return(clipperNfp.ToArray()); }
public static IntPoint[][] nfpToClipperCoordinates(NFP nfp, double clipperScale = 10000000) { List <IntPoint[]> clipperNfp = new List <IntPoint[]>(); // children first if (nfp.Childrens != null && nfp.Childrens.Count > 0) { for (var j = 0; j < nfp.Childrens.Count; j++) { if (GeometryUtil.polygonArea(nfp.Childrens[j]) < 0) { nfp.Childrens[j].reverse(); } //var childNfp = SvgNest.toClipperCoordinates(nfp.children[j]); var childNfp = ScaleUpPaths(nfp.Childrens[j], clipperScale); clipperNfp.Add(childNfp); } } if (GeometryUtil.polygonArea(nfp) > 0) { nfp.reverse(); } //var outerNfp = SvgNest.toClipperCoordinates(nfp); // clipper js defines holes based on orientation var outerNfp = ScaleUpPaths(nfp, clipperScale); //var cleaned = ClipperLib.Clipper.CleanPolygon(outerNfp, 0.00001*config.clipperScale); clipperNfp.Add(outerNfp); //var area = Math.abs(ClipperLib.Clipper.Area(cleaned)); return(clipperNfp.ToArray()); }