Question

J'ai une ligne que je dessine dans une fenêtre et je laisse l'utilisateur la faire glisser. Donc, ma ligne est définie par deux points: (x1, y1) et (x2, y2). Mais maintenant, j'aimerais dessiner des "majuscules". à la fin de ma ligne, c’est-à-dire de courtes lignes perpendiculaires à chacun de mes points extrêmes. Les majuscules doivent avoir une longueur de N pixels.

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

Comment calculer un point (x3, y3) alors qu’il doit se trouver à 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)?

Était-ce utile?

La solution

Vous devez calculer un vecteur unitaire perpendiculaire au segment de ligne. Évitez de calculer la pente car cela pourrait entraîner une division par zéro des 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

Autres conseils

Vous venez d'évaluer le verseur orthogonal et de le 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

Comme les vecteurs de 2 à 1 et de 1 à 3 sont perpendiculaires, leur produit scalaire 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 une quadrature et une discordance, vous perdez donc le signe associé à vos équations.

Pour déterminer le signe, considérez:

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

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

2-> 1 point 1-> 3 est égal à 0

équation b: produit scalaire = 0

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

rapport n / b x13 et y13:

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

x13 = -phi*y13

équation a: résolue pour y13 avec un rapport

  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ésolue pour x13 avec un 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 le résolvais au travail et pensais qu'expliquer cela de manière approfondie me permettrait de consolider mes connaissances.

Si vous souhaitez éviter un sqrt, procédez comme suit:

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top