Faire une perpendiculaire d'une ligne passant par un point. C# Windows Form

Signaler
Messages postés
72
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
25 mai 2020
-
Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
-
Yo !

Voici ce que j'ai :

Point T1P1 = new Point(100, 100);
Point T1P2 = new Point(400, 400);

Pen DePi = new Pen(Color.DeepPink, 1);

Bitmap DrawArea = new Bitmap(picky.Size.Width, picky.Size.Height);
Graphics g = Graphics.FromImage(DrawArea);
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;

g.DrawLine(DePi, T1P1, T1P2);

picky.Image = DrawArea;


Voici sa représentation dans Geogebra :



Et voici ce que je veux :



Une perpendiculaire de la droite AB passant par le point A et faisant 50 cm.

Problème :
Je n'ai pas trouvé de méthodes permettant de faire des perpendiculaires.

Alors j'ai un peu révisé ma géométrie et mes maths et, dans un repère orthonormé, l'équation d'une droite c'est :

y = mx + h

y étant l'odonné d'un point sur la droite
x l'abscisse de ce même point
m la pante de la droite
h l'ordonné à l'origine

Voici, alors, ce que j'ai suivis pour essayer de faire une perpendiculaire sans de méthode toute faite :

https://www.youtube.com/watch?v=B9p3sVGypU4 (pour connaitre l'équation d'une droite perpendiculaire à une autre droite)

https://www.youtube.com/watch?v=jzbNANey-58 (pour savoir comment trouver m)

J'ai réussi à faire une perpendiculaire avec quelques calculs, mais actuellement je tombe sur un autre problème...

Bref, tout ça pour demander s'il existe une méthode pour directement faire une perpendiculaire d'une ligne par rapport à un point de la ligne ? Pour savoir si je me casse pas la tête pour rien à résoudre mes problèmes. Merci !

7 réponses

Messages postés
11462
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
3 juillet 2020
655
si cela peut t'aider, l'équation de ta droite de départ, qui passe par (100,100) et (400,400) est:
y=x

comme tu as vu sur youtube, la droite perpendiculaire a pour équation:
y= -x + h

comment trouver h? facile, car la perpendiculaire passe par (100,100)

cependant, tu dois trouver les coordonnées du point C, pas l'équation de la droite perpendiculaire.
Messages postés
72
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
25 mai 2020
14
J'ai réussi à faire la perpendiculaire avec des calculs, en gros j'ai calculé la pente de ma droite AB, qui vaut 1, donc la pente de ma droite perpendiculaire c'est -1, j'ai donc fait que le point C ait pour coordonnées (xA - 1; yA - mA) mA valant -1 Mais le problème est pour la longueur de AC, j'en suis là, j'ai fais une boucle qui fait (xA - 1; yA - mA) jusqu'à ce que distance = Math.Sqrt((Math.Pow(T1P1.X - (TPerpenT1PX), 2) + Math.Pow(T1P1.Y - (TPerpenT1PY), 2))); soit égal à 50 (ligne de code pour calculer la distance entre A et C. Sauf qu'en modifiant les coordonnées ainsi : (xA - 1; yA - mA), ça fait que la valeur la plus proche qu'atteint distance est égal à 49,4974746830583 cm. Là je réfléchis pour modifier ça. Mais je me demande s'il n'existe pas, tout simplement, une méthode pour faire une perpendiculaire, facilement.
Messages postés
11462
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
3 juillet 2020
655 >
Messages postés
72
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
25 mai 2020

je ne pense pas qu'il y ait un code tout fait.

il me semble que tu n'as pas utilisé ma suggestion précédente.

je pense qu'il n'est pas utile d'ainsi chercher par approximation les coordonnées du point C, il est préférable de le faire via un raisonnement mathématique.

(100,100) est sur la droite y= -x + h
le point C est sur la droite y= -x + h
la distance entre le point C et (100,100) est 50

cela permet facilement de calculer à la main les coordonnées du point C.
Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
553
Bonsoir

Le vecteur AC a une pente de -1 et une norme de 50.
La pente est de -1 donc Y = -X.
La norme est de 50 donc 50 = Racine(X^2 + Y^2)
=> 50^2 = X^2 + (-X)^2
(-X)^2 = X^2
=> 50^2 = 2X^2
=> 50 = Racine(2) X ou 50 = Racine(2) -X
=> X = 50/ Racine(2) ou -50 / Racine(2).

Tu détermines quelle solution colle pour que C soit dans la bonne direction.



Quand j'étais petit, la mer Morte n'était que malade.
George Burns
Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
553
Tu peux aussi faire la somme des vecteurs AB + BC = AC en corrélation avec Pythagore


Oui voilà, n'est ce pas la même chose d'ailleurs dans vos 2 exemples ?

Parce qu'il ne me semble pas qu'il existe tant de méthodes que ça pour calculer les coordonnées et angles d'un triangle.

Donc Pythagore ce qui remonte quand même à quelque temps et son fameux théorème le plus connu(il a aussi inventé les partitions de musique mais c'est autre chose).
Simple problème de géométrie de niveau collège et la difficulté est simplement de poser l'énoncé quand on a la formule.
Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
553 > Rodabla
Non ce n’est pas la même chose.
Et non Pythagore ne permet ni de calculer des angles ni des coordonnées.
Seulement la longueur d’un coté d’un triangle rectangle si on connaît les 2 autres.
Mon premier exemple part de là où elle en était à savoir 1 coefficient directeur et une distance.
De ce point, il y avait 3 solutions qui me sont venues à l’esprit
  • un système d’équations avec l’équation de la droite.
  • de la trigonométrie
  • un vecteur directeur.


Le vecteur directeur était le plus simple à ce moment de sa réflexion, et pour le calcul de ses coordonnées delta x (que j’ai appelé X) et delta y, je me suis servis de la combinaison entre le coefficient directeur et de Pythagore.

Ma seconde proposition revient à faire un système d’équations à partir des coordonnées des 3 vecteurs.

On pourrait aussi faire une triangulation à partir des coordonnées des points A et B et des coefficients directeurs des droite (AC) et (BC) bref y’a pleins de solutions
Messages postés
72
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
25 mai 2020
14
Re, merci pour vos réponse. A la base je voulais savoir si une méthode existait pour faire une perpendiculaire en C#, mais visiblement ça n'existe pas.

Visiblement on est partit pour le faire manuellement, donc :
J'ai pris en compte vos solutions, j'ai continué à chercher et j'ai une solution qui, je pense, doit fonctionner :

Sans vraiment trop comprendre j'ai pris ce calcul :

"xc = xa +/- AC/AB * (ya-yb)
yc = ya +/- AC/AB * (xb-xa)"

(voir la réponse de robert et ses amis : https://forums.futura-sciences.com/mathematiques-superieur/25147-coordonnees-dun-point-dun-triangle.html (lui a mis "(ya-ab)" je pense qu'il a fait une faute de frappe et c'est "(ya-yb)"))

Que j'ai transposé sur mon problème, ce qui donne :

            decimal Xc = (decimal)T1P1.X + 50 / ABd * (T1P1.Y - T1P2.Y);
            decimal Yc = (decimal)T1P1.X + 50 / ABd * (T1P2.X - T1P1.X);


Avec :

            Point T1P1 = new Point(100, 100);
            Point T1P2 = new Point(400, 400);


Et :

decimal ABd = (decimal)Math.Sqrt((Math.Pow(T1P1.X - (T1P2.X), 2) + Math.Pow(T1P1.Y - (T1P2.X), 2)));


Sauf qu'il y a un problème... Lorsque je calcul AC (qui doit faire 50 cm je le rappelle) :

decimal distanceAC = (decimal)Math.Sqrt((Math.Pow(T1P1.X - (C.X), 2) + Math.Pow(T1P1.Y - (C.Y), 2)));
MessageBox.Show("" + distanceAC);


J'ai une imprécision :


Imprécision qui est dû, je pense, aux coordonnées des points utilisés qui sont des FPoint et non des "decimal Point" (chose que je ne trouve pas) qui serait plus précis.

Il y a donc une imprécision dans le calcul de ABd, donc dans le calcul de Xc et Yc puis une imprécision dans le calcul de distanceAC. Alors, comment faire pour régler ce problème ? Comment utiliser des coordonnées décimales en C# ?
Messages postés
11462
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
3 juillet 2020
655
ce serait plus facile à expliquer si tu nous montrais les valeurs de C.X et de C.Y.
Messages postés
72
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
25 mai 2020
14 >
Messages postés
11462
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
3 juillet 2020

Yép, alors, C.X et C.Y sont les coordonnées du point C :

PointF C = new PointF(Convert.ToSingle(Xc), Convert.ToSingle(Yc));


Qui valent :
Messages postés
11462
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
3 juillet 2020
655 >
Messages postés
72
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
25 mai 2020

peux-tu copier du texte, et pas des images de texte?

l'imprécision est souvent inévitable, dès que tu choisis de mémoriser un nombre plutôt qu'une fraction ou qu'une formule telle qu'une racine.

dans ton cas, quand tu écris
decimal Xc = (decimal)T1P1.X + 50 / ABd * (T1P1.Y - T1P2.Y);
, tu renonces à la précision.

prenons un exemple simple: x=1/3. écris la représentation numérique de x sur une feuille.
passe ensuite cette feuille à une autre personne, et demande lui de multiplier x par trois.
qu'obtiens-tu?

dans la plupart des cas, cette approximation n'est pas gênante.

je te félicite de l'avoir remarqué, et de t'en inquiéter.

je ne peux pas décider si, dans ton cas, tu dois laisser tomber (accepter l'imprécision), ou chercher une solution précise.

pour obtenir des solutions précises, tu peux utiliser des fonctions algébriques ou symboliques. en C# par exemple: https://symbolics.mathdotnet.com/
Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
553
Bonjour

C’est un problème classique auquel un débutant qui a brûlé les étapes se retrouve confronté: les nombres à virgule flottante.

Dans ce message, j’ai esquissé une comparaison https://forums.commentcamarche.net/forum/affich-35846831-erreur-de-calcul#3
Dalfab et Reivax sont venus ensuite préciser chacun avec son explication.
Messages postés
72
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
25 mai 2020
14
D'accord, j'avais bien compris que le problème venait du float, mais comment faire pour utiliser des décimales dans l'initialisation d'un point ?
Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
553
Il n’y a aucun intérêt.
Tu es à 5e-6, ça veut dire que si ton unité est le mettre, tu te prends la tête pour 5 microns.

Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
553
Ps je n’étais pas allé voir la réponse de robert et ses amis, mais j’avais que partir directement des vecteurs sans calculer les équations de droite reviendrait à un simple système d’équations
Messages postés
72
Date d'inscription
mardi 21 mai 2019
Statut
Membre
Dernière intervention
25 mai 2020
14
"Je me prend la tête pour 5 microns" Bah, si il y a une quelconque imprécision la droite n'est pas perpendiculaire en fait... Et ça ne fait pas 50 cm pile... ça veut dire que pour la suite, je doit faire une parallèle de la droite AB passant par C, faire la même chose pour une deuxième droite, placer un point (qu'on va appeler J) à l'intersection des deux droites parallèles et tracer un arc de centre J et de rayon 50 cm qui débute à l’interception de la droite AB et de l'arc puis de A'B' et de l'arc. Ce sera mieux en image :



Les parties visibles, à la fin, sont les segments CG et HB puis l'arc GH, tout le reste ne serait que des calculs pour trouver F, placer l'arc GH et supprimer AG et AH.

Le cercle de centre F doit impérativement faire 50 cm de rayon puis AB et AC doivent être impérativement tangents au cercle de centre F. Donc je ne veux pas d'imprécision.
Messages postés
14462
Date d'inscription
mardi 11 mars 2003
Statut
Contributeur
Dernière intervention
3 juillet 2020
553
Te rends tu comptes, que sur 50 cm, on parle de 50 nanomètres.

C’est tellement infime, qu’en cas de construction réelle, même avec les meilleurs outils, une telle précision est extrêmement difficile à atteindre.

Mais bon, si tu veux avoir des « points » dont les champs sont de types decimal, il te suffit d’écrire la classe.

Quand j'étais petit, la mer Morte n'était que malade.
George Burns