获取中心多边形 C#

11

多边形示例问题

请问我可以用什么算法来获取多边形的中心点(红点)?
情况1:我尝试使用最大X、最大Y、最小X和最小Y,但是我得到了错误的点(黑点)。
情况2:我尝试获取第二大和第二小的X和Y坐标,但是对于少于5个点的多边形我遇到了问题。
情况3:我添加了 if point count < 5 then use case 1 else use case 2 但是对于一些多边形我仍然出现了错误。

你能告诉我正确的算法吗?

注意: 图4说明

第四个图片的解释:

//ma mean max, mi mean min, X1 mean first, X2 mean second
maX1 = maX2 = maY1 = maY2 = 0;
miX1 = miX2 = miY1 = miY2 = 2000;
//aCoor is array of coordinate, format = {x1,y1,x2,y2,x3,y3,x4,y4,...}
for(int i=0; i<aCoor.count(); i+=2)
{
     //point is list of point
     point.Add(aCoor[i],aCoor[i + 1]);
     //this to get second max X
     if(maX2 < aCoor[i])
     {
         maX2 = aCoor[i];
     //this to get first max x
     if(maX1 < maX2) {maX1 += maX2; maX2 = maX1 - maX2; maX1 -= maX2;}
     }

     //this to get second min X
     if(miX2 > aCoor[i])
     {
         miX2 = aCoor[i];
     //this to get first min x
     if(miX1 > miX2) {miX1 += miX2; miX2 = miX1 - miX2; miX1 -= miX2;}
     }

     //this to get second max Y
     if(maY2 < aCoor[i + 1])
     {
         maY2 = aCoor[i + 1];
     //this to get first max x
     if(maY1 < maY2) {maY1 += maY2; maY2 = maY1 - maY2; maY1 -= maY2;}
     }

     //this to get second min Y
     if(miY2 > aCoor[i + 1])
     {
         miY2 = aCoor[i + 1];
     //this to get first min x
     if(miY1 > miY2) {miY1 += miY2; miY2 = miY1 - miY2; miY1 -= miY2;}
     }
}

if(point.Count < 5)
{
    Xcenter = (maX1 + miX1) / 2;
    Ycenter = (maY1 + miY1) / 2;
}
else
{
    Xcenter = (maX2 + miX2) / 2;
    Ycenter = (maY2 + miY2) / 2;
}

这就是我所做到的程度。


1
第四个不是一个多边形,它们是两个。 - Shaharyar
1个回答

3
你要找的不是多边形的几何中心(或质心),而是位于多边形内部的对称轴的中心。让我编辑一个你的例子来演示:

编辑后的例子

你明白我的意思吗?
我选择了这个例子,因为它展示了你思考中的另一个缺陷;这是两个多边形,每个多边形都产生一个符合你寻找的资格的点。在你的例子中,你只是随意选择其中一个作为你想要的点。(我看到了你编辑过的第四个例子;它仍然有两个内部,并没有改变我的观点。)
无论如何,你要找的实际上是两个问题的解决方案:首先,如何找到多边形的对称轴;其次,在该对称轴上找到一条线段,该线段也位于多边形的内部。之后,找到该线段的中心就很容易了。
我无法再发布更多链接,但是卡内基梅隆大学的P. Highnam发表了一篇题为“寻找平面点集对称性的最优算法”的论文,可以帮助解决第一个问题。由于有些复杂,我在这里不会做出解释。第二个问题只需要测试每条线段,看它是否包含通过图形重心运行的对称轴上的一条直线相交的点。假设您的多边形只有一个内部(即不像第四个示例),您应该得到两个点。将它们平均并获得中心。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接