문제

창에 그리는 줄이 있고 사용자가 드래그하도록했습니다. 따라서 내 선은 (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)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top