我在窗口中画了一条线,让用户拖动它。所以,我的线由两点定义:(x1,y1) 和 (x2,y2)。但现在我想在我的线的末端画“帽子”,即在我的每个端点处画短垂直线。大写字母的长度应为 N 个像素。
因此,要在端点 (x1,y1) 处绘制我的“帽”线,我需要找到两个点,它们形成一条垂直线,并且每个点距点 (x1,y1) 的距离为 N/2 像素。
那么如何计算一个点 (x3,y3),因为它需要与已知线的终点 (x1,y1) 相距 N/2 的垂直距离,即由 (x1,y1) 定义的线和(x2,y2)?
我在窗口中画了一条线,让用户拖动它。所以,我的线由两点定义:(x1,y1) 和 (x2,y2)。但现在我想在我的线的末端画“帽子”,即在我的每个端点处画短垂直线。大写字母的长度应为 N 个像素。
因此,要在端点 (x1,y1) 处绘制我的“帽”线,我需要找到两个点,它们形成一条垂直线,并且每个点距点 (x1,y1) 的距离为 N/2 像素。
那么如何计算一个点 (x3,y3),因为它需要与已知线的终点 (x1,y1) 相距 N/2 的垂直距离,即由 (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
您只需评估正交倒数并乘以 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 的向量是垂直的,所以它们的点积为 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
我通常不会这样做,但我在工作中解决了它,并认为彻底解释它会帮助我巩固我的知识。
如果要避免 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)