目标
我想确定一个测试点是否在一个定义好的四边形内。我的实现可能会用Matlab,所以我只需要伪代码。
输入
四边形的四个角落坐标:(x1,y1) (x2,y2) (x3,y3) (x4,y4)
测试点坐标: (xt, yt)
输出
1 - 如果在四边形内
0 - 否则
更新
有人指出,仅仅识别四边形的顶点是不足以唯一确定四边形的。你可以假设这些点的顺序决定了四边形的边(第1个点连接着第2个点,第2个点连接着第3个点,第3个点连接着第4个点,第4个点连接着第1个点)。
目标
我想确定一个测试点是否在一个定义好的四边形内。我的实现可能会用Matlab,所以我只需要伪代码。
输入
四边形的四个角落坐标:(x1,y1) (x2,y2) (x3,y3) (x4,y4)
测试点坐标: (xt, yt)
输出
1 - 如果在四边形内
0 - 否则
更新
有人指出,仅仅识别四边形的顶点是不足以唯一确定四边形的。你可以假设这些点的顺序决定了四边形的边(第1个点连接着第2个点,第2个点连接着第3个点,第3个点连接着第4个点,第4个点连接着第1个点)。
你可以使用此条件测试 Point。同时,你可以将四边形看作两个三角形来计算其面积。
由于这是一个简单的四边形,您可以对每个端点进行三角形点测试,并对中间点进行矩形点测试。
编辑 这里是一些点在三角形内的伪代码:
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)
假定给定的坐标已按以下方式排列:
(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.