{C!} VectorTranslation (C,B,A)[hidden]; Circle (A,C!); |
On peut inverser la construction en copiant un cercle de centre B :
{C*} Circle (B,C)[hidden]; VectorTranslation (C*,B,A) |
Ou par une mesure :
{r} Distance (B,C,0,0,' ')[hidden]; Circle by radius (A,r); |
{M} Dilation (B, C, 0.5)[hidden]; {bc} Line (B, C)[hidden]; {om} Perpendicular (bc, M)[hidden]; {N} Dilation (A, B, 0.5)[hidden]; {ab} Line (A, B)[hidden]; {on} Perpendicular (ab, N)[hidden]; {O} Intersect (om, on)[hidden]; Circle (O, A); |
Une autre méthode, juste pour le fun :
Soit une droite d quelconque passant par B
Construisons la droite d' passant par C avec les angles orientés de droites (d',CA) = (d,BA),
Le point d'intersection de d et d' décrit le cercle circonscrit à ABC (angles inscrits)
La droite d est définie par un point parcourant un cercle quelconque de centre B
Le cercle quelconque est ici choisi par simplification comme le cercle passant par A.
Le cercle (ABC) est alors obtenu comme lieu géométrique.
{Kb} Circle (B,A)[hidden]; {D} Point on object (Kb, -1)[hidden]; {D!} Rotation/MarkedAngle (A,C,A,B,D)[hidden]; {d} Line (B,D)[hidden]; {d!} Line (C,D!)[hidden]; {M} Intersect (d,d!)[hidden]; Locus (M,D,Kb, 200)[red]; |
Aucune de ces méthode ne fonctionne si ABC sont alignés (le "cercle" ABC dégénère alors en la droite ABC)
La méthode par lieu géométrique fournit des tracés complètement aberrants quand ABC sont presque alignés si le nombre de points du lieu est trop faible.
Cette méthode est d'ailleurs donnée uniquement à titre de curiosité, car elle ne permet pas d'obtenir le centre,
ni des points d'intersections de ce cercle avec d'autres droites/cercles.
{AB} Segment (A,B)[hidden]; {P} Point on object (AB, 0)[hidden]; {M} Rotation/MarkedAngle (A,O,A,O,P)[hidden]; {arc} Locus (M,P,AB, 100); |
Le plus simple est alors par calcul :
{OA} Segment (A,O)[hidden]; {P} Point on object (OA, 0)[hidden]; {t} Ratio/Points (O,A,P,0,0,' ')[hidden]; {a} Angle (A,O,B,0,0,' ')[hidden]; { convertit en radians au besoin et entre 0 et 2π, point courant } {at} Calculate (0,0,' ','A!@sgn_1+2/@rond1@atan8**1@atanA*45/+B*')(a,t)[hidden]; {M} Rotation/MeasuredAngle (A,O,at)[hidden]; {arc} Locus (M,P,OA, 100); |
Attention aux paramètres "DirectedAngles" et "MeasureInDegrees" de l'applet.
Les angles sont, dans les calculs et les constructions, toujours exprimés en radians.
Par contre une mesure d'angle dépend du paramètre MeasureInDegrees !
L'applet est ici avec MeasureInDegrees=1 et DirectedAngles=1
Si MeasureInDegrees=0, la conversion en radians 1@atanA*45/ est inutile, A suffit
Il est recommandé de mettre toujours DirectedAngles=1, quitte à afficher par calcul des valeurs absolues.
{OM} Segment (O,M)[hidden]; {sect} Locus (OM,P,OA, 2000); |
Attention ! Pour que ce secteur ne recouvre pas les autres tracés, il faut jouer avec layer( )
On peut aussi approximer le secteur par un polygone, mais il faut définir explicitement chacun des sommets :
Ici avec 6 sommets (si l'angle est fixe, le calcul est inutile, de simples Rotation() suffisent)
{a} Angle (A,O,B,0,0,' ')[hidden]; { AOB/6, convertit en radians au besoin et entre 0 et 2π } {at} Calculate (0,0,' ','A!@sgn_1+2/@rond1@atan8**1@atanA*45/+6/')(a)[hidden]; {M1} Rotation/MeasuredAngle (A,O,at)[hidden]; {M2} Rotation/MeasuredAngle (M1,O,at)[hidden]; {M3} Rotation/MeasuredAngle (M2,O,at)[hidden]; {M4} Rotation/MeasuredAngle (M3,O,at)[hidden]; {M5} Rotation/MeasuredAngle (M4,O,at)[hidden]; {M6} Rotation/MarkedAngle (A,O,A,O,B)[hidden]; Polygon (O,A,M1,M2,M3,M4,M5,M6); |
{M} Dilation (O,P, 0.5)[hidden]; {Kop} Circle (M,O)[hidden]; {T1} Intersect1 (Kop,C); {ot1} Line (O,T1)[hidden]; {pt1} Perpendicular (ot1,T1); {T2} Intersect2 (Kop,K); {ot2} Line (O,T2)[hidden]; {pt2} Perpendicular (ot2,T2); |
Une méthode fonctionnant alors dans tous les cas, y compris r = 0, est obtenue par calcul :
{ mesures } {d} Distance (O,P,0,0,' ')[hidden]; {r} Radius (K,0,0,' ')[hidden]; { tangente } {a} Calculate (0,0,' ','AB/@asin')(r,d)[hidden]; {xx} Line (O,P)[hidden]; {tt} Rotation/MeasuredAngle (xx,P,a)[red]; {OT} Perpendicular (tt,O)[hidden]; {T1} Intersect1 (OT,K); {tt!} Reflexion (tt,xx); |
{ cercle de diamètre O1O2 } {M} Dilation (O1,O2, 0.5)[hidden]; {Koo} Circle (M,O1)[hidden]; { tangentes extérieures } {r2-r1} VectorTranslation (O1,r1,r2)[hidden]; {K-} Circle (O2,r2-r1)[hidden]; {t2-} Intersect1 (Koo,K-)[hidden]; {T2-} Dilation/3PtRatio (t2-,O2,O2,r2-r1,r2); {O2t2-} Line (O2,t2-)[hidden]; {tt2-} Perpendicular (O2t2-,T2-); {T1-} VectorTranslation (T2-,t2-,O1); { tangentes intérieures } {r2+r1} VectorTranslation (r1,O1,r2)[hidden]; {K+} Circle (O2,r2+r1)[hidden]; {t2+} Intersect1 (Koo,K+)[hidden]; {T2+} Dilation/3PtRatio (t2+,O2,O2,r2+r1,r2); {O2t2+} Line (O2,t2+)[hidden]; {tt2+} Perpendicular (O2t2+,T2+); {T1+} VectorTranslation (T2+,t2+,O1); |
{ centres d'homothétie } {d2} Rotation (oo,O2,1.5)[hidden]; {d1} Parallel (d2,O1)[hidden]; {C2} Intersect1 (d2,K2)[hidden]; {C1} Intersect1 (d1,K1)[hidden]; {C1*} Intersect2 (d1,K1)[hidden]; {c1c2} Line (C1,C2)[hidden]; {I} Intersect (c1c2,oo)[hidden]; {c1c2*} Line (C1*,C2)[hidden]; {J} Intersect (c1c2*,oo)[hidden]; { tangentes issues de I et J } {M} Dilation (I,O2, 0.5)[hidden]; {Ki} Circle (M,O2)[hidden]; {T2i} Intersect1 (Ki,K2); {it2} Line (I,T2i); {T1i} Dilation/3PtRatio (T2i,I,I,O2,O1); {N} Dilation (J,O2, 0.5)[hidden]; {Kj} Circle (N,O2)[hidden]; {T2j} Intersect1 (Kj,K2); {jt2} Line (J,T2j); {T1j} Dilation/3PtRatio (T2j,J,J,O2,O1); |
Pour obtenir une construction qui fonctionne automatiquement dans tous les cas, y compris r1 = r2,
le plus simple est de procéder par calcul :
Dans la première construction, l'angle du rayon O1T1 avec la ligne des centres est
(O1O2,O1T1) = (O1O2, O1t2) + π/2 et comme
(O1O2, O1t2) = Arcsin( (r2 - r1)/d) ), on obtient finalement
(O1O2,O1T1) = Arccos( (r1 - r2)/d ) avec d = O1O2.
Cette formule est valable quels que soient r1 et r2
On a de même (O1O2,O1T '1) = Arccos( (r1 + r2)/d ) pour la tangente intérieure.
Si |r2 - r1|/d > 1 (resp. (r2 + r1)/d > 1), la tangente n'existe pas et le Arccos renvoie "undefined".
{ mesures } {d} Distance (O1, O2, 0, 0, ' ')[hidden]; {r1} Radius (K1, 0, 0, ' ')[hidden]; {r2} Radius (K2, 0, 0, ' ')[hidden]; { tangentes extérieures } {a} Calculate (0,0,' ','AB-C/@acos')(r1,r2,d)[hidden]; {Ox} Line (O2, O1)[hidden]; {O1t} Rotation/MeasuredAngle (Ox, O1, a)[hidden]; {T1} Intersect2 (O1t, K1); {tt} Perpendicular (O1t, T1); {O2t} VectorTranslation (O1t, O1, O2)[hidden]; {T2} Intersect2 (O2t, K2); { tangentes intérieures } {a!} Calculate (0,0,' ','AB+C/@acos')(r1,r2,d)[hidden]; {O1t!} Rotation/MeasuredAngle (Ox,O1,a!)[hidden]; {T1!} Intersect2 (O1t!,K1); {tt!} Perpendicular (O1t!,T1!); {O2t!} VectorTranslation (O1t!,O1,O2)[hidden]; {T2!} Intersect1 (O2t!,K2); |
Dans les applets ci-dessus, les cercles et les points de contrôle des rayons sont astreints
sur une ligne horizontale pour pouvoir obtenir facilement le cas r1 = r2
(sinon aucune chance).
Mais la construction proposée marche quels que soient ces points.
Il est juste nécessaire pour le VectorTranslation définissant r2 ± r1 que O1r1 soit parallèle à O2r2.