52

我在窗口中画了一条线,让用户拖动它。所以,我的线由两点定义:(x1,y1) 和 (x2,y2)。但现在我想在我的线的末端画“帽子”,即在我的每个端点处画短垂直线。大写字母的长度应为 N 个像素。

因此,要在端点 (x1,y1) 处绘制我的“帽”线,我需要找到两个点,它们形成一条垂直线,并且每个点距点 (x1,y1) 的距离为 N/2 像素。

那么如何计算一个点 (x3,y3),因为它需要与已知线的终点 (x1,y1) 相距 N/2 的垂直距离,即由 (x1,y1) 定义的线和(x2,y2)?

4

4 回答 4

91

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

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
于 2008-09-25T15:22:17.083 回答
7

您只需评估正交倒数并乘以 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
于 2008-09-25T15:25:03.597 回答
4

由于 2 到 1 和 1 到 3 的向量是垂直的,所以它们的点积为 0。

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

使用勾股定理来获得这些未知数的另一个方程。

通过替换解决每个未知数...

这需要平方和不平方,因此您会丢失与方程式相关的符号。

要确定符号,请考虑:

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

已知:距离 |1->3| : N/2

方程a:勾股定理

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

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

向量 2->1 和 1->3 是垂直的

2->1 点 1->3 为 0

等式 b:点积 = 0

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

黑白 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

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

于 2011-03-26T01:25:22.267 回答
1

如果要避免 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)
于 2008-09-25T15:39:52.110 回答