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

Math 如何确定点是否在四边形内,math,geometry,coordinates,Math,Geometry,Coordinates,目标 我想确定测试点是否在定义的四边形内。我可能会在Matlab中实现这个解决方案,所以我只需要伪代码 输入 四边形的角:(x1,y1)(x2,y2)(x3,y3)(x4,y4) 测试点:(xt,yt) 输出 1-如果在四边形内 0-否则 更新 有人指出,识别四边形的顶点不足以唯一地识别它。可以假设点的顺序决定四边形的边(点1连接2,点2连接3,点3连接4,点4连接1)使用。在多边形(xt,yt,[x1 x2 x3 x4],[y1 y2 y3 y4])中使用 编辑以下是三角形中的点的一些伪代码:

目标

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

输入

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

测试点:(xt,yt)

输出

1-如果在四边形内

0-否则

更新


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

使用。在多边形(xt,yt,[x1 x2 x3 x4],[y1 y2 y3 y4])中使用

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

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)
//计算向量
v0=C-A
v1=B-A
v2=P-A
//计算点积
点00=点(v0,v0)
dot01=点(v0,v1)
dot02=点(v0,v2)
点11=点(v1,v1)
点12=点(v1,v2)
//计算重心坐标
INVDNOM=1/(dot00*dot11-dot01*dot01)
u=(dot11*dot02-dot01*dot12)*INVDNOM
v=(dot00*dot12-dot01*dot02)*INVDNOM
//检查点是否在三角形中
返回(u>0)和(v>0)和(u+v<1)

假设给定的坐标按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.

如果目标是编写自己的测试代码,那么选择实现。否则就照雅各布的建议去做。


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

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

我用来解决这个问题的解决方案是获得它与四边形每一侧所形成的4个三角形中的每一个的P角(在OP发布的图表中)。把角度加在一起。如果它们等于(或接近等于,取决于代码的误差容限)360,则该点位于四边形内。如果总和小于360,则该点位于外部。但是,这可能仅适用于凸四边形

点本身并不能唯一地标识四边形,除非有一个额外的约束,即四边形是凸的,或者点是按给定的顺序定义的。是否存在这些约束中的一个或多个(如果是,哪个)?作为一个例子,考虑等边三角形,在三角形的中心加上一个点。仅仅知道这些点并不能让你知道三角形的哪条边已经弯折到了中心点。谢谢,更新了问题来解决这个问题。这应该是四边形的唯一标识。这真的有效吗?真让我神魂颠倒!我在想一个不可行的方案。这不仅仅适用于四边形,对吧?!任何形状。这太棒了。这是一个很好的解决方案,但很容易看出,这只适用于凸四边形。可能在Matlab中工作,但其他比较浮点数的语言充满了舍入问题。最好是用来测试点是否在所有EGDE的同一侧。喜欢这个!它简单,优雅,简单优雅。这个解决方案只适用于凸四边形。我认为这对矩形是正确的,但不是所有四边形。如果点位于对角线上方/旁边,则其中一个将在具有非直角的四边形中返回负值。