在多边形内找到一个点

时间:2016-03-27 21:21:31

标签: polygon point concave

有没有办法在多边形中找到一个点?我不想找到一个点是否在多边形中但想要找到内部点本身。我试图使用x坐标的平均值和y坐标的平均值来获得多边形的质心,但这不适用于某些多边形的情况,例如下面的,其中质心在外面。

enter image description here

6 个答案:

答案 0 :(得分:0)

可能有更有效的方法。但解决问题的一种方法是将其分解为部分:

  1. 将多边形三角化为一组三角形。这总是可行的。例如参见de Burg的“Computational Geometry”一书(第2版,第3章)。
  2. 在您的示例中,多边形可以明显地分解为两个三角形。

    1. 选择任何组件三角形的incenter。三角形的香火在三角形内部,因此在原始多边形内。
    2. incenter

答案 1 :(得分:0)

假设你有一个多边形,其中n个顶点位于V_n = (x_n,y_n),你可以这样做:

  1. 计算点A = (max(x_n),max(y_n))B = (min(x_n),min(y_n))。检查两个点是否实际是顶点,如果不是,则继续执行下一步,但如果两个点都是顶点,请改为取点C = (max(x_n),min(y_n))D = (min(x_n),max(y_n))
  2. 将线AB(或CD)与多边形相交(即与每条边相交并测试它位于该线上的每个顶点)。
  3. 对于您在上一步中获得的所有积分,计算他们与A(或C分别)的距离,通过增加A的距离来排序。
  4. 从最接近A的点开始(如果A是顶点,则为A本身),选择该点与下一个点之间的点。测试该点是否在多边形内。如果它已经完成,如果不是,请在下一个点(这是您上次迭代的第二个点)重复此步骤。
  5. 说明

    矩形ACBD是多边形的轴对齐边界框,因此多边形内的每个点也都在该矩形内。 ABCD是该矩形的对角线。

    在第1步中,我们检查点AB是否都是顶点,这很重要。如果其中一个不是,我们可以确定多边形的至少一个顶点在对角线的“上方”,并且至少有一个顶点在“下方”,因此对角线将与多边形相交。

    如果两个点都是顶点,我们可以处理一个三角形,其中对角线实际上是一个边缘或完全位于对角线一侧的凹面多边形,因此我们只需切换对角线并保证另一个对角线将与多边形相交。

    由于我们知道我们的对角线与多边形相交,我们可以遍历所有线段并从每个线段中选取一个点以查看它是否在内部,其中一个必须是。通常它将是您测试的第一个线段,但是有一些特殊情况可能导致此段位于多边形之外(同样:凹多边形,您的第一个交叉点是顶点而不是边缘),但至少有一个细分必须在里面。

    我认为这可以更有效地完成,但是如果n足够小并且您不需要为大量多边形执行此操作,那么应该没有问题。

答案 2 :(得分:0)

要查找多边形内部的任何非特定点非常简单。您需要知道多边形的缠绕顺序(顺时针或逆时针) - 这决定了哪个是内部,哪个是多边形的外部。以下是:

  1. 使用ear-clipping方法查找单个三角形("耳朵")。
  2. 找到该三角形的中点。
  3. 我可以在这里完全重现它是如何工作的,但它已经有很好的文档记录,只需使用维基百科链接并搜索关于多边形三角测量的耳剪的更多信息。

答案 3 :(得分:0)

如果没有完整的算法,您可以执行以下操作:

假设我有一个以顺时针顺序添加到点的多边形:

    p.addPoint(100, 200);
    p.addPoint(200, 100);
    p.addPoint(160, 200);
    p.addPoint(200, 300);
    for(i=0; i<p.npoints; i++) {
      int[] p0={p.xpoints[i], h-1-p.ypoints[i]}, p1={p.xpoints[(i+1)%p.npoints], h-1-p.ypoints[(i+1)%p.npoints]}, p2={p.xpoints[(i+2)%p.npoints], h-1-p.ypoints[(i+2)%p.npoints]};
      System.out.println(" angle "+angle(p0, p1, p2));
    }

这是取三个连续点并确定角度p0,p1,p2(按此顺序p1是角度的角),因为p2-p1侧以顺时针顺序转向以接触侧p0-p2):它是一个小于180度的凸角,你可以在它内部获得一些点(例如,取两边的中点,找到它们连接线的中间点等。)

如果超过180则继续。

angle()是一种查找角度的方法。

如果要将坐标转换为通常的几何系统(h是窗口的高度),则需要

h-1-p [];否则不要使用它。

总之:找到一个凸角,无论是角度逼近还是其他方法。

答案 4 :(得分:0)

这个问题来得很晚,但是有一种记录在here上的方法

  1. 确定凸顶点v;使其相邻的顶点为a和b。
  2. 对于每个顶点q分别做: 2a。如果q在avb内,则计算到v的距离(与ab正交)。 2b。如果距离是新的最小值,则保存点q。
  3. 如果内部没有点,则返回ab的中点或avb的质心。
  4. 如果内部不存在某些点,则qv是内部的:返回其中点。

我已经写了一个javascript version here

希望有帮助!

答案 5 :(得分:-1)

这是一个数学问题,而不是编码,但你应该尝试this

之类的东西

从该点开始射线,您可以检查射线与多边形相交的次数。如果它甚至是在多边形之外的点