Comment calculer le vecteur normal d'un segment de ligne?


177

Supposons que j'ai un segment de ligne allant de (x1, y1) à (x2, y2). Comment calculer le vecteur normal perpendiculaire à la ligne?

Je peux trouver beaucoup de trucs sur le fait de faire ça pour les avions en 3D, mais pas de trucs 2D.

Allez-y doucement sur les maths (les liens vers des exemples travaillés, des diagrammes ou des algorithmes sont les bienvenus), je suis plus programmeur que mathématicien;)


2
Et si vous voulez en savoir plus sur les «mathématiques» derrière tout cela, vous pouvez consulter ma réponse sur stackoverflow.com/a/7470098/189767 . C'est fondamentalement la même chose, mais plus élaborée.
Andreas

2
Cette question concerne les mathématiques, pas la programmation.
Charlie

1
Je vote pour clore cette question comme hors sujet car il s'agit de mathématiques, pas de programmation.
Pang

Réponses:


237

si nous définissons dx = x2-x1 et dy = y2-y1, alors les normales sont (-dy, dx) et (dy, -dx).

Notez qu'aucune division n'est requise et que vous ne risquez donc pas de diviser par zéro.


14
C'est assez subtil et il m'a fallu un certain temps pour réaliser normal.x = -dy et normal.y = dx. Je les ai eues l'inverse parce que cela ressemblait à une faute de frappe attribuant la partie x à la valeur y ...
Piku

@OrenTrutner Je ne comprends toujours pas cela; (x', y') = (-y, x)et (x', y') = (y, -x)semble avoir raison, mais pourquoi utiliserait-on dxet dyici. De plus, basé sur les pentes, m1 * m2 = -1pour les droites à angle droit, donc dy' = dx' * (-dx/dy)et dx' = dy' * (-dy/dx), comment se fait-il dans votre équation normal.x = x' = -dy?
legends2k

1
Pourriez-vous en savoir plus sur la manière dont le delta joue un rôle ici? Je suis sûr qu'il me manque quelque chose ici.
legends2k

7
@ legends2k: Le delta est le vecteur tangent. La normale est la direction perpendiculaire à la tangente. Inverser les valeurs x / y et en nier une devient évident si vous regardez une matrice 2D pour une rotation de 90 degrés: en.wikipedia.org/wiki/Rotation_matrix#Basic_rotations
geon

@geon: Aah! Compris, je confondais delta et pente alors qu'en géométrie affine la différence entre deux points est un vecteur, la tangette ici :)
legends2k

95

Une autre façon de penser est de calculer le vecteur unitaire pour une direction donnée, puis d'appliquer une rotation de 90 degrés dans le sens antihoraire pour obtenir le vecteur normal.

La représentation matricielle de la transformation 2D générale ressemble à ceci:

x' = x cos(t) - y sin(t)
y' = x sin(t) + y cos(t)

où (x, y) sont les composants du vecteur original et (x ', y') sont les composants transformés.

Si t = 90 degrés, alors cos (90) = 0 et sin (90) = 1. Le substituer et le multiplier donne:

x' = -y
y' = +x

Même résultat que celui donné précédemment, mais avec un peu plus d'explications quant à sa provenance.


2
Merci beaucoup, me cassait la tête sur la façon dont il était dérivé.
legends2k

1
Bien que je connaissais la formule de rotation plus tôt, la chose qui a cliqué dans ma tête, par cette réponse, était que l'angle est une constante (+/- 90), ce qui la simplifie en une simple négation et inversion de x et y.
legends2k

@duffymo le résultat a-t-il une longueur de un?
Martin Meeser

Si le vecteur est normalisé avant la transformation, il le restera après. Vous devez normaliser avant ou après la transformation rotationnelle.
duffymo

11

Cette question a été postée il y a longtemps, mais j'ai trouvé une autre façon d'y répondre. J'ai donc décidé de le partager ici.
Tout d'abord, il faut savoir que: si deux vecteurs sont perpendiculaires, leur produit scalaire est égal à zéro.
Le vecteur normal (x',y')est perpendiculaire à la ligne reliant (x1,y1)et (x2,y2). Cette ligne a une direction (x2-x1,y2-y1), ou (dx,dy).
Alors,

(x',y').(dx,dy) = 0
x'.dx + y'.dy = 0

Il y a beaucoup de paires (x ', y') qui satisfont l'équation ci-dessus. Mais la meilleure paire qui satisfait TOUJOURS est soit (dy,-dx)soit(-dy,dx)


7
m1 = (y2 - y1) / (x2 - x1)

si deux lignes perpendiculaires:

m1*m2 = -1

puis

m2 = -1 / m1 //if (m1 == 0, then your line should have an equation like x = b)

y = m2*x + b //b is offset of new perpendicular line.. 

b est quelque chose si vous voulez le passer à partir d'un point que vous avez défini

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.