Perpendiculaire sur une ligne à partir d'un point donné

Comment puis-je dessiner une perpendiculaire sur un segment de ligne à partir d'un point donné? Mon segment de ligne est défini comme (x1, y1), (x2, y2), si je dessine une perpendiculaire d'un point (x3, y3) et qu'elle se rencontre à la ligne sur le point (x4,y4). Je veux savoir ceci (x4, y4).

32
demandé sur afuzzyllama 2009-11-28 07:25:51

10 réponses

J'ai résolu les équations pour vous:

k = ((y2-y1) * (x3-x1) - (x2-x1) * (y3-y1)) / ((y2-y1)^2 + (x2-x1)^2)
x4 = x3 - k * (y2-y1)
y4 = y3 + k * (x2-x1)

Où ^2 signifie au carré

58
répondu Ray Hidayat 2009-11-28 05:07:04

À Partir de wiki:

En algèbre, pour toute équation linéaire y = mx + b, les perpendiculaires seront toutes avoir une pente de (-1 / m) , le contraire réciproque de la pente initiale. Il est utile de mémoriser le slogan "à trouver la pente de la perpendiculaire ligne, retourner la fraction et changer le signer."Rappelons que tout nombre entier une est lui-même sur un, et peut être écrit comme (a/1)

Pour trouver la perpendiculaire d'un ligne qui traverse également un point particulier (x, y), résoudre le équation y = (-1 / m) x + b, en remplaçant dans les valeurs connues de m, x et y pour résoudre pour B.

La pente de La ligne, m, par (x1, y1) et (x2, y2) est m = (y1 - y2) / (x1 - x2)

17
répondu Mitch Wheat 2009-11-28 04:29:41

Je suis d'accord avec pierre.Murray.rouille, les vecteurs rendent la solution plus claire:

// first convert line to normalized unit vector
double dx = x2 - x1;
double dy = y2 - y1;
double mag = sqrt(dx*dx + dy*dy);
dx /= mag;
dy /= mag;

// translate the point and get the dot product
double lambda = (dx * (x3 - x1)) + (dy * (y3 - y1));
x4 = (dx * lambda) + x1;
y4 = (dy * lambda) + y1;
9
répondu Abraxas 2014-01-16 17:10:08

Vous constaterez souvent que l'utilisation de vecteurs rend la solution plus claire...

Voici une routine de ma propre bibliothèque:

public class Line2  {

Real2 from;
Real2 to;
Vector2 vector;
Vector2 unitVector = null;


    public Real2 getNearestPointOnLine(Real2 point) {
        unitVector = to.subtract(from).getUnitVector();
        Vector2 lp = new Vector2(point.subtract(this.from));
        double lambda = unitVector.dotProduct(lp);
        Real2 vv = unitVector.multiplyBy(lambda);
        return from.plus(vv);
    }

}

Vous devrez implémenter Real2 (a point) et Vector2 et dotProduct () mais ceux-ci devraient être simples:

Le code ressemble alors à quelque chose comme:

Point2 p1 = new Point2(x1, y1);
Point2 p2 = new Point2(x2, y2);
Point2 p3 = new Point2(x3, y3);
Line2 line = new Line2(p1, p2);
Point2 p4 = getNearestPointOnLine(p3);

La bibliothèque (org.xmlcml.euclide) est à: http://sourceforge.net/projects/cml/

Et il y a des tests unitaires qui exerceront cette méthode et vous montreront comment utiliser.

@Test
public final void testGetNearestPointOnLine() {
    Real2 p = l1112.getNearestPointOnLine(new Real2(0., 0.));
    Real2Test.assertEquals("point", new Real2(0.4, -0.2), p, 0.0000001);
}
8
répondu peter.murray.rust 2009-11-28 06:23:21

Vous connaissez à la fois le point et la pente, donc l'équation pour la nouvelle ligne est:

y-y3=m*(x-x3)

Puisque la ligne est perpendiculaire, la pente est la réciproque négative. Vous avez maintenant deux équations et pouvez résoudre pour leur intersection.

y-y3=-(1/m)*(x-x3)
y-y1=m*(x-x1)
7
répondu Dan Lorenc 2009-11-28 04:31:53

Calculez la pente des points de jonction de ligne (x1, y1) et (x2, y2) comme m=(y2-y1)/(x2-x1)

Équation de la ligne joignant (x1, y1) et (x2, y2) en utilisant la forme de pente de l'équation de la ligne, serait y-y2 = m(x-x2)

Pente de la droite joignant (x3,y3) et (x4,y4) serait -(1/m)

Encore une fois, l'équation de la ligne joignant (x3, y3) et (x4, y4) en utilisant la forme de pente ponctuelle de l'équation de la ligne, serait y-y3 = -(1/m)(x-x3)

Résolvez ces deux équations linéaires en résolvant une équation linéaire en deux variables et les valeurs de x et y, vous obtenez serait votre (x4,y4)

J'espère que cela aide.

Santé

3
répondu Arnkrishn 2009-11-28 04:45:19

Découvrez les pistes pour les deux les lignes, disons les pentes sont m1 et m2 alors m1*m2=-1, est la condition de perpendicularité.

2
répondu Prasoon Saurav 2009-11-28 04:31:03

Code de fonction Matlab pour le problème suivant

function Pr=getSpPoint(Line,Point)
% getSpPoint(): find Perpendicular on a line segment from a given point
x1=Line(1,1);
y1=Line(1,2);
x2=Line(2,1);
y2=Line(2,1);
x3=Point(1,1);
y3=Point(1,2);

px = x2-x1;
py = y2-y1;
dAB = px*px + py*py;

u = ((x3 - x1) * px + (y3 - y1) * py) / dAB;
x = x1 + u * px;
y = y1 + u * py;

Pr=[x,y];

end
2
répondu Rajnikant Sharma 2016-03-09 11:46:55

Mathematica a introduit la fonction RegionNearest[] dans la version 10, 2014. Cette fonction pourrait être utilisée pour renvoyer une réponse à cette question:

{x4,y4} = RegionNearest[Line[{{x1,y1},{x2,y2}}],{x3,y3}]
1
répondu BeanSith 2017-01-10 01:55:36

C'est surtout un duplicata de la réponse D'Arnkrishn. Je voulais juste compléter sa section avec un extrait de code Mathematica complet:

m = (y2 - y1)/(x2 - x1)
eqn1 = y - y3 == -(1/m)*(x - x3)
eqn2 = y - y1 == m*(x - x1)
Solve[eqn1 && eqn2, {x, y}]
1
répondu BeanSith 2017-01-10 04:49:16