Comment trouver un point à une distance perpendiculaire donnée d'une ligne?

j'ai une ligne que je dessine dans une fenêtre et je laisse l'utilisateur la traîner. Donc, ma ligne est définie par deux points (x1,y1) et (x2,y2). Mais maintenant, je voudrais attirer des "plafonds" à la fin de ma ligne, qui est, de courtes lignes perpendiculaires à chacun de mes points de fin. Les capuchons doivent avoir une longueur de n pixels.

ainsi, pour dessiner ma ligne de "cap" au point final (x1, y1), je dois trouver deux points qui forment une ligne perpendiculaire et où chacun de ses points est à N / 2 pixels du point (x1,y1).

alors comment calculer un point (x3, y3) puisqu'il doit être à une distance perpendiculaire N/2 du point final (x1,y1) d'une ligne connue, c'est-à-dire la ligne définie par (x1,y1) et (x2,y2)?

40
demandé sur David Nehme 2008-09-25 19:12:19

4 réponses

vous devez calculer un vecteur unitaire qui est perpendiculaire au segment de ligne. Évitez de calculer la pente parce que cela peut conduire à diviser par zéro erreurs.

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
78
répondu David Nehme 2008-09-25 15:28:41

vous venez d'évaluer le verseur orthogonal et multiplier par 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
5
répondu Giacomo Degli Esposti 2008-09-25 15:31:28

puisque les vecteurs de 2 à 1 et de 1 à 3 sont perpendiculaires, leur produit de point est 0.

Cela vous laisse avec deux inconnues: x de 1 à 3 (x13), et y de 1 à 3 (y13)

utilisez le théorème de Pythagore pour obtenir une autre équation pour ces inconnues.

résoudre pour chaque inconnu par substitution...

cela nécessite la quadrature et l'unsquaring, de sorte que vous perdez le signe associé à vos équations.

Pour déterminer le signe, considérer:

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

connu: point 1: x1 , y1

connu: point 2: x2, y2

x21 = x1 - x2
y21 = y1 - y2

connu: distance / 1 - >3|: N / 2

équation a: théorème de Pythagore

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

Connu: angle 2-1-3 : angle droit

vecteurs 2->1 et 1->3 sont perpendiculaires

2->1 point 1->3 est 0

équation b: produit dot = 0

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

rapport b / w x13 et y13:

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

x13 = -phi*y13

une équation: résolu pour y13 avec ratio

  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

équation a: résolu pour x13 avec ratio

  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

condenser

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

normalement, Je ne le ferais pas, mais je l'ai résolu au travail et j'ai pensé que l'expliquer en détail m'aiderait à solidifier mes connaissances.

3
répondu user677616 2011-03-26 01:31:32

Si vous voulez éviter un sqrt, procédez de la manière suivante:

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)
1
répondu Skizz 2012-07-03 14:07:14