我有 3 个点和它们的坐标。他们两个之间有一条线我想找到第三个点是否在创建线的人之间并且靠近线。在图 1 中显示了我可以使用公式来查找点是否共线的情况。在图 2 中,A 和 B 之间有一条线。我想检查范围内的点,比如说 15px 并找到 C 点位于 A 和 B 之间并且靠近线并忽略 D 点,因为它很远从线。
问问题
2076 次
2 回答
4
点C到线段AB的距离是与的叉积的长度。vector(A,C)
unit_vector(A,B)
也就是说(在伪代码中),
def vec_length(x,y) = sqrt(x*x + y*y)
def unitvec(ax,ay,bx,by) = (dx/m, dy/m)
where dx = bx - ax
dy = by - ay
m = vec_length(dx,dy)
def dist_segm(cx,cy,ax,ay,ux,uy) = abs( dx*uy - dy*ux )
where dx = cx - ax
dy = cy - ay
要确定C是否“介于” A和B之间,您可以计算并查看它是否小于(但为正)。作为计算的一部分,你无论如何都要计算。dot_product
( vector(A,C), unit_vector(A,B) )
vector_length(A,B)
vector_length(A,B)
unit_vector(A,B)
这种方式是计算效率最高的。
于 2012-07-23T06:19:52.173 回答
3
将点正交投影C
到直线上AB
,找到投影点P
:距离C
直线最近的点AB
。现在,您需要做的就是使用线段的长度CP
来确定C
与线的距离。并使用P
与关系到A
和的位置B
来确定是否C
“介于”A
和之间B
。
点到直线上的正交投影是计算几何中的标准基本操作。例如,参见Wolfram World。
我会这样做:
- 线的法向量
AB
是(By - Ay, -(Bx - Ax))
将此向量添加到点
C
并获得点C'
C'x = Cx + By - Ay C'y = Cy - Bx + Ax
找到line和 line的交点。交点就是你的投影点。
AB
CC'
P
于 2012-07-23T02:29:32.847 回答