/// <summary> /// Creates a new instance of PolylineSegmentCollection from a Polyline2d. /// </summary> /// <param name="pline">A Polyline2d instance.</param> public PolylineSegmentCollection(Polyline2d pline) { Vertex2d[] vertices = pline.GetVertices().ToArray(); int n = vertices.Length - 1; for (int i = 0; i < n; i++) { Vertex2d vertex = vertices[i]; _contents.Add(new PolylineSegment( vertex.Position.Convert2d(), vertices[i + 1].Position.Convert2d(), vertex.Bulge, vertex.StartWidth, vertex.EndWidth)); } if (pline.Closed == true) { Vertex2d vertex = vertices[n]; _contents.Add(new PolylineSegment( vertex.Position.Convert2d(), vertices[0].Position.Convert2d(), vertex.Bulge, vertex.StartWidth, vertex.EndWidth)); } }
/// <summary> /// Creates a new instance of PolylineSegmentCollection from a Polyline2d. /// </summary> /// <param name="pline">A Polyline2d instance.</param> public PolylineSegmentCollection([NotNull] Polyline2d pline) { var vertices = pline.GetVertices().ToArray(); var n = vertices.Length - 1; for (var i = 0; i < n; i++) { var vertex = vertices[i]; _contents.Add(new PolylineSegment( vertex.Position.Convert2d(), vertices[i + 1].Position.Convert2d(), vertex.Bulge, vertex.StartWidth, vertex.EndWidth)); } if (pline.Closed) { var vertex = vertices[n]; _contents.Add(new PolylineSegment( vertex.Position.Convert2d(), vertices[0].Position.Convert2d(), vertex.Bulge, vertex.StartWidth, vertex.EndWidth)); } }
/// <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) { var vertices = pl.GetVertices().ToArray(); var last = vertices.Length - 1; var vertex = vertices[0]; var p0 = vertex.Position.Convert2D(); _ = pl.Elevation; var cen = new Point2d(0.0, 0.0); var area = 0.0; var bulge = vertex.Bulge; double tmpArea; Point2d tmpPt; var tri = new Triangle2D(); var 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 (var i = 1; i < last; i++) { var p1 = vertices[i].Position.Convert2D(); var 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) { 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 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.SignedArea(); 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.SignedArea; area += tmpArea; cen += (tri.Centroid * tmpArea).GetAsVector(); bulge = vertices[i].Bulge; if (bulge != 0.0) { arc = pl.GetArcSegment2dAt(i); tmpArea = arc.SignedArea(); 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.SignedArea(); 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))); }