我想获得polyline2d的质心。我有一个来自TraceBoundary的折线,如下:
DBObjectCollection objs = Application.DocumentManager.MdiActiveDocument.Editor.TraceBoundary(Point, false);
Polyline polyline = (Polyline)objs[0];
Point2d centroid = ***The missing part i need any way to get center of gravity of the above polyline as point2d***
我之前用autolisp做过这个:
(setq arob (entlast))
(setq enpol (vlax-ename->vla-object arob))
(setq cgpoint (vlax-get-property enpol 'Centroid))
我有一个数学解决方案,但当折线带有一些曲线时它无效。
我不会使用这个功能:
public static Point2d GetPolyLineCentroid(Polyline polyline)
{
double area = polyline.Area;
double cx = 0.0;
double cy = 0.0;
double X0 = 0.0;
double Y0 = 0.0;
double X1 = 0.0;
double Y1 = 0.0;
for (int i = 0; i < polyline.NumberOfVertices - 1; i++)
{
X0 = polyline.GetPoint2dAt(i).X;
Y0 = polyline.GetPoint2dAt(i).Y;
X1 = polyline.GetPoint2dAt(i + 1).X;
Y1 = polyline.GetPoint2dAt(i + 1).Y;
cx += (X0 + X1) * (X0 * Y1 - X1 * Y0);
cy += (Y0 + Y1) * (X0 * Y1 - X1 * Y0);
}
// last Point
int Lv = polyline.NumberOfVertices - 1;
X0 = polyline.GetPoint2dAt(Lv).X;
Y0 = polyline.GetPoint2dAt(Lv).Y;
X1 = polyline.GetPoint2dAt(0).X;
Y1 = polyline.GetPoint2dAt(0).Y;
cx += (X0 + X1) * (X0 * Y1 - X1 * Y0);
cy += (Y0 + Y1) * (X0 * Y1 - X1 * Y0);
cx /= 6 * area;
cy /= 6 * area;
return new Point2d(cx, cy);
}
我不想使用AutoLisp。有没有办法在.NET中执行此操作?
答案 0 :(得分:2)
我找到了这个解决方案,它对我有用:
public static Point2d GetPolyLineCentroid(DBObjectCollection objs)
{
Solid3d Solid = new Solid3d();
Solid.Extrude(((Region)Region.CreateFromCurves(objs)[0]), 1, 0);
Point2d centroid = new Point2d(Solid.MassProperties.Centroid.X, Solid.MassProperties.Centroid.Y);
Solid.Dispose();
return centroid;
}
答案 1 :(得分:2)
对于AutoCAD&lt; = 2013,使用.NET(Region.CreateFromCurves
)创建一个区域,并使用COM和HandleToObject
方法获取对它的引用。在区域ActiveX对象上,有一个Centroid
属性。
对于AutoCAD&gt; 2013年,AreaProperties
类上有Region
方法,该方法返回RegionAreaProperties
个Centroid
属性的结构。