
什么算法,我可以用来获得多边形的中心(红点)
案例1:我尝试使用maxX,maxY,minX,minY,我得到了错误的点(黑点)
案例2:我试图得到第二个最大值min坐标X和Y,但是我遇到的问题是多边形有点小于5的
情况3:我添加if point count < 5 then use case 1 else use case 2但是我得到一些多边形的一些错误
你能告诉我正确的算法吗?
注意 :

解释第四张照片
//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;
}
Run Code Online (Sandbox Code Playgroud)
这到底有多远
小智 3
您要寻找的不是多边形的几何中心(或质心),而是位于多边形内部的多边形对称轴部分的中心。让我编辑您的示例之一来演示:
你明白我的意思吗?
我选择这个例子是因为它展示了你思维中的另一个缺陷;这是两个多边形,每个多边形都会产生一个符合您正在寻找的条件的点。在您的示例中,您只是任意选择其中之一作为您想要的点。(我已经看到了您编辑的第四个示例;它仍然有两个内部,并且不会改变我的观点。)
无论如何,你要寻找的实际上是解决两个问题:第一,如何找到多边形的对称轴;第二,如何找到多边形的对称轴。其次,在该对称轴上找到一条线段,该线段也位于多边形的内部。之后,找到该段的中心就很简单了。
我无法发布更多链接,但是卡内基梅隆大学的 P. Highnam 发表了一篇题为“寻找平面点集对称性的最佳算法”的论文,它可以帮助解决第一个问题,它有点复杂,所以我不会'这里就不解释了。第二个问题归结为测试每个线段,看看它是否包含与沿穿过图形质心的对称轴的线的交点。假设你的多边形只有一个内部(阅读:不像你的第四个例子),你应该得到两个点。对它们进行平均,你就得到了你的中心。
| 归档时间: |
|
| 查看次数: |
2171 次 |
| 最近记录: |