【问题标题】:Determine if a 2D point is within a quadrilateral确定二维点是否在四边形内
【发布时间】:2013-03-19 03:04:27
【问题描述】:

我正在开发一个 JS 程序,我需要确定点是否在坐标系的四个角内。

有人能指出答案的方向吗?

我正在研究我认为所谓的凸四边形。也就是说,四个完全随机选择的角位置,所有角度都小于 180°。

谢谢。

【问题讨论】:

  • 我尝试了这里使用的 inpolygon 方法link,但它不起作用。它给了我“无法调用未定义的方法'inpolygon'”。 if (Math.inpolygon(5,6,[1,22,13,1],[1,1,21,31])){ return "yep"; }
  • 为什么不能只比较坐标?你能更详细地描述这个问题吗?什么是积分?角落?
  • 我有大量随机生成的四边形。然后我需要检查一些(也是随机生成的)点是否“可用”或已被四边形占据。

标签: javascript algorithm geometry


【解决方案1】:

有两种相对简单的方法。第一种方法是从该点向“无穷远”(实际上是多边形外的任何点)绘制一条射线,并计算该射线与多边形的多少边相交。当且仅当计数为奇数时,该点才在多边形内。

第二种方法是按顺序遍历多边形,并针对每对顶点 vi 和 vi+1(必要时环绕到第一个顶点) ),计算量 (x - xi) * (yi+1 - yi) - (xi+ 1 - xi) * (y - yi)。如果这些量都具有相同的符号,则该点位于多边形内部。 (这些量是向量 (vi+1 - vi) 和 (p - vi) 的叉积的 Z 分量). 它们都具有相同符号的条件与 p 在每条边的同一侧(左侧或右侧)的条件相同。)

两种方法都需要处理点正好在边或顶点上的情况。您首先需要决定是否要计算这些点是否在多边形内。然后你需要相应地调整测试。请注意,无论哪种方式,轻微的数字舍入误差都会给出错误的答案。这只是你必须忍受的东西。

既然你有一个凸四边形,还有另一种方法。选择任意三个顶点并计算该点的barycentric coordinates 和第四个顶点相对于三个选定顶点形成的三角形。如果该点的重心坐标均为正且均小于第四个顶点的重心坐标,则该点在四边形内。

附:刚刚找到了一个不错的页面here,其中列出了很多策略。其中一些非常有趣。

【讨论】:

  • 我不太明白如何在不涉及大量(不必要的)计算的情况下像第一种方法那样绘制射线,但我认为我会让它与第二个。谢谢!
  • @Henrik - 只需在 X 轴上选择一个比四个顶点的最大 X 坐标更远的点。然后射线可以从您的测试点到达 X 轴上的点。 (当然,您也可以很好地使用 Y 轴。)请记住,您需要测试线 segments 的交点,而不是线。
  • @Henrik - 如果您使用第二种方法,请注意我在公式中打错了字。现在已经修复了。 (我在几个地方使用了 0 而不是 i 作为下标。)
  • 您的第二种方法是计算该点是否位于由四边形的边形成的四个半空间的交点中。这是一个有点复杂的公式:)
  • @AndrewMao - 不。我是一名程序员。对于程序员来说,你会写出代码,而不是解释事情。 :)
【解决方案2】:

你需要使用缠绕法,或者光线追踪法。

通过缠绕,您可以确定任何点是否在任何用线段构建的形状内。

基本上,您将每个线段与该点相乘,然后将所有结果相加。这就是我在给定一组星座线的情况下确定一颗恒星是否在星座中的方法。我可以看到还有其他方法..

http://en.wikipedia.org/wiki/Point_in_polygon

在一些地方必须有一些代码。

【讨论】:

    【解决方案3】:

    查看一个点是否在三角形内要容易得多。

    任何四边形都可以分成两个三角形。

    如果点在构成四边形的两个三角形中的任何一个中,则该点在四边形内。

    【讨论】:

      猜你喜欢
      • 2010-09-18
      • 2019-04-21
      • 1970-01-01
      • 2012-02-02
      • 1970-01-01
      相关资源
      最近更新 更多