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

Fermé
Pearusdoancaia Messages postés 71 Date d'inscription mardi 21 mai 2019 Statut Membre Dernière intervention 14 janvier 2021 - 21 avril 2020 à 17:39
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 - 26 avril 2020 à 22:47
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 !
A voir également:

7 réponses

yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
Modifié le 21 avril 2020 à 18:25
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.
0
Pearusdoancaia Messages postés 71 Date d'inscription mardi 21 mai 2019 Statut Membre Dernière intervention 14 janvier 2021 86
21 avril 2020 à 20:44
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.
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > Pearusdoancaia Messages postés 71 Date d'inscription mardi 21 mai 2019 Statut Membre Dernière intervention 14 janvier 2021
21 avril 2020 à 21:37
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.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
Modifié le 21 avril 2020 à 21:11
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.



0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
21 avril 2020 à 21:20
Tu peux aussi faire la somme des vecteurs AB + BC = AC en corrélation avec Pythagore


0
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.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931 > Rodabla
22 avril 2020 à 08:52
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
0
Pearusdoancaia Messages postés 71 Date d'inscription mardi 21 mai 2019 Statut Membre Dernière intervention 14 janvier 2021 86
25 avril 2020 à 15:13
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# ?
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476
25 avril 2020 à 15:32
ce serait plus facile à expliquer si tu nous montrais les valeurs de C.X et de C.Y.
0
Pearusdoancaia Messages postés 71 Date d'inscription mardi 21 mai 2019 Statut Membre Dernière intervention 14 janvier 2021 86 > yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024
25 avril 2020 à 16:16
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 :
0
yg_be Messages postés 22720 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 avril 2024 1 476 > Pearusdoancaia Messages postés 71 Date d'inscription mardi 21 mai 2019 Statut Membre Dernière intervention 14 janvier 2021
25 avril 2020 à 20:53
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/
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
25 avril 2020 à 15:26
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.
0
Pearusdoancaia Messages postés 71 Date d'inscription mardi 21 mai 2019 Statut Membre Dernière intervention 14 janvier 2021 86
25 avril 2020 à 16:28
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 ?
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
25 avril 2020 à 17:23
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.

0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
25 avril 2020 à 17:26
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
0
Pearusdoancaia Messages postés 71 Date d'inscription mardi 21 mai 2019 Statut Membre Dernière intervention 14 janvier 2021 86
26 avril 2020 à 21:32
"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.
0
Whismeril Messages postés 19028 Date d'inscription mardi 11 mars 2003 Statut Non membre Dernière intervention 24 avril 2024 931
Modifié le 26 avril 2020 à 22:49
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.

0