{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]; |