Comment trouvez-vous un point situé à une distance perpendiculaire donnée d'une ligne?
-
02-07-2019 - |
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)?
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)