我可以使用什么算法来获得多边形的中心(红点)
案例1:我尝试使用maxX,maxY,minX,minY,我得到了错误的点(黑点)
情况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;
}
这到底有多远
答案 0 :(得分:1)
您正在寻找的不是多边形的几何中心(或centroid),而是多边形对称轴部分的中心位于多边形内部。让我编辑一个示例来演示:
你明白我的意思吗?
我选择了这个例子,因为它表明了你思想中的另一个缺陷;这是两个多边形,每个多边形都会产生一个符合您要求的资格的点。在您的示例中,您只是随意选择其中一个作为您想要的点。 (我已经看过你编辑的第四个例子;它仍然有两个内部,并没有改变我的观点。)
在任何情况下,您所寻找的实际上是两个问题的解决方案:首先,如何找到多边形的对称轴;第二,在该对称轴上找到一条线段,该线段也位于多边形的内部。在那之后,找到该段的中心是微不足道的。
我不能发布任何更多的链接,但有一篇来自卡内基梅隆大学的P. Highnam的论文题为“寻找平面点集的对称性的最佳算法”,它可以帮助解决第一个问题,它有点涉及到我不会在这里解释。第二个问题归结为测试每个线段以查看它是否包含一个交点,该点与沿着对称轴的线穿过图形的质心。假设你的多边形只有一个内部(读:不像你的第四个例子),你应该得到两个点。平均他们,你有你的中心。