【问题标题】:How to determine if a point is within a quadrilateral如何确定一个点是否在四边形内
【发布时间】:2011-05-07 15:29:37
【问题描述】:

目标

我想确定测试点是否在定义的四边形内。我可能会在 Matlab 中实现解决方案,所以我只需要伪代码。

输入

四边形的角:(x1,y1) (x2,y2) (x3,y3) (x4,y4)

测试点:(xt, yt)

输出

1 - 如果在四边形内

0 - 否则

更新

有人指出,仅识别四边形的顶点并不足以唯一识别它。您可以假设点的顺序决定了四边形的边(点1连接2,2连接3,3连接4,4连接1)

【问题讨论】:

  • 单独的点不能唯一地标识一个四边形,除非有一个额外的约束,它是凸的,或者这些点是按给定的顺序定义的。是否存在这些限制中的一个或其他(如果有,是哪个)?
  • 例如,考虑一个等边三角形,在三角形的中心有一个附加点。仅仅知道这些点并不能让您知道三角形的哪条边已经扭结到与中心点相交。
  • 谢谢,已更新问题以解决此问题。这应该唯一标识四边形。

标签: math geometry coordinates


【解决方案1】:

您可以使用此条件测试 Point。您也可以将四边形视为 2 个三角形来计算其面积。

【讨论】:

  • 这真的有效吗?它让我大吃一惊!我试图想出一个行不通的场景。这不仅适用于四边形,对吗?任何形状。这太棒了。
  • 这是一个绝妙的解决方案,但很容易看出这只适用于凸四边形。
  • 可能在 Matlab 中工作,但其他语言比较浮点数充满了舍入问题。更好地用于测试该点是否在所有egdes的同一侧。
  • 喜欢这个!它简单、优雅、优雅。
【解决方案2】:

使用inpolygon。用法为inpolygon(xt,yt,[x1 x2 x3 x4],[y1 y2 y3 y4])

【讨论】:

    【解决方案3】:

    由于它是一个简单的四边形,您可以测试每个端点的三角形点和中间的矩形点。

    编辑下面是三角形中点的一些伪代码:

    function SameSide(p1,p2, a,b)
        cp1 = CrossProduct(b-a, p1-a)
        cp2 = CrossProduct(b-a, p2-a)
        if DotProduct(cp1, cp2) >= 0 then return true
        else return false
    
    function PointInTriangle(p, a,b,c)
        if SameSide(p,a, b,c) and SameSide(p,b, a,c)
            and SameSide(p,c, a,b) then return true
        else return false
    

    或使用重心技术:

    A、B、C为三角形端点,P为待测点

    // Compute vectors        
    v0 = C - A
    v1 = B - A
    v2 = P - A
    
    // Compute dot products
    dot00 = dot(v0, v0)
    dot01 = dot(v0, v1)
    dot02 = dot(v0, v2)
    dot11 = dot(v1, v1)
    dot12 = dot(v1, v2)
    
    // Compute barycentric coordinates
    invDenom = 1 / (dot00 * dot11 - dot01 * dot01)
    u = (dot11 * dot02 - dot01 * dot12) * invDenom
    v = (dot00 * dot12 - dot01 * dot02) * invDenom
    
    // Check if point is in triangle
    return (u > 0) && (v > 0) && (u + v < 1)
    

    【讨论】:

      【解决方案4】:

      假设您给定的坐标是按 s.t. 排列的。 (x1,y1) = 最右边的坐标 (x2,y2) = 最高坐标 (x3,y3) = 最左边的坐标 (x4,y4) = 最底坐标

      您可以执行以下操作:

      1. calculate the 4 lines of the quadrilateral (we'll call these quad lines)
      2. calculate 4 lines, from the (xt, yt) to every other coordinate (we'll call these new lines)
      3. if any new line intersects any of the quad lines, then the coordinate is outside of the quadrilateral, otherwise it is inside.
      

      【讨论】:

      • 此解决方案仅适用于凸四边形。
      【解决方案5】:

      如果目标是编写自己的测试代码,则选择 any classic point in polygon test 来实现。否则按照 Jacob 的建议去做。

      【讨论】:

        【解决方案6】:

        假设A,B,C,D 是四边形的顶点,P 是点。 如果P 在四边形内,则所有点积dot(BP,BA), dot(BP,BC), dot(AP,AB), dot(AP,AD), dot(DP,DC), dot(DP,DA), dot(CP,CB)dot(CP,CD) 都是正数。 如果P 在四边形之外,则这些乘积中至少有一个为负数。

        【讨论】:

        • 我认为这适用于矩形,但并非所有四边形。如果点在对角线上方/旁边,其中一个将在非直角四边形中返回负数。
        【解决方案7】:

        我用来解决这个问题的解决方案是为它与四边形的每一边组成的 4 个三角形中的每一个获得 P 的角度(在 OP 发布的图表中)。把角加在一起。如果它们等于(或几乎等于,取决于代码的容错性)360,则该点位于四边形内部。如果总和小于 360,则该点在外部。然而,这可能只适用于凸四边形。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-05-19
          • 2021-09-22
          • 1970-01-01
          • 1970-01-01
          • 2012-02-02
          • 1970-01-01
          • 1970-01-01
          • 2010-09-18
          相关资源
          最近更新 更多