ウィンドウに描画する線があり、ユーザーにそれをドラッグさせます。したがって、私の線は(x1、y1)と(x2、y2)の2つの点で定義されます。しかし、ここで、私の線の端、つまり、各端点で短い垂直線に「キャップ」を描画したいと思います。キャップの長さはNピクセルにする必要があります。
したがって、端点(x1、y1)に「キャップ」線を描画するには、垂直線を形成し、その各点が点(x1、y1)からN/2ピクセル離れている2つの点を見つける必要があります。
したがって、既知の線の終点(x1、y1)から垂直距離N/2にある必要がある場合、点(x3、y3)を計算するにはどうすればよいですか。 (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)の2つの未知数が残ります。
ピタゴラスの定理を使用して、これらの未知数の別の方程式を取得します。
未知のものをそれぞれ置換することで解く...
これには二乗と二乗解除が必要なので、方程式に関連付けられた符号を失います。
兆候を判断するには、以下を考慮してください。
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
比率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)