Inscription / Connexion Nouveau Sujet
Niveau algorithmique
Partager :

petit problème de trigo

Posté par
djuls
29-11-16 à 15:52

Bonjour,
je suis nouveau sur ce forum je cherche a résoudre un petit problème de trigonométrie, je ne parviens pas à en venir a bout !

J'ai un cercle de rayon connus R et dont je connais également les coordonnées du centre C.
Je connais les coordonnées du point d'intersection B de deux de ses tangentes ( situé bien a l'extérieur du cercle)
Je souhaite trouver un algorithme permettant de calculer les coordonnées des deux points de tangente avec le cercle  A1 et A2
Je ne sais pas si j'ai été super clair
Mais en tout cas, si quelqu'un a une idée du bout de formule qui me permettrait les trouver, je suis preneur !



Merci beaucoup !

petit problème de trigo

Posté par
sanantonio312
re : petit problème de trigo 29-11-16 à 16:01

Bonjour,
Dans le triangle rectangle BCA1, tu connais l'hypoténuse BC et le rayon CA1.
Tu peux en déduire BA1 et l'angle en B.
Avec ça, il doit être possible de retrouver les coordonnées de A1.
Pareil avec A2

Posté par
djuls
re : petit problème de trigo 29-11-16 à 16:30

Merci, oui, en puisant dans mes souvenirs lointains j'avais réussi à en déduire la longueur de l'hypoténuse, et ensuite l'angle mais j'en était resté là les mathématiques ne sont plus mon fort, je reste bloqué là bêtement je ne réussi pas à aller plus loin et determiner A1.x A1.y et B1.x B1.y...

Posté par
mathafou Moderateur
re : petit problème de trigo 30-11-16 à 00:41

Bonjour,


aussi une autre méthode (qui évite de se poser des questions sur le signe des angles selon la position relative de B et C, de faire des rotations etc)

A_1 et A_2 sont les intersections du cercle donné avec le cercle de diamètre BC

l'équation de ce cercle s'obtient au plus rapide en écrivant que pour tout point M(x; y) de ce cercle on a \vec{BM}.\vec{CM} = 0

donc
équation du cercle donné :
(x - x_C)^2 + (y-y_C)^2 = R^2
équation du cercle de diamètre BC :
(x-x_B)(x-x_C) + (y-y_B)(y-y_C) = 0

les coordonnées de A_1 et A_2 sont les solutions du système formé par ces deux équations

en les retranchant membre à membre, les x² et y² disparaissent et il reste une relation du premier degré entre x et y
c'est à dire l'équation d'une droite (c'est en fait l'équation de l'axe radical des deux cercles)
on peut alors substituer par exemple y tiré de l'équation de cette droite dans l'équation d'un des cercles
pour obtenir une équation du second degré en x seulement qui donne les abscisses de A1 et A2

les ordonnées sont obtenues en reportant ces abscisses dans l'équation de la droite.

exemple numérique :

C (2; 1) R = 5 équation du cercle : (x-2)² + (y-1)² = 5² c'est à dire x² + y² - 4x - 2y = 20
B (9; 2) équation du cercle de diamètre BC : (x-2)(x-9) + (y-1)(y-2) = 0 c'est à dire x² + y² - 11x - 3y = -20

les coordonnées des points A1 et A2 sont solutions du système

{ x² + y² - 4x - 2y = 20
{ x² + y² - 11x - 3y = -20

en retranchant membre à membre on obtient le système équivalent (on garde la première pour avoir toujours un système)

{ x² + y² - 4x - 2y = 20
{ 7x + y = 40 c'est à dire y = -7x + 40

on substitue y dans la première :

{ x² + (-7x + 40)² - 4x - 2(-7x + 40) = 20
{ y = -7x + 40

la première se développe et simplifie en 50x² - 550x + 1500 = 0 ou en divisant par 50 pour les humains : x² - 11x + 30 = 0, delta = 1
dont les solutions sont x1 = 5 et x2 = 6

en reportant ces valeurs dans y = -7x + 40 on obtient y1 = 5 et y2 = -2

les points de contact des tangentes issues de B sont A1(5; 5) et A2(6; -2)

pour programmer ça dans un algorithme on développe les équations que j'avais données en littéral et on fait le calcul en littéral.

avec la technique employée dans cet exemple il est nécessaire que B et C n'aient pas la même ordonnée, sinon les y s'éliminent aussi et la droite a pour équation x = constante
mais ce cas particulier en est vraiment un parce que les deux points A1 et A2 ont alors la même abscisse = cette constante là
et on trouve y par l'équation du second degré obtenue en remplaçant x par cette constante.

Posté par
djuls
re : petit problème de trigo 30-11-16 à 09:30

Merci beaucoup !
J'ai passé une bonne partie de la soirée à griffonner des pages d'equations sans résultats
grace a votre aide c'est très clair maintenant je vais tenter l'écriture de l'algorithme, à bientôt.

Posté par
mathafou Moderateur
re : petit problème de trigo 30-11-16 à 13:19

l'utilisation avec les angles suggérée précédemment marche aussi mais c'est à mon avis presque un peu plus compliqué à comprendre sans se tromper car il faut pour le comprendre se placer "virtuellement" en coordonnées polaire de centre B et revenir ensuite en coordonnées cartésiennes (toujours virtuellement)
de plus on passe par des fonctions trigo qui ne donneront toujours que des valeurs approchées, mais si c'est pour faire ça en machine ce n'est pas important.

l'idée est d'obtenir A par le vecteur BA
c'est le vecteur BA qui est à obtenir en coordonnées polaires

petit problème de trigo

il faut commencer par calculer la mesure de BC, et la mesure de BA = d par Pythagore
ainsi que l'angle \alpha = |(\vec{BA}, \vec{BC})| = \arcsin(R/BC)
comme déja fait

il nous faut aussi l'angle de \vec{BC} avec l'axe des abscisses \theta
on est alors prêt à obtenir en polaire le vecteur BA, dans le repère de centre B.
son module est connu c'est d
son angle polaire est :
\varphi = (\vec{i},\vec{BA}) = (\vec{i},\vec{BC}) + (\vec{BC}, \vec{BA})= \theta \pm \alpha \; \;\text{modulo}\;\; 2\pi

\vec{i} étant le vecteur directeur des abscisses (vecteur unitaire de l'axe Ox)
en polaire ce vecteur BA à donc pour coordonnés (d, \varphi)
le plus ou moins donne les deux points A1 et A2

on repasse en cartésiennes pour obtenir
x_A = x_B + d \cos(\varphi)
 \\ y_A = y_B + d \sin(\varphi)

de façon programmée pour déterminer correctement \theta, il faut utiliser la fonction atan2
ne pas se tromper de sens , BC et pas CB
donc theta = atan2((yC-yB),(xC-xB))

le résultat net est que les formules utilisées au final pour programmer ça sont plus simples que celle de la résolution d'équation du second degré.

exemple numérique (sur l'exemple précédent)

xBC = 2 - 9 = -7, yBC = 1 - 2 = -1
BC = sqrt(BC²+yBC²) = sqrt((-7)² + (-1)²) = 7.0710678118654755
theta = atan2(yBC, xBC) = atan2(-1, -7) = -2.999695598985629 radians
d = sqrt(BC² - R²) = sqrt(7.0710678118654755² - 5²) = 5.000000000000001
alpha = asin(R/BC) = asin(5/7.0710678118654755) = 0.7853981633974482 radians
xA1 = xB+d*cos(theta-alpha) = 4.999999999999998
yA1 = yB+d*sin(theta-alpha) = 4.999999999999999
xA2 = xB+d*cos(theta+alpha) = 6
yA2 = yB+d*sin(theta+alpha) = -2.0000000000000018

malgré une relecture soignée il n'est pas impssible que quelques fautes de frappe subsistent dans tout ça.

Posté par
djuls
re : petit problème de trigo 30-11-16 à 14:22

Genial ! Ça marche vraiment très bien, j'ai choisi la seconde option
Encore merci !!!


static PointF[] ComputeTangentPoints(PointF b, PointF c, float r)
{
   PointF A1 = new PointF();
   PointF A2 = new PointF();

   double xBC = c.X - b.X;
   double yBC = c.Y - b.Y;
   double BC = Math.Sqrt(Math.Pow(xBC,2)+ Math.Pow(yBC,2));
   double theta = Math.Atan2(yBC, xBC);
   double d = Math.Sqrt(Math.Pow(BC,2) - Math.Pow(r,2));
   double alpha = Math.Asin(r / BC);
   A1.X = (float)(b.X + d * Math.Cos(theta - alpha));
   A1.Y = (float)(b.Y + d * Math.Sin(theta - alpha));
   A2.X = (float)(b.X + d * Math.Cos(theta + alpha));
   A2.Y = (float)(b.Y + d * Math.Sin(theta + alpha));

   return new PointF[2] {A1, A2};
}

Posté par
mathafou Moderateur
re : petit problème de trigo 30-11-16 à 14:26

pour éviter des plantages il faudrait tester le cas ou B est à l'intérieur du cercle
(pour éviter de chercher à extraire la racine carrée d'un nombre négatif)
mais bon, c'est peut être fait dans un try catch ...

Posté par
djuls
re : petit problème de trigo 30-11-16 à 15:00

Oui je travail sur un petit simulateur de Polargraph, les moteurs se trouvant a l'extérieur de la zone d'action, ce cas particulier semble impossible

petit problème de trigo

Posté par
mathafou Moderateur
re : petit problème de trigo 30-11-16 à 15:12

Sympa.
il faut imaginer un truc pour tirer vers le bas et tendre les cables

je me souviens que j'ai eu en projet de fin d'étude (ça remonte aux années 70 !) l'étude d'une table traçante (x-y) matériel et logiciel.
et j'étais tombé sur l'écueil de l'influence mécanique réciproque des deux cables x et y l'un sur l'autre en dynamique, entrainant un "frisottis" du tracé.

évidemment en simulation, on ne craint pas ça !

Posté par
djuls
re : petit problème de trigo 30-11-16 à 15:52

Oui pour la partie matérielle je pense mettre des contre-poids sur la partie "tête d'écriture" et aux extrémités des chaînettes
Ensuite il faudra surement trouver la bonne vitesse pour ne pas que ça rentre en resonance, etc...

Répondre à ce sujet

Seuls les membres peuvent poster sur le forum !

Vous devez être connecté pour poster :

Connexion / Inscription Poster un nouveau sujet
Une question ?
Besoin d'aide ?
(Gratuit)
Un modérateur est susceptible de supprimer toute contribution qui ne serait pas en relation avec le thème de discussion abordé, la ligne éditoriale du site, ou qui serait contraire à la loi.


Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !