2009-12-17 4 views
10

Je connais les extrémités d'un segment de droite et la distance/taille des extrémités perpendiculaires que j'aimerais créer, mais j'ai besoin de calculer les extrémités de la ligne perpendiculaire. Je me suis cogné la tête contre le mur en utilisant des triangles 45-45-90 et des produits scalaires, mais je n'arrive pas à le faire se rencontrer. Je connais les points en bleu et la distance aux points en rouge, j'ai besoin de trouver les points en rouge.Comment calculer les points de fin de segments de ligne perpendiculaires?

Avant de marquer comme doublon, j'ai essayé la réponse affichée dans this question mais cela a abouti à des embouts qui étaient toujours verticaux.

http://rauros.net/files/caps.png http://rauros.net/files/caps.png

+0

Cela dépend du point sur la ligne connue auquel vous souhaitez que la ligne perpendiculaire le rejoigne également. Votre diagramme d'exemple semble montrer qu'ils sont au milieu des lignes connues. – ZombieSheep

+0

oui, les doivent se croiser au milieu de la ligne rouge – basszero

+0

Relatif: [calculer un décalage perpendiculaire à partir d'une ligne diagonale] (http://stackoverflow.com/q/17195055/183120). – legends2k

Répondre

16

Si B1 est le point bleu entre les 2 points rouges, et B2 est l'autre point bleu alors la façon de le faire est la suivante:

  • Trouver B1 - B2
  • Normaliser ce vecteur
  • Changez l'échelle de ce vecteur par la moitié de la distance entre les points rouges
  • Rotation de 90 degrés
  • Ajouter ce vecteur à B1 (ce qui est R1)
  • Su btract ce vecteur de B1 (Ceci est R2)

Tout ce qui précède est assez simple - le bit le plus difficile serait de savoir comment l'écrire dans le texte!

Cela pourrait être utile si - matrice pour faire tourner de 90 degrés:

[ 0 -1 ] 
[ 1 0 ] 
+0

L'explication de vecteur anglais simple est exactement ce dont j'avais besoin pour Mets les morceaux ensemble dans ma tête. Merci! Dommage que vous n'ayez pas eu beaucoup de upvotes – basszero

3

Vous connaissez la pente de la ligne bleue, nous allons l'appeler m. Et une ligne perpendiculaire à la ligne bleue aura une pente -1/m.

Pour trouver la coordonnée x, vous avez besoin d'un trig, sine \theta = d/delta_x, où \ theta est l'angle de la ligne bleue pour l'axe des x et d est la distance à l'un des points rouges du point bleu. Ensuite, ajoutez/soustrayez delta_x à l'abscisse du point bleu auquel vous voulez que la ligne soit perpendiculaire. Vous pouvez maintenant utiliser la formule point-pente pour déterminer la coordonnée y.

+0

Mais vous devez résoudre un système d'équations impliquant la distance pour transformer la forme de la pente ponctuelle en un segment de droite. J'espérais une solution système résolue – basszero

+0

ouais, j'ai raté une étape, vous devez trouver la coordonnée x de la formule point-pente d'abord, où le trig intervient. – nlucaroni

8

La manière facile autour de celui-ci est de ne pas penser en termes de pente m, mais plutôt le changement de x et y, J'appelle dx, dy (de la notation de calcul). La raison en est que traiter une pente pour une ligne verticale est infini, et dans tous les cas, vous n'avez pas besoin d'utiliser les fonctions trigonométriques, ce code sera plus rapide et plus simple. Je suppose ici que le point 2 est l'intersection de la ligne désirée. Ok, donc la ligne perpendiculaire a une pente avec la réciproque négative de la première. Il y a deux façons de le faire:

dx2 = -dy 
dy2 = dx 

ou

dx2 = dy 
dy2 = -dx 

cela correspond aux deux directions, un virage à droite, et l'autre à gauche.

Toutefois, dx et dy sont mis à l'échelle de la longueur du segment de ligne d'origine. Votre perpendiculaire a une longueur différente.

est ici la longueur entre deux points:

double length(double x1, double y1, double x2, double y2) { 
return sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)); 
} 

Faites ce que vous voulez, aller d'un côté ou l'autre, est la suivante:

double scale = length(whatever length you want to go)/sqrt(dx*dx+dy*dy); 
double dx2 = -dy * scale; 
double dy2 = dx * scale 

puis la même pour l'autre côté . Je viens de réaliser que mon exemple est un peu C++, puisque j'ai utilisé sqrt, mais les différences sont triviales. Notez que vous pouvez écrire le code plus efficacement, en combinant les racines carrées.

Questions connexes