/// <summary> /// Gets the centroid of the polyline 2d. /// </summary> /// <param name="pl">The instance to which the method applies.</param> /// <returns>The centroid of the polyline 2d (WCS coordinates).</returns> public static Point3d Centroid(this Polyline2d pl) { Vertex2d[] vertices = pl.GetVertices().ToArray(); int last = vertices.Length - 1; Vertex2d vertex = vertices[0]; Point2d p0 = vertex.Position.Convert2d(); double elev = pl.Elevation; Point2d cen = new Point2d(0.0, 0.0); double area = 0.0; double bulge = vertex.Bulge; double tmpArea; Point2d tmpPt; Triangle2d tri = new Triangle2d(); CircularArc2d arc = new CircularArc2d(); if (bulge != 0.0) { arc = pl.GetArcSegment2dAt(0); tmpArea = arc.AlgebricArea(); tmpPt = arc.Centroid(); area += tmpArea; cen += ((new Point2d(tmpPt.X, tmpPt.Y)) * tmpArea).GetAsVector(); } for (int i = 1; i < last; i++) { Point2d p1 = vertices[i].Position.Convert2d(); Point2d p2 = vertices[i + 1].Position.Convert2d(); tri.Set(p0, p1, p2); tmpArea = tri.AlgebricArea; area += tmpArea; cen += (tri.Centroid * tmpArea).GetAsVector(); bulge = vertices[i].Bulge; if (bulge != 0.0) { arc = pl.GetArcSegment2dAt(i); tmpArea = arc.AlgebricArea(); tmpPt = arc.Centroid(); area += tmpArea; cen += ((new Point2d(tmpPt.X, tmpPt.Y)) * tmpArea).GetAsVector(); } } bulge = vertices[last].Bulge; if ((bulge != 0.0) && (pl.Closed == true)) { arc = pl.GetArcSegment2dAt(last); tmpArea = arc.AlgebricArea(); tmpPt = arc.Centroid(); area += tmpArea; cen += ((new Point2d(tmpPt.X, tmpPt.Y)) * tmpArea).GetAsVector(); } cen = cen.DivideBy(area); return(new Point3d(cen.X, cen.Y, pl.Elevation).TransformBy(Matrix3d.PlaneToWorld(pl.Normal))); }
/// <summary> /// Gets the centroid of the polyline. /// </summary> /// <param name="pl">The instance to which the method applies.</param> /// <returns>The centroid of the polyline (OCS coordinates).</returns> public static Point2d Centroid2d(this Polyline pl) { Point2d cen = new Point2d(); Triangle2d tri = new Triangle2d(); CircularArc2d arc = new CircularArc2d(); double tmpArea; double area = 0.0; int last = pl.NumberOfVertices - 1; Point2d p0 = pl.GetPoint2dAt(0); double bulge = pl.GetBulgeAt(0); if (bulge != 0.0) { arc = pl.GetArcSegment2dAt(0); area = arc.AlgebricArea(); cen = arc.Centroid() * area; } for (int i = 1; i < last; i++) { tri.Set(p0, pl.GetPoint2dAt(i), pl.GetPoint2dAt(i + 1)); tmpArea = tri.AlgebricArea; cen += (tri.Centroid * tmpArea).GetAsVector(); area += tmpArea; bulge = pl.GetBulgeAt(i); if (bulge != 0.0) { arc = pl.GetArcSegment2dAt(i); tmpArea = arc.AlgebricArea(); area += tmpArea; cen += (arc.Centroid() * tmpArea).GetAsVector(); } } bulge = pl.GetBulgeAt(last); if ((bulge != 0.0) && (pl.Closed == true)) { arc = pl.GetArcSegment2dAt(last); tmpArea = arc.AlgebricArea(); area += tmpArea; cen += (arc.Centroid() * tmpArea).GetAsVector(); } return(cen.DivideBy(area)); }
/// <summary> /// Checks if the distance between every respective Point2d in both Triangle2d is less than or equal to the Tolerance.EqualPoint value of the specified tolerance. /// </summary> /// <param name="t2d">The triangle2d to compare.</param> /// <param name="tol">The tolerance used in points comparisons.</param> /// <returns>true if the condition is met; otherwise, false.</returns> public bool IsEqualTo(Triangle2d t2d, Tolerance tol) { return(t2d[0].IsEqualTo(_pt0, tol) && t2d[1].IsEqualTo(_pt1, tol) && t2d[2].IsEqualTo(_pt2, tol)); }
/// <summary> /// Checks if the distance between every respective Point2d in both Triangle2d is less than or equal to the Tolerance.Global.EqualPoint value. /// </summary> /// <param name="t2d">The triangle2d to compare.</param> /// <returns>true if the condition is met; otherwise, false.</returns> public bool IsEqualTo(Triangle2d t2d) { return(this.IsEqualTo(t2d, Tolerance.Global)); }