Pergunta

Eu tenho uma linha que eu desenhar em uma janela e eu permitir que o usuário arraste-lo ao redor. Portanto, a minha linha é definida por dois pontos: (x1, y1) e (x2, y2). Mas agora eu gostaria de chamar "caps" no final da minha linha, isto é, linhas perpendiculares curtas em cada um dos meus pontos finais. As tampas devem ser N pixels de comprimento.

Assim, para chamar a minha linha de "cap" no ponto final (x1, y1), preciso encontrar dois pontos que formam uma linha perpendicular e em que cada um dos seus pontos são a N / 2 pixels de distância a partir do ponto (x1, y1).

Então, como se calcula um ponto (x3, y3) dado que necessita de estar a uma distância perpendicular N / 2 para longe do ponto final (x1, y1) de uma linha conhecida, isto é, a linha definida pela (x1, y1) e (x2, y2)?

Foi útil?

Solução

Você precisa calcular um vetor unitário que é perpendicular ao segmento de linha. Evite calcular o declive porque isso pode levar a dividir por zero erros.

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

Outras dicas

Você só avaliar o versor ortogonais e multiplique por 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

Uma vez que os vectores de 2 a 1 e 1 a 3 são perpendiculares, o produto de pontos é 0.

Isso deixa você com duas incógnitas: x 1-3 (x13), e y de 1 a 3 (Y13)

Use o Teorema de Pitágoras para obter uma outra equação para essas incógnitas.

Resolva para cada amostra desconhecida por substituição ...

Isto requer quadratura e unsquaring, então você perde o sinal associado com suas equações.

Para determinar o sinal, considerar:

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

Conhecido: Ponto 1: x1, y1

Conhecido: Ponto 2: x2, y2

x21 = x1 - x2
y21 = y1 - y2

Conhecido: distância | 1-> 3 | : N / 2

equação a: Teorema de Pitágoras

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

Conhecido: ângulo 2-1-3: ângulo direito

vectores 2-> 1 e 1-> 3 são perpendiculares

2-> 1 ponto 1-> 3? 0

equação b: dot product = 0

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

relação b / w x13 e Y13:

x21*x13 = -y21*y13
x13 = -(y21/x21)y13

x13 = -phi*y13

equação a: resolvido para Y13 com relação

  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

equação a: resolvido para x13 com relação

  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

condensar

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

Eu normalmente não faria isso, mas eu resolvi-lo no trabalho e pensou que explicá-lo completamente iria me ajudar a solidificar o meu conhecimento.

Se você quiser evitar uma sqrt, faça o seguinte:

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top