Como você encontrar um ponto em uma determinada distância perpendicular de uma linha?
-
02-07-2019 - |
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)?
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)