用于在不规则多边形中找到点的算法

Imagagine我有一个如下的多边形:

不规则多边形

我正在寻找一个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或类似的forms,则该算法不起作用,因为中心偏离质量在多边形之外。

有没有人知道如何在任何多边形内获得始终点?

您可以使用多边形三角剖分将多边形分成三角形。

在此CodeProject文章中使用c#演示了一种此类算法。

一旦有三角形,找到三角形内的任意点很容易。 任何重量为1.0的重心坐标乘以三角形的顶点都会得到三角形内的一个点。

可以使用重心坐标[0.333333,0.333333,0.333333]导出中心:

 float centerX = Ax * 0.333333 + Bx * 0.333333 + Cx * 0.3333333; float centerY = Ay * 0.333333 + By * 0.333333 + Cy * 0.3333333; 

或更简单地说:

 float centerX = (Ax + Bx + Cx) / 3f; float centerY = (Ay + By + Cy) / 3f; 

用这个:

 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)); } 

这段代码只是为了找到Polygon的质量中心。 要检查点是在多边形内部还是外部,请检查此链接http://bbs.dartmouth.edu/~fangq/MATH/download/source/Determining%20if%20a%20point%20lies%20on%20the%20interior%20of% 20A%20polygon.htm