주어진 수직 거리에서 선에서 지점을 어떻게 찾습니까?
-
02-07-2019 - |
문제
창에 그리는 줄이 있고 사용자가 드래그하도록했습니다. 따라서 내 선은 (x1, y1)과 (x2, y2)의 두 가지 점으로 정의됩니다. 그러나 이제 나는 라인 끝에 "캡", 즉 각 엔드 포인트 각각에 짧은 수직선을 그리고 싶습니다. 캡의 길이는 n 픽셀이어야합니다.
따라서 엔드 포인트 (x1, y1)에 "캡"라인을 그려 보려면 수직선을 형성하는 두 가지 점과 각 지점이 지점에서 N/2 픽셀을 찾는 곳 (x1, y1)을 찾아야합니다.
따라서 알려진 선의 엔드 포인트 (x1, y1)에서 수직 거리 N/2에 있어야하는 지점 (x3, y3), 즉 (x1, y1) 및 (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의 벡터는 수직이므로, DOT 제품은 0이기 때문이다.
이렇게하면 1 ~ 3 (x13)의 x, 1에서 3까지의 y (y13)가 있습니다.
피타고라스 정리를 사용하여 알려지지 않은 사람들에 대한 다른 방정식을 얻으십시오.
대체에 의해 알려지지 않은 각각을 해결하십시오 ...
이를 위해서는 제곱과 ququering이 필요하므로 방정식과 관련된 표시를 잃습니다.
부호를 결정하려면 다음을 고려하십시오.
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 dot 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)