如何确定一个点是否在四边形内

时间:2011-05-07 15:29:38

标签: math geometry coordinates

目标

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

输入

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

测试点:(xt,yt)

输出

1 - 如果在四边形内

0 - 否则

更新

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

7 个答案:

答案 0 :(得分:30)

enter image description here

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

答案 1 :(得分:5)

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

答案 2 :(得分:2)

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

编辑以下是三角形点的伪代码:

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)

答案 3 :(得分:1)

假设您给定的坐标是s.t. (x1,y1)=最右边的坐标 (x2,y2)=最高坐标 (x3,y3)=最左边的坐标 (x4,y4)= botoom-most coordinate

您可以执行以下操作:

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.

答案 4 :(得分:1)

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

答案 5 :(得分:0)

假设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在四边形之外,则这些乘积中的至少一个将为负。

答案 6 :(得分:0)

我用来解决此问题的解决方案是获取其与四边形的每一边形成的四个三角形中的每个三角形的P角(在OP发布的图中)。将角度加在一起。如果它们相等(或近似相等,取决于代码的容错性)360,则该点在四边形内。如果总和小于360,则该点在外面。但是,这可能仅适用于凸四边形。