如何识别质心点是否接触到一条线?
How to identify if the centroid point touches a line or not?
我正在使用一种基于越线检测的入侵检测算法。我已经使用等式 y = mx+c 开发了一个基本算法,但是当人靠近线时它显示出一些错误的检测。我需要一些建议来使它成为一个完美的线触摸算法。
如果你的直线有起点和终点[x1, y1]
和[x2, y2]
,那么直线方程为:
y - y1 = m * (x - x1)
,其中 m = (y2 - y1)/(x2-x1)
然后你可以检查一个点是否属于直线,代入 x
或 y
,并检查另一个是否匹配直线方程。
在 Pyhton 中:
# the two points that define the line
p1 = [1, 6]
p2 = [3, 2]
# extract x's and y's, just for an easy code reading
x1, y1 = p1
x2, y2 = p2
m = (y2-y1)/(x2-x1)
# your centroid
centroid = [2,4]
x3, y3 = centroid
# check if centroid belongs to the line
if (m * (x3-x1) + y1) == y3:
print("Centroid belongs to line")
但可能...
...计算红点和线之间的距离 (distance from a point to a line),然后检查它是否足够近(即距离小于某个值),你会得到更好的结果。
在Python中:
# points that define the line
p1 = [1, 6]
p2 = [3, 2]
x1, y1 = p1
x2, y2 = p2
centroid = [2,4]
x3, y3 = centroid
# distance from centroid to line
import math # to calculate square root
dist = abs((y2-y1)*x3 - (x2-x1)*y3 + x2*y1 - y2*x1)/math.sqrt((y2-y1)**2 + (x2-x1)**2)
if dist < some_value:
print("Near enough")
让直线从 l0
点到 l1
点。然后设质心为点p1
。设向量 l
为从 l0
到 l1
的向量,p
从 l0
到 p1
的向量。然后,您可以按照 here 所述使用点积计算从点 p1
到直线的距离。
您可能想要找到从您的点到 线段 的距离,然后根据该距离评估该点是否在线段上。这可以以类似的方式完成,但围绕它有更多的逻辑,如 here 所述。
下面给出了使用 numpy
在 python 中的实现。它可以轻松扩展以处理 N
个质心,使您能够并行跟踪不同的对象。它通过将点投影到线段上并找到从该点到质心的距离来工作。
import numpy as np
def distance_from_line_segment_points_to_point(l0, l1, p1):
l0 = np.array(l0)
l1 = np.array(l1)
p1 = np.array(p1)
l_vec = l1 - l0
p_vec = p1 - l0
if (l0 == l1).all():
return np.linalg.norm(p_vec)
l_norm = np.linalg.norm(l_vec)
l_unit = l_vec / l_norm
t = np.dot(l_unit, p_vec)
if t >= l_norm:
p_proj = l1
elif t <= 0:
p_proj = l0
else:
p_proj = l0 + t * l_unit
return np.linalg.norm(p1 - p_proj)
print(distance_from_line_segment_points_to_point([0, 0], [0, 0], [1, 1])) # sqrt(2), 1.4
print(distance_from_line_segment_points_to_point([0, 0], [1, 0], [1, 1])) # 1
print(distance_from_line_segment_points_to_point([0, 0], [1, 1], [0, 1])) # sqrt(2)/2, 0.707
我正在使用一种基于越线检测的入侵检测算法。我已经使用等式 y = mx+c 开发了一个基本算法,但是当人靠近线时它显示出一些错误的检测。我需要一些建议来使它成为一个完美的线触摸算法。
如果你的直线有起点和终点[x1, y1]
和[x2, y2]
,那么直线方程为:
y - y1 = m * (x - x1)
,其中 m = (y2 - y1)/(x2-x1)
然后你可以检查一个点是否属于直线,代入 x
或 y
,并检查另一个是否匹配直线方程。
在 Pyhton 中:
# the two points that define the line
p1 = [1, 6]
p2 = [3, 2]
# extract x's and y's, just for an easy code reading
x1, y1 = p1
x2, y2 = p2
m = (y2-y1)/(x2-x1)
# your centroid
centroid = [2,4]
x3, y3 = centroid
# check if centroid belongs to the line
if (m * (x3-x1) + y1) == y3:
print("Centroid belongs to line")
但可能...
...计算红点和线之间的距离 (distance from a point to a line),然后检查它是否足够近(即距离小于某个值),你会得到更好的结果。
在Python中:
# points that define the line
p1 = [1, 6]
p2 = [3, 2]
x1, y1 = p1
x2, y2 = p2
centroid = [2,4]
x3, y3 = centroid
# distance from centroid to line
import math # to calculate square root
dist = abs((y2-y1)*x3 - (x2-x1)*y3 + x2*y1 - y2*x1)/math.sqrt((y2-y1)**2 + (x2-x1)**2)
if dist < some_value:
print("Near enough")
让直线从 l0
点到 l1
点。然后设质心为点p1
。设向量 l
为从 l0
到 l1
的向量,p
从 l0
到 p1
的向量。然后,您可以按照 here 所述使用点积计算从点 p1
到直线的距离。
您可能想要找到从您的点到 线段 的距离,然后根据该距离评估该点是否在线段上。这可以以类似的方式完成,但围绕它有更多的逻辑,如 here 所述。
下面给出了使用 numpy
在 python 中的实现。它可以轻松扩展以处理 N
个质心,使您能够并行跟踪不同的对象。它通过将点投影到线段上并找到从该点到质心的距离来工作。
import numpy as np
def distance_from_line_segment_points_to_point(l0, l1, p1):
l0 = np.array(l0)
l1 = np.array(l1)
p1 = np.array(p1)
l_vec = l1 - l0
p_vec = p1 - l0
if (l0 == l1).all():
return np.linalg.norm(p_vec)
l_norm = np.linalg.norm(l_vec)
l_unit = l_vec / l_norm
t = np.dot(l_unit, p_vec)
if t >= l_norm:
p_proj = l1
elif t <= 0:
p_proj = l0
else:
p_proj = l0 + t * l_unit
return np.linalg.norm(p1 - p_proj)
print(distance_from_line_segment_points_to_point([0, 0], [0, 0], [1, 1])) # sqrt(2), 1.4
print(distance_from_line_segment_points_to_point([0, 0], [1, 0], [1, 1])) # 1
print(distance_from_line_segment_points_to_point([0, 0], [1, 1], [0, 1])) # sqrt(2)/2, 0.707