使用 Python 查找线以外的点
Find the points beyond a line using Python
参考这里提出的问题 ,我写了一个 python 函数 "find_normal" 其中 returns 法向量的斜率和 y 轴截距给定角度的给定点。
现在我有一个点列表,我想验证这些点是否在给定角度的方向上超出法向量。例如
- Angle = 180:如果点位于线的左侧则为真,否则为假
- Angle = 0: 如果点在直线右侧则为真,否则为假
- 0 < 角度 < 180:如果点在直线下方则为真,否则为假
- 180 < 角度 < 360:如果点在直线上方则为真,否则为假
为此,我编写了另一个函数 find_points_ahead,它使用 find_normal 的结果来突出显示超出法向量的所有点。如下图所示。
但是在某些角度,一些不符合标准的点也被高亮显示了。例如,箭头指向下方,只有红线以下的点应该突出显示。相反,线上方的一些点也被突出显示。有人可以帮我吗?
def find_normal(img,point,angle):
x1=point[0]
y1=point[1]
angle_rad=np.radians(angle)
c=-1*np.sin(angle_rad)
s=np.cos(angle_rad)
start_x=int(x1 - c * 640)
start_y=int(y1 - s * 640)
end_x=int(x1 + c * 640)
end_y=int(y1 + s * 640)
m=int((end_y-start_y)/(end_x-start_x))
y_intercept=end_y-(m*end_x)
cv2.line(img, (start_x,start_y), (end_x,end_y), [0, 0, 255], 3, cv2.LINE_AA)
return m,y_intercept
def find_points_ahead(img,base_point,angle,points):
m,c=find_normal(img,base_point,angle)
for pt in points:
pt_x=pt[0]
pt_y=pt[1]
result=m*pt_x-pt_y+c
if angle>0 and angle<180 and result<0:
cv2.circle(img,(pt_x,pt_y),3,[0,0,255],3,cv2.LINE_AA)
elif angle>180 and angle<360 and result>0:
cv2.circle(img,(pt_x,pt_y),3,[0,0,255],3,cv2.LINE_AA)
如果 c 和 s 是角度的余弦和正弦,函数必须 return 对于点 (x, y) 为真当且仅当 c*(x-x1) + s*(y-y1) > = 0 其中 (x1,y1) 是红线上的任意点。
参考这里提出的问题
现在我有一个点列表,我想验证这些点是否在给定角度的方向上超出法向量。例如
- Angle = 180:如果点位于线的左侧则为真,否则为假
- Angle = 0: 如果点在直线右侧则为真,否则为假
- 0 < 角度 < 180:如果点在直线下方则为真,否则为假
- 180 < 角度 < 360:如果点在直线上方则为真,否则为假
为此,我编写了另一个函数 find_points_ahead,它使用 find_normal 的结果来突出显示超出法向量的所有点。如下图所示。
但是在某些角度,一些不符合标准的点也被高亮显示了。例如,箭头指向下方,只有红线以下的点应该突出显示。相反,线上方的一些点也被突出显示。有人可以帮我吗?
def find_normal(img,point,angle):
x1=point[0]
y1=point[1]
angle_rad=np.radians(angle)
c=-1*np.sin(angle_rad)
s=np.cos(angle_rad)
start_x=int(x1 - c * 640)
start_y=int(y1 - s * 640)
end_x=int(x1 + c * 640)
end_y=int(y1 + s * 640)
m=int((end_y-start_y)/(end_x-start_x))
y_intercept=end_y-(m*end_x)
cv2.line(img, (start_x,start_y), (end_x,end_y), [0, 0, 255], 3, cv2.LINE_AA)
return m,y_intercept
def find_points_ahead(img,base_point,angle,points):
m,c=find_normal(img,base_point,angle)
for pt in points:
pt_x=pt[0]
pt_y=pt[1]
result=m*pt_x-pt_y+c
if angle>0 and angle<180 and result<0:
cv2.circle(img,(pt_x,pt_y),3,[0,0,255],3,cv2.LINE_AA)
elif angle>180 and angle<360 and result>0:
cv2.circle(img,(pt_x,pt_y),3,[0,0,255],3,cv2.LINE_AA)
如果 c 和 s 是角度的余弦和正弦,函数必须 return 对于点 (x, y) 为真当且仅当 c*(x-x1) + s*(y-y1) > = 0 其中 (x1,y1) 是红线上的任意点。