Trouver un vecteur unitaire exactement à mi-chemin entre deux segments de ligne connectés

8

Cela semble être une question rapide et facile, mais je n'ai pas été en mesure de trouver exactement ce que je recherche donc:

Comment calculer un vecteur de longueur unitaire pointant le long de la ligne qui est exactement 50% de l'angle de deux segments de ligne connectés?

Une image parle des milliers de mots (qui sont aussi meilleurs que mon explication!) Exemple d'un vecteur unitaire coupant deux segments de ligne connectés
Donc, fondamentalement, je veux calculer le vecteur d'unité bleu compte tenu des deux segments de ligne rouge (qui sont en fait 3 points et sont donc garantis pour être connectés)

Les segments rouges sont de longueur arbitraire, et le résultat n'a pas à être une unité, ce serait simplement plus facile pour moi.
Il serait également pratique d'avoir un moyen de forcer le vecteur résultant à pointer dans une certaine direction (par rapport aux segments d'entrée), ce n'est pas essentiel car je pense que je peux travailler celui-ci - car les segments de ligne d'entrée forment finalement un n-gon.

Tous les exemples seraient idéaux en C ++, mais d'autres langages sont les bienvenus.

Merci beaucoup pour tous les pointeurs.

Adam Naylor
la source

Réponses:

13

Créez et normalisez deux vecteurs à partir de votre segment rouge, à partir de leur sommet commun, puis ajoutez les résultats (composant par composant). Vous pouvez ensuite normaliser la sortie si vous souhaitez obtenir un vecteur unitaire.

Le problème est que vous vous retrouverez toujours dans le deuxième cas, car l'angle entre 2 vecteurs sera toujours inférieur à 180 °. Mais bien sûr, vous pouvez simplement créer le vecteur opposé et voir celui qui correspond le mieux à votre objectif.

Il existe également un cas particulier lorsque les deux vecteurs sont alignés et que la moyenne sera 0 (mais vous pouvez facilement le détecter).

XGouchet
la source
Excellent je pense que c'est exactement ce que je recherche! Je savais que c'était facile :) Je vais laisser ouvert juste pour voir quelles autres réponses j'obtiens ... Merci
Adam Naylor
J'étais sur le point d'écrire une méthode plus complexe impliquant le produit scalaire, même si j'ai déjà utilisé cette méthode simple, doh!
CiscoIPPhone
Que voulez-vous dire par "Le problème est que vous finirez toujours par le deuxième cas"?
CiscoIPPhone
@CiscoIPPhone Je crois qu'il se réfère à mon diagramme. Une solution de produit scalaire est plus que bienvenue pour CiscoIPPhone, au moins je lui donnerai un +1 :)
Adam Naylor
En effet, je faisais référence à votre image. En utilisant un produit scalaire, vous pouvez obtenir l'angle entre les deux vecteurs, mais encore une fois, il restera inférieur à 180 °.
XGouchet
1

Je pense que vous pouvez obtenir une direction cohérente en traitant cela comme si vous génériez un sommet 2D normal. C'est:

  1. Prenez chacun des vecteurs rouges, échangez les composants x et y et annulez l'un d'eux pour créer les normales.

  2. Normalisez-les.

  3. Additionnez ces deux vecteurs et renormalisez.

Vous voudrez probablement également tester le cas où les deux lignes rouges se chevauchent - la renormalisation finale essaiera de diviser par zéro à cet endroit.

Adam
la source
Merci Adam, cette approche a-t-elle un nom? J'aimerais approfondir la question ...
Adam Naylor
Pas que je sache de. L'astuce de génération de vecteur normale est expliquée sur stackoverflow.com/questions/1243614/…
Adam
0

Soit A et B vos vecteurs:

résultat

Les vecteurs sommateurs n'ont pas besoin d'être des vecteurs unitaires mais simplement de longueur égale, donc si | A | > = | B |, vous pouvez:

résultat équivalent

qui est plus stable numériquement puisque vous n'avez qu'une fraction et le plus grand dénominateur

comment fonctionne sum

Le même résultat peut être obtenu par soustraction, encore une fois les vecteurs doivent être de longueur égale

Cela ne fonctionne que pour les angles non convexes; vous pouvez simplement tester si votre angle est convexe et multiplier H par -1

FxIII
la source
Je ne pense pas que cela fonctionnera si | A | ! = | B | ... considérez A = [0,1] B = [100,0], le résultat n'est pas [.707, .707]
Richard Fabian
@Richard Fabian Vous avez raison, j'ai oublié l'inégalité Triangle!
FxIII