{ab} Line (A,B); {M} Rotation (B,A,1)[hidden]; {am} Line (A,M)[hidden]; {bn} Parallel (am,B)[hidden]; {mn} Line (M,C)[hidden]; {N} Intersect(mn, bn)[hidden]; {N!} Dilation (N,B,-1)[hidden]; {mn!} Line (M,N!)[hidden]; {D} Intersect (mn!,ab); |
Par calcul :
CD/CB = 2(CA/CB) / ( 1 + CA/CB)
{ab} Line (A,B); {r} Ratio/Points (C,B,A,0,0,' ')[hidden]; {s} Calculate (0,0,' ','A1+@sgn_@abs_1-@sqrtA+2*A1+/')(r)[hidden]; {D} Dilation/MarkedRatio (B,C,s); |
{M} Dilation (A,B, 0.5)[hidden]; {G} Dilation (C,M, 0.3333333333333333); |
On peut ainsi construire directement les points remarquables d'un triangle par calcul, en coordonnées barycentriques.
{X} Dilation/3PtRatio (A,O,O,C,B); |
{A!} Dilation (A,O, -1)[hidden]; {M} Dilation (A!,B, 0.5)[hidden]; {K} Circle (M,A!)[hidden]; {Oy} Perpendicular (Ou,O)[hidden]; {X} Intersect1 (Oy,K); |
Une autre méthode :
Un cercle passant par A et B, centré en C quelconque sur la médiatrice de AB
OX est la tangente au cercle, intersection du cercle avec le cercle de diamètre OC.
{M} Dilation (A,B, 0.5)[hidden]; {My} Perpendicular (Ou,M)[hidden]; {C} Point on object (My,0)[hidden]; {K1} Circle (C,A)[hidden]; {N} Dilation (O,C,0.5)[hidden]; {K2} Circle (N,O)[hidden]; {X} Intersect2 (K1,K2); {OX} Segment (O,X); |
La construction suivante est par contre à éviter car elle impose b > a :
{M} Dilation (O,B, 0.5)[hidden]; {K} Circle (M,O)[hidden]; {Ay} Perpendicular (Ay,O)[hidden]; {X} Intersect1 (Ay,K); {OX} Segment (O,X); |
Ou encore encore de le construire par calcul direct x = OA √OB/OA :
{a} Distance (O,A,0,0,' ')[hidden]; {b} Distance (O,B,0,0,' ')[hidden]; {r} Calculate(0,0,' ','BA@sgn_@abs_!1+A+/@sqrt')(a,b)[hidden]; {X} Dilation/MarkedRatio (A,O,r); |
Ce calcul renvoie r = √OB/1 au lieu de ∞ si a = 0.
Par le A@sgn_@abs_!1+A+ qui vaut 1 si a = 0, et a sinon.
Le Dilation suivant de OA = 0 dans ce rapport r quelconque donne alors bien 0 car OA = 0.
Le @abs_ n'est pas vraiment nécessaire ici car a ≥ 0 comme Distance.
Homothétie de centre O transformant A en A* :
{AB*} Dilation/3PtRatio (AB,O,O,A,A*); {AC*} Dilation/3PtRatio (AC,O,O,A,A*); {BC*} Dilation/3PtRatio (BC,O,O,A,A*); {ABC*} Dilation/3PtRatio (ABC,O,O,A,A*); |
Similitude transformant AB en A*B* :
En composant avec une translation AB → A1B1, A1 = A*, de vecteur AA*,
la construction est simplifiée :
la similitude A1B1 → A*B* est de centre A1 = A*
La similitude AB → A*B* est alors la composition de la translation AA*,
de la rotation et de l'homothétie de centre A*.
{ definit l'angle et le rapport } {B1} VectorTranslation (B,A,A*)[hidden]; {B2} Rotation/MarkedAngle (B1,A*,B1,A*,B*)[hidden]; { transforme les éléments de la figure } {C1} VectorTranslation (C,A,A*)[hidden]; {C2} Rotation/MarkedAngle (C1,A*,B1,A*,B*)[hidden]; {C*} Dilation/3PtRatio (C2,A*,A*,B2,B*); {ABC1} VectorTranslation (ABC,A,A*)[hidden]; {ABC2} Rotation/MarkedAngle (ABC1,A*,B1,A*,B*)[hidden]; {ABC*} Dilation/3PtRatio (ABC2,A*,A*,B2,B*); |
Si de nombreux points sont à transformer, il peut être avantageux de déterminer d'abord le centre de la similitude, on évite ainsi la translation :
Les droites homologues AB et A*B* se coupent en P (sinon homothétie ou translation)
Les cercles circonscrits à AA*P et BB*P se recoupent en I centre de la similitude.
Le ratio est A*B*/AB, l'angle est AIA*
{ construit I } {ab} Line (A,B)[hidden]; {ab*} Line (A*,B*)[hidden]; {P} Intersect (ab,ab*)[hidden]; { cercle AA*P } {map} Dilation (A,P, 0.5)[hidden]; {medap} Perpendicular (ab,map)[hidden]; {map*} Dilation (A*,P, 0.5)[hidden]; {medap*} Perpendicular (ab*,map*)[hidden]; {Oa} Intersect (medap,medap*)[hidden]; { cercle BB*P } {mbp} Dilation (B,P, 0.5)[hidden]; {medbp} Perpendicular (ab,mbp)[hidden]; {mbp*} Dilation (B*,P, 0.5)[hidden]; {medbp*} Perpendicular (ab*,mbp*)[hidden]; {Ob} Intersect (medbp,medbp*)[hidden]; { seconde intersection des cercles pas tracés } {oo} Line (Oa,Ob)[hidden]; {I} Reflection (P,oo); { applique la similitude } {ABC1} Rotation/MarkedAngle (ABC,I,A,I,A*)[hidden]; {ABC*} Dilation/SegmentRatio (ABC1,I,A*B*,AB); ... |
{C1} VectorTranslation (C,A,A*)[hidden]; {C2} Rotation/MarkedAngle (C1,A*,B1,A*,B*)[hidden]; {C3} Dilation/3PtRatio (C2,A*,A*,B2,B*)[hidden]; {C*} Reflection (C3,A*B*); {ABC1} VectorTranslation (ABC,A,A*)[hidden]; {ABC2} Rotation/MarkedAngle (ABC1,A*,B1,A*,B*)[hidden]; {ABC3} Dilation/3PtRatio (ABC2,A*,A*,B2,B*)[hidden]; {ABC*} Reflection (ABC3,A*B*); ... |
{ mediatrice de AA' si A!=A', droite quelconque si A=A' } {I} Dilation (A,A!, 0.5)[hidden]; {I1} Rotation (A,I, 1.57079632679489662)[hidden]; {d} Distance (A,A!,0,0,' ')[hidden]; {dd} Calculate (0,0,' ','1A@sgn_@abs_-100*')(d)[hidden]; {I2} Translation/FixedAngle/MarkedDistance (rI1,dd, 0)[hidden]; {med} Line (I,rI2); { deuxième axe = bisectrice de B1A'B' } {B1} Reflection (B,med)[hidden]; {Ib} Dilation (B!,B1, 0.5)[hidden]; {bis} Line (A!,Ib); { point courant M } {M1} Reflection (M,med)[hiddenw]; {M!} Reflection (M1,bis); |
Lorsque les deux axes se coupent en O, c'est une rotation de centre O, sinon une translation (voire l'identité).
La construction "classique" détermine l'intersection de (d) avec AM : point fixe I de la droite AM,
donc sur la droite A'M'
M' est ainsi l'intersection de A'I avec la parallèle à AA' en M (direction de l'affinité).
Cette construction a l'énorme inconvénient de ne pas fonctionner si M est
sur la droite AA' ou sur la parallèle à (d) en A.
On préfèrera la construction suivante qui fonctionne à tout coup :
{aa} Line (A,A!)[hidden]; {H} Intersect (aa,d)[hidden]; {mm} Parallel (aa,M)[hidden]; {K} Intersect (mm,d)[hidden]; {M!} Dilation/3PtRatio (M,K,H,A,A!); |
Si AA' est parallèle à (d), bien sûr il ne s'agit pas d'une affinité mais d'une transvection :
Là aussi, on évitera la construction "classique" comme intersection de la parallèle à (d) en M et de
la droite A'I, I étant l'intersection de (d) et AM.
Cette construction échoue si M est sur la droite AA' : On préfèrera la méthode suivante :
{ah} Perpendicular (dd,A)[hidden]; {H} Intersect (ah,dd)[hidden]; {mm} Parallel (dd,M)[hidden]; {K} Intersect (ah,mm)[hidden]; {M1} VectorTranslation (A!,A,M)[hidden]; {M!} Dilation/3PtRatio (M1,M,H,A,K)[label('M'''),red]; |