13

次のようなポリゴンがあると想像してみてください。

不規則なポリゴン

ポリゴン内のポイント(中間点またはランダムポイントの場合もあります)を見つけることができるC#アルゴリズムを探しています。

重心を見つけるために、次のアルゴリズムを使用しました。

private Point3d GetPolyLineCentroid(DBObject pObject, double pImageWidth, double pImageHeight)
        {
            Point2d[] pointArray = GetPointArrayOfRoomPolygon(pObject);

            double centroidX = 0.0;
            double centroidY = 0.0;
            double signedArea = 0.0;
            double x0 = 0.0; // Current vertex X
            double y0 = 0.0; // Current vertex Y
            double x1 = 0.0; // Next vertex X
            double y1 = 0.0; // Next vertex Y
            double a = 0.0;  // Partial signed area

            int i = 0;
            for (i = 0; i < pointArray.Length - 1; ++i)
            {
                x0 = pointArray[i].X;
                y0 = pointArray[i].Y;
                x1 = pointArray[i + 1].X;
                y1 = pointArray[i + 1].Y;
                a = x0 * y1 - x1 * y0;
                signedArea += a;
                centroidX += (x0 + x1) * a;
                centroidY += (y0 + y1) * a;
            }

            x0 = pointArray[i].X;
            y0 = pointArray[i].Y;
            x1 = pointArray[0].X;
            y1 = pointArray[0].Y;
            a = x0 * y1 - x1 * y0;
            signedArea += a;
            centroidX += (x0 + x1) * a;
            centroidY += (y0 + y1) * a;

            signedArea *= 0.5;
            centroidX /= (6.0 * signedArea);
            centroidY /= (6.0 * signedArea);

            Point3d centroid = new Point3d(centroidX, centroidY, 0);

            return centroid;
        }

これは、次のようなポリゴンでうまく機能します。

Lポリゴン

しかし、私のポリゴンがCのような形をしている場合、中心の質量がポリゴンの外側にあるため、このアルゴリズムは機能しません。

ポリゴン内に常にポイントを取得する方法を知っている人はいますか?

4

2 に答える 2

9

ポリゴンの三角形分割を使用して、ポリゴンを三角形に分割できます。

このようなアルゴリズムの1つは、このCodeProjectの記事でc#を使用して示されています。

三角形ができたら、三角形の中にある任意の点を見つけるのは簡単です。合計が1.0に三角形の頂点を掛けた重心座標は、三角形の内側に点を与えます。

中心は、重心座標[0.333333、0.333333、0.333333]を使用して導出できます。

float centerX = A.x * 0.333333 + B.x * 0.333333 + C.x * 0.3333333;
float centerY = A.y * 0.333333 + B.y * 0.333333 + C.y * 0.3333333;

またはもっと簡単に:

float centerX = (A.x + B.x + C.x) / 3f;
float centerY = (A.y + B.y + C.y) / 3f;
于 2013-01-03T12:13:20.387 に答える
0

これを使って:

private Point getCentroid(pointArray)
{
   double centroidX = 0.0;
   double centroidY = 0.0;

   for (int i = 0; i < pointArray.Length; i++)
   {
          centroidX += pointArray[i].X;
          centroidY += pointArray[i].Y;`
   }
   centroidX /= pointArray.Length;
   centroidY /= pointArray.Length;

   return(new Point(centroidX ,centroidY));
}

このコードは、ポリゴンの重心を見つけるためのものです。ポイントがポリゴンの内側にあるか外側にあるかを確認するには、このリンクを確認してくださいhttp://bbs.dartmouth.edu/~fangq/MATH/download/source/Determining%20if%20a%20point%20lies%20on%20the%20interior%20of% 20a%20polygon.htm

于 2014-09-04T11:36:56.917 に答える