你如何从一条线的某个垂直距离find一个点?

我在窗口中绘制一条线,并让用户拖动它。 所以,我的线由两个点定义:(x1,y1)和(x2,y2)。 但现在我想在我的线的末端画“帽子”,就是说,在我的每一个端点上都有短垂线。 帽应该是N个像素的长度。

因此,为了在终点(x1,y1)绘制我的“帽”线,我需要find两个点形成一个垂直线,并且每个点都离开点(x1,y1)N / 2个像素。

那么,如果你需要在一个已知线的终点(x1,y1)的一个垂直距离N / 2处(即由(x1,y1)和(x2,y2)?

您需要计算垂直于线段的单位vector。 避免计算斜率,因为这可能导致除以零错误。

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 

你只是评估正交的版本并乘以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 

由于从2到1和1到3的vector是垂直的,它们的点积是0。

这给你留下了两个未知数:x从1到3(x13),y从1到3(y13)

使用毕达哥拉斯定理来获得这些未知数的另一个方程。

通过replace解决每个未知的问题…

这需要平方和不平等,所以你失去了与你的方程相关的符号。

要确定标志,请考虑:

 while x21 is negative, y13 will be positive while x21 is positive, y13 will be negative while y21 is positive, x13 will be positive while y21 is negative, x13 will be negative 

已知:第1点:x1,y1

已知:点2:x2,y2

 x21 = x1 - x2 y21 = y1 - y2 

已知:distance | 1-> 3 | :N / 2

方程a:毕达哥拉斯定理

 x13^2 + y13^2 = |1->3|^2 x13^2 + y13^2 = (N/2)^2 

已知:angular度2-1-3:直angular

vector2-> 1和1-> 3是垂直的

2-> 1点1-> 3是0

方程b:点积= 0

 x21*x13 + y21*y13 = 2->1 dot 1->3 x21*x13 + y21*y13 = 0 

比率b / w x13和y13:

 x21*x13 = -y21*y13 x13 = -(y21/x21)y13 x13 = -phi*y13 

方程a:用比率解出y13

  plug x13 into a phi^2*y13^2 + y13^2 = |1->3|^2 factor out y13 y13^2 * (phi^2 + 1) = plug in phi y13^2 * (y21^2/x21^2 + 1) = multiply both sides by x21^2 y13^2 * (y21^2 + x21^2) = |1->3|^2 * x21^2 plug in Pythagorean theorem of 2->1 y13^2 * |2->1|^2 = |1->3|^2 * x21^2 take square root of both sides y13 * |2->1| = |1->3| * x21 divide both sides by the length of 1->2 y13 = (|1->3|/|2->1|) *x21 lets call the ratio of 1->3 to 2->1 lengths psi y13 = psi * x21 check the signs when x21 is negative, y13 will be positive when x21 is positive, y13 will be negative y13 = -psi * x21 

方程a:用比率求解x13

  plug y13 into a x13^2 + x13^2/phi^2 = |1->3|^2 factor out x13 x13^2 * (1 + 1/phi^2) = plug in phi x13^2 * (1 + x21^2/y21^2) = multiply both sides by y21^2 x13^2 * (y21^2 + x21^2) = |1->3|^2 * y21^2 plug in Pythagorean theorem of 2->1 x13^2 * |2->1|^2 = |1->3|^2 * y21^2 take square root of both sides x13 * |2->1| = |1->3| * y21 divide both sides by the length of 2->1 x13 = (|1->3|/|2->1|) *y21 lets call the ratio of |1->3| to |2->1| psi x13 = psi * y21 check the signs when y21 is negative, x13 will be negative when y21 is positive, x13 will be negative x13 = psi * y21 

凝聚

 x21 = x1 - x2 y21 = y1 - y2 |2->1| = sqrt( x21^2 + y^21^2 ) |1->3| = N/2 psi = |1->3|/|2->1| y13 = -psi * x21 x13 = psi * y21 

我通常不会这样做,但我在工作中解决了这个问题,并认为彻底解释会帮助我巩固自己的知识。

如果您想避免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)