C# 求多边形区域的质心
我有以下几点:C# 求多边形区域的质心,c#,geometry,C#,Geometry,我有以下几点: {X = 3.142888 Y = 101.633827} {X = 3.142325 Y = 101.633827} {X = 3.142023 Y = 101.633759} {X = 3.141899 Y = 101.633652} {X = 3.141045 Y = 101.633659} {X = 3.141433 Y = 101.634193} {X = 3.141291 Y = 101.6343} {X = 3.141381 Y = 101.634415} {X =
{X = 3.142888 Y = 101.633827}
{X = 3.142325 Y = 101.633827}
{X = 3.142023 Y = 101.633759}
{X = 3.141899 Y = 101.633652}
{X = 3.141045 Y = 101.633659}
{X = 3.141433 Y = 101.634193}
{X = 3.141291 Y = 101.6343}
{X = 3.141381 Y = 101.634415}
{X = 3.141194 Y = 101.634895}
{X = 3.141618 Y = 101.6349}
{X = 3.142697 Y = 101.634239}
我试着用这个方法
这里有什么我错过的吗
谢谢是吗?x=3.142,y=101.634你能再检查一下你的多边形是否不自交吗?根据这个公式,这是一个要求。问题可能是C#
float
没有很高的精度。您的X坐标仅与第四位不同,Y坐标仅与第六位不同。float
的精度只有~6-9位。这就像你从很远的地方看问题一样,你的点在(3.14101.63)附近,但它们之间的差异与(0,0)之间的距离相比非常小。如果您仅通过在坐标中保留有趣的小数位置来“放大”问题,即在调用函数之前,从每个X坐标减去3.14,从每个Y坐标减去101.63,会发生什么情况?
public PointF FindCentroid()
{
// Add the first point at the end of the array.
int num_points = Points.Length;
PointF[] pts = new PointF[num_points + 1];
Points.CopyTo(pts, 0);
pts[num_points] = Points[0];
// Find the centroid.
float X = 0;
float Y = 0;
float second_factor;
for (int i = 0; i < num_points; i++)
{
second_factor =
pts[i].X * pts[i + 1].Y -
pts[i + 1].X * pts[i].Y;
X += (pts[i].X + pts[i + 1].X) * second_factor;
Y += (pts[i].Y + pts[i + 1].Y) * second_factor;
}
// Divide by 6 times the polygon's area.
float polygon_area = PolygonArea();
X /= (6 * polygon_area);
Y /= (6 * polygon_area);
// If the values are negative, the polygon is
// oriented counterclockwise so reverse the signs.
if (X < 0)
{
X = -X;
Y = -Y;
}
return new PointF(X, Y);
}
{X = 3.11197066 Y = 100.614342}