如何找到距直线给定垂直距离的点?

时间:2020-03-06 14:43:33  来源:igfitidea点击:

我在窗口中画了一条线,然后让用户拖动它。因此,我的线由两个点定义:(x1,y1)和(x2,y2)。但是现在我想在行尾绘制"盖帽",即在每个端点处画一条短的垂直线。上限的长度应为N个像素。

因此,要在端点(x1,y1)处绘制"帽"线,我需要找到两个形成一条垂直线的点,并且其每个点都离该点(x1,y1)N / 2像素。

那么,如果给定点(x3,y3)与已知线(即(x1,y1)和(x2,y2)?

解决方案

我们需要计算垂直于线段的单位矢量。避免计算斜率,因为这可能导致除以零误差。

dx = x1-x2
dy = y1-y2
dist = sqrt(dx*dx + dy*dy)
dx /= dist
dy /= dist
x3 = x1 + (N/2)*dy
y3 = y1 - (N/2)*dx
x4 = x1 - (N/2)*dy
y4 = y1 + (N/2)*dx

我们只需要评估正交versor乘以N / 2

vx = x2-x1
vy = y2-y1
len = sqrt( vx*vx + vy*vy )
ux = -vy/len
uy = vx/len

x3 = x1 + N/2 * ux
Y3 = y1 + N/2 * uy

x4 = x1 - N/2 * ux
Y4 = y1 - N/2 * uy

如果要避免sqrt,请执行以下操作:

in: line_length, cap_length, rotation, position of line centre

define points:
  tl (-line_length/2, cap_length)
  tr (line_length/2, cap_length)
  bl (-line_length/2, -cap_length)
  br (line_length/2, -cap_length)

rotate the four points by 'rotation'
offset four points by 'position'

drawline (midpoint tl,bl to midpoint tr,br)
drawline (tl to bl)
drawline (tr to br)