Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 求多边形区域的质心_C#_Geometry - Fatal编程技术网

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}