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 !
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
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...
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)
et
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
donc
équation du cercle donné :
équation du cercle de diamètre BC :
les coordonnées de et
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.
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.
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
il faut commencer par calculer la mesure de BC, et la mesure de BA = d par Pythagore
ainsi que l'angle
comme déja fait
il nous faut aussi l'angle de avec l'axe des abscisses
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 :
étant le vecteur directeur des abscisses (vecteur unitaire de l'axe Ox)
en polaire ce vecteur BA à donc pour coordonnés
le plus ou moins donne les deux points A1 et A2
on repasse en cartésiennes pour obtenir
de façon programmée pour déterminer correctement , 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.
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};
}
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 ...
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
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 !
Vous devez être membre accéder à ce service...
Pas encore inscrit ?
1 compte par personne, multi-compte interdit !
Ou identifiez-vous :