/******************************************/ /**** IElement2D ****/ /******************************************/ public static Point Centroid(this IElement2D element2D) { Point tmp = Geometry.Query.Centroid(element2D.IOutlineCurve()); double area = Geometry.Query.Area(element2D.IOutlineCurve()); double x = tmp.X * area; double y = tmp.Y * area; double z = tmp.Z * area; List <PolyCurve> openings = Geometry.Compute.BooleanUnion(element2D.IInternalOutlineCurves()); foreach (ICurve o in openings) { Point oTmp = Geometry.Query.ICentroid(o); double oArea = o.IArea(); x -= oTmp.X * oArea; y -= oTmp.Y * oArea; z -= oTmp.Z * oArea; area -= oArea; } return(new Point { X = x / area, Y = y / area, Z = z / area }); }
/******************************************/ /**** IElement2D ****/ /******************************************/ public static List <ICurve> ElementCurves(this IElement2D element2D, bool recursive) { List <ICurve> result = new List <ICurve>(); PolyCurve outline = element2D.IOutlineCurve(); foreach (ICurve curve in outline.Curves) { if (recursive) { result.AddRange(curve.ISubParts()); } else { result.Add(curve); } } foreach (IElement2D e in element2D.IInternalElements2D()) { result.AddRange(e.ElementCurves(recursive)); } return(result); }
/******************************************/ /**** IElement2D ****/ /******************************************/ public static double Area(this IElement2D element2D) { //TODO: make this work for PolyCurves (Booleans needed) double result = element2D.IOutlineCurve().Area(); List <Polyline> openings = new List <Polyline>(); foreach (PolyCurve o in element2D.IInternalOutlineCurves()) { Polyline p = o.ToPolyline(); if (p == null) { throw new NotImplementedException(); } openings.Add(p); } foreach (Polyline p in openings.BooleanUnion()) { result -= p.Area(); } return(result); }
/******************************************/ /**** IElement2D ****/ /******************************************/ public static List <Point> ElementVertices(this IElement2D element2D) { List <Point> result = new List <Point>(); result.AddRange(element2D.IOutlineCurve().ElementVertices()); foreach (IElement2D e in element2D.IInternalElements2D()) { result.AddRange(e.ElementVertices()); } return(result); }
/******************************************/ /**** IElement2D ****/ /******************************************/ public static List <Point> ControlPoints(this IElement2D element2D, bool externalOnly = false) { List <Point> pts = Geometry.Query.ControlPoints(element2D.IOutlineCurve()); if (!externalOnly) { foreach (IElement2D e in element2D.IInternalElements2D()) { pts.AddRange(e.ControlPoints()); } } return(pts); }
/******************************************/ /**** IElement2D ****/ /******************************************/ public static double Area(this IElement2D element2D) { double result = element2D.IOutlineCurve().IArea(); List <PolyCurve> openings = element2D.IInternalOutlineCurves().BooleanUnion(); foreach (PolyCurve o in openings) { result -= o.Area(); } return(result); }
/******************************************/ /**** IElement2D ****/ /******************************************/ public static bool IsSelfIntersecting(this IElement2D element2D, double tolerance = Tolerance.Distance) { if (Geometry.Query.IIsSelfIntersecting(element2D.IOutlineCurve(), tolerance)) { return(true); } foreach (PolyCurve internalOutline in element2D.IInternalOutlineCurves()) { if (Geometry.Query.IIsSelfIntersecting(internalOutline, tolerance)) { return(true); } } return(false); }
/******************************************/ /**** IElement2D ****/ /******************************************/ public static Vector Normal(this IElement2D element2D) { return(element2D.IOutlineCurve().Normal()); }