c# - 获取中心多边形 C#

标签 c# polygon point

<分区>

example problem polygon

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

你能告诉我适合我的算法吗??

注意: pic 4th

第四张图片的解释

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

这是我做的多远

最佳答案

您要查找的不是多边形的几何中心(或 centroid ),而是位于多边形内部的多边形对称轴部分的中心。让我编辑您的示例之一来演示:

Edited example

你明白我的意思吗?

我选择这个例子是因为它展示了您思维中的另一个缺陷;这是两个多边形,每个多边形都会产生一个符合您要查找的条件的点。在您的示例中,您只是任意选择其中一个作为您想要的点。 (我看过你编辑的第四个例子;它仍然有两个内部,并没有改变我的观点。)

不管怎样,你要找的其实是两个问题的解决方案:第一,如何找到多边形的对称轴;其次,在该对称轴上找到一条线段,该线段也位于多边形的内部。在那之后,找到该段的中心是微不足道的。

我无法再发布任何链接,但是卡内基梅隆大学的 P. Hignam 发表了一篇题为“寻找平面点集对称性的最佳算法”的论文,它可以帮助解决第一个问题,它有点复杂,所以我不会在这里解释。第二个问题归结为测试每条线段以查看它是否包含与沿对称轴穿过图形质心的线的交点。假设你的多边形只有一个内部(阅读:不像你的第四个例子),你应该得到两分。平均它们,你有你的中心。

关于c# - 获取中心多边形 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20716517/

相关文章:

java - sun.java2d.loops.ProcessPath$点

java - Android-Java Point(android.graphics.point)中的Point不能应用于(Double, Double)

c# - 启动多个 gui (WinForms) 线程以便它们可以与 C# 中的一个主 gui 分开工作?

c# - View 必须派生自 WebViewPage

algorithm - 2D 细节层次 (LOD) 算法

algorithm - 如何对 2D 多边形进行子采样?

c# - 无法让 ASP.NET Core Web API 与 IIS 一起工作

c# - 是否可以在单个线程上交错执行多个委托(delegate)?

c# - 使用缠绕数点在多边形中

graphics - 在 Julia 中使用 Gadfly 时设置点大小