画一条给定角度的线和线上的一个点

Drawing a line given the angle and a point on the line

在我的图像中,我有一个三角形(代表一个箭头)。此箭头定义了在同一图像中进一步搜索所考虑的方向和区域。例如,如果我有一个三角形 w.r.t x 轴旋转 30 度,它的尖端位于图像中的 (250,150) 处。我想找到并画一条垂直于三角形尖端的线,如下图所示。

在上图中,我在三角形中有蓝色线的角度,法线要绘制到该角度。三角形的尖端也是已知的,这是法线上唯一已知的点。

我的 python 函数代码如下。此代码绘制一条线,穿过尖端但不一定正常到蓝线。

def draw_intercepts(img,triangle):
    tip=triangle["tip"]
    x1=tip[0]
    y1=tip[1]
    arrow_angle=triangle["arrow_angle"]
    y_intercept=int(y1+((1/np.tan(arrow_angle))*x1))
    x_intercept=int(x1+(np.tan(arrow_angle)*y1))
    cv2.line(img,(x_intercept,0),(0,y_intercept),[0,0,255],3,cv2.LINE_AA)

此代码是根据对此 post 的回答编写的: https://math.stackexchange.com/questions/2381119/how-to-find-slope-x-and-y-intercepts-given-angle-to-the-normal-vector-and-a-poi

注意: 我按照建议更新了代码:

def draw_intercepts(img,triangle):
    tip=triangle["tip"]
    x1=tip[0]
    y1=tip[1]
    arrow_angle=triangle["arrow_angle"]
    arrow_angle_rad=np.radians(arrow_angle)
    y_intercept=int(y1+((1/np.tan(arrow_angle_rad))*x1))
    x_intercept=int(x1+(np.tan(arrow_angle_rad)*y1))
    cv2.line(img, (x_intercept, 0), (0, y_intercept), [0, 0, 255], 3, cv2.LINE_AA)

这解决了问题。 现在,当 arrow_angle 位于第一或第三象限时,该线被完美地绘制出来,例如0 < arrow_angle < 90 和 180 < arrow_angle < 270 但在第二和第四象限( 90 < arrow_angle < 180 和 270 < arrow_angle < 360)线角度不是绘制为正确的角度或位置。甚至我都不知道它在某处画了线,因为它在图像中不可见。

请注意,使用的线方程 "in intercept segments" 不是通用的 - 不适用于水平线和垂直线。对于截距方法,情况 0、Pi/2、Pi、3*Pi/2 或 -Pi/2 必须单独处理。

如果你arrow_angle是蓝线:

c = -Sin(arrow_angle)
s = Cos(arrow_angle)

如果你arrow_angle是红线:

c = Cos(arrow_angle)
s = Sin(arrow_angle)

然后通过点画线

 (x1 - c * 4096, y1  - s * 4096) and (x1 + c * 4096, y1  + s * 4096)

(我使用了与屏幕尺寸相当的任意大常量)