momente şi schiţe de informatică şi matematică
anti point—and—click

Construcţii prin asemănare (în MetaPost)

MetaPost
2019 mar

Amintim că produsul $z_1z_2$ a două numere complexe are ca modul $|z_1||z_2|$ (produsul modulelor factorilor) şi ca argument ${\rm{arg}}\,z_1+{\rm{arg}}\,z_2$ (suma argumentelor factorilor). În particular, $iz$ (înmulţirea cu $i$) revine la rotirea punctului (de afix) $z$ în jurul originii, în sens antiorar, cu unghiul ${\rm{arg}}(i)=\pi/2$; deci punctele $z$, $iz$ şi $\small\mathsf{O}(0,0)$ formează un triunghi dreptunghic isoscel - încât am putea spune că valoarea ${i}$ caracterizează triunghiurile dreptunghice isoscele: raportul catetelor este 1 (=$|i|$), iar unghiul $\pi/2$ al catetelor este dat de ${\rm{arg}}(i)$.

Un pătrat împreună cu diagonalele sale evidenţiază 8 triunghiuri dreptunghice isoscele. Dacă referim planul complex la centrul $\small C(0,0)$ al pătratului, atunci vârfurile consecutive în sens antiorar ale acestuia se obţin plecând de la afixul $z$ al unui vârf fixat şi înmulţindu-l la fiecare pas cu $i$ (dacă $A(z)$, atunci $B(iz)$, $D(i^2z)$ şi $E(i^3z)$).
Observăm că avem câte trei triunghiuri dreptunghice isoscele (deci, asemenea între ele) care au în comun o aceeaşi latură a pătratului; de exemplu, pe latura $\small AB$ avem $\small \Delta ABC \sim \Delta BEA \sim \Delta DAB$ (vârfurile sunt notate totdeauna în sens antiorar şi ţinând seama de egalităţile de unghiuri corespondente).
Dacă "deformăm" figura, considerând un patrulater oarecare $\small ABDE$ şi păstrând asemănarea cu un triunghi dat a triunghiurilor formate pe latura $\small AB$ - atunci, va rămâne asemenea triunghiului dat şi $\small \Delta DEC$ (format de vârfurile opuse laturii comune)?

Triunghiurile construite pe latura comună $\small AB$ (conturate pe imaginea redată mai sus respectiv cu negru, orange şi albastru) sunt asemenea unui triunghi $\small \mathsf{XYZ}$ dat; atunci… avem şi asemănarea $\small \Delta DEC \sim \Delta \mathsf{XYZ}$.

Să observăm că $\small BD$ şi $\small AE$ sunt egal înclinate faţă de $\small AB$ şi la fel sunt $\small BC$ şi $\small AD$; deci dacă $\small C_1$ şi $\small C_2$ sunt intersecţiile mediatoarei segmentului $\small AB$ cu $\small BC$ şi respectiv cu $\small AC$, atunci obţinem $\small D$ şi $\small E$ intersectând $\small AC_1$ şi $\small BC_2$ cu dreapta prin $\small B$ şi respectiv prin $\small A$ care face cu $\small AB$ un unghi egal cu unghiul $\small C$ din $\small \Delta ABC$. Deci o construcţie "interactivă" (cu creionul, rigla şi compasul sau, de exemplu cu GeoGebra) a figurii - presupunând dat $\small \Delta ABC$ - se poate face astfel: construim mediatoarea lui $\small AB$ şi marcăm intersecţiile $\small C_1$ şi $\small C_2$ (cu $\small BC$ şi $\small AC$); măsurăm unghiul din $\small C$ şi trasăm dreptele prin $\small B$ şi $\small A$ înclinate cu acest unghi faţă de $\small AB$; apoi marcăm intersecţiile acestor drepte cu $\small AC_1$ şi respectiv $\small BC_2$ (găsind $\small D$ şi $\small E$).

Toate triunghiurile care sunt asemenea între ele au o aceeaşi 'formă' (la fel cum figurile "d" şi "p" au aceeaşi formă - obţinându-se una din alta prin rotaţie, scalare şi translaţie). Forma triunghiului $uvw$ (caracterizând toate triunghiurile asemenea lui) poate fi exprimată prin numărul complex $\dfrac{u-w}{u-v}$: modulul acestuia ne dă raportul laturilor $\vec{uw}$ şi $\vec{uv}$, iar argumentul lui ne dă unghiul format de aceste laturi (astfel că "forma" $\frac{u-w}{u-v}$ reflectă condiţia de asemănare a triunghiurilor: să se păstreze raportul a două laturi, împreună cu unghiul acestora). De exemplu, regăsim "caracteristica" $i$ pe care o vizasem direct, la început: triunghiurile dreptunghice isoscele (şi la fel orientate) au forma $\frac{0-i}{0-1}=i$ (am luat $\Delta uvw$ cu $u=0$, $v=1$ şi $w=i$).

Forma triunghiurilor a fost introdusă de J. A. Lester (1996) "Triangles I: Shapes", Aequationes Mathematicae 52 (unde am găsit şi problema pe care o tratăm aici).

Notând cu $\lambda$ forma triunghiului dat $\small \mathsf{XYZ}$ (şi cu litere mici omonime, afixele vârfurilor), pentru cele trei triunghiuri asemenea acestuia ridicate pe latura comună $\small AB$ (v. figura de mai sus), avem: $$\frac{a-c}{a-b}=\frac{b-a}{b-e}=\frac{d-b}{d-a}=\lambda$$

Rezultă că $c=a-\lambda(a-b)$, $e=b+(a-b)/\lambda$ şi $d=(b-\lambda a)/(1-\lambda)$; acum putem calcula "caracteristica" triunghiului $\small \Delta DEC$ şi obţinem $\frac{d-c}{d-e}=\lambda$, însemnând că avem într-adevăr, $\small \Delta DEC \sim \Delta \mathsf{XYZ}$ (au aceeaşi formă).

Am obţinut figura de mai sus folosind MetaPost, ca şi în [1] (desigur, mai potrivit ar fi R, în care putem lucra comod cu numere complexe şi este uşor de modelat transformările geometrice de care ar fi nevoie, având asigurată în plus o precizie de calcul "mai bună").
Se poate observa întâi, că am marcat unghiurile prin anumite arce de cerc (proporţionând cumva raza după mărimea unghiului); în acest scop am introdus următoarele definiţii:

vardef acosd primary x = angle (x, 1 +-+ x) enddef;

def markang(expr A, O, B) = 
    save m;
    m = acosd (((A-O) dotprod (B-O)) / (abs(A-O)*abs(B-O)));  % show(m);
    draw subpath(0, m/45) of fullcircle 
                          scaled ((180-m)/120*u) 
                          rotated (angle(B-O)) 
                          shifted O 
         withcolor 0.5white;
enddef;

def marktriang(expr A, B, C) =
    markang(A, B, C);
    markang(B, C, A);
    markang(C, A, B);
enddef;

angle(x,y)(în grade, nu radiani) unghiul vectorului de poziţie a punctului indicat; "+-+" este operatorul definit prin $\small a$ +-+ $\small b\equiv\sqrt{a^2-b^2}$. Deci acosd(x) definit mai sus determină (pentru $\rm|x|\le 1$) valoarea $\small \rm{arctg}\,\frac{\sqrt{1-x^2}}{x}=\rm{arccos}\,x$ (în grade). Calculele comportă desigur o anumită aproximare; de exemplu, folosind show(acosd(-0.5)) obţinem 119.99992 (în loc de valoarea exactă de 120 grade).

Cosinusul unghiului a doi vectori este dat de raportul dintre produsul scalar (care se obţine prin dotprod) şi produsul lungimilor acestora; în markang() am folosit acosd pentru a determina unghiul $\small\measuredangle{AOB}$ (=$\small\rm arccos\,\frac{\vec{OA}\cdot\vec{OB}}{|\vec{OA}|\,|\vec{OB}|}$) şi am considerat (prin subpath) arcul cercului unitate corespunzător acestui unghi; am scalat cumva acest arc după mărimea unghiului, l-am rotit în jurul originii încât raza iniţială să treacă prin $\small B$ şi în final, am translatat arcul încât să aibă centrul în vârful unghiului care trebuie marcat. Apoi, marktriang() expandează markang() pentru a marca fiecare dintre unghiurile unui triunghi dat.

Considerăm un triunghi $\small \mathsf{XYZ}$ şi deocamdată, să testăm folosirea definiţiilor de mai sus, înfiinţând temporar o figură (cu numărul 95 să zicem):

vardef XYZ =
    (1, 2)*u -- (5, 4)*u -- (3, 4.75)*u -- cycle
enddef;

beginfig(95);
    save u, p, v; u = 1cm;
    path p;  p = XYZ;
    pair v[]; 
    for i=0,1,2:
        v[i] = point i of p;
    endfor;
    draw p withpen pencircle scaled 0.8;
    marktriang (v0, v1, v2);
    label.lft(btex $X$ etex scaled 0.7, v0);
    label.rt(btex $Y$ etex scaled 0.7, v1);
    label.top(btex $Z$ etex scaled 0.7, v2);
    currentpicture := currentpicture scaled 2;
endfig;

Urmează o descriere (liniară, deci lungă) a construcţiei triunghiurilor asemenea lui $\small \mathsf{XYZ}$ care au o latură comună dată: se defineşte pentru fiecare caz o variabilă de tip transform (ca în [1]) care să mapeze câte o latură din $\small \Delta \mathsf{XYZ}$ pe latura comună indicată şi se determină imaginea vârfului rămas; se trasează contururile rezultate şi în final, se marchează şi se etichetează elementele figurii:

def similar(expr a, b) = 
    save v, w, p;
    transform T[]; pair v[], w[]; path p[];
    for i=0,1,2:
        v[i] = point i of XYZ;
    endfor;
    for i=0,1,2:  % condiţiile pentru "asemănare" (v. [1])
        xxpart T[i] = yypart T[i];
        xypart T[i] = - yxpart T[i];
    endfor;
    v0 transformed T0 = a;
    v1 transformed T0 = b;
    w0 = v2 transformed T0;
    p0 = a -- b -- w0 -- cycle;
    v1 transformed T1 = a;
    v2 transformed T1 = b;
    w1 = v0 transformed T1;
    p1 = w1 -- a -- b -- cycle;
    v2 transformed T2 = a;
    v0 transformed T2 = b;
    w2 = v1 transformed T2;
    p2 = b -- w2 -- a -- cycle;
    p3 = w1 -- w2 -- w0 -- cycle;
    drawoptions (withpen pencircle scaled 0.8);
    draw p0 withcolor .5black;
    draw p1 withcolor orange;
    draw p2 withcolor blue;
    draw p3 withpen pencircle scaled 0.4 dashed evenly;
    drawoptions(withpen pencircle scaled 2.5pt);
    drawdot w0 withcolor .5black;  % marchează vârfurile opuse laturii comune
    drawdot w1 withcolor orange;
    drawdot w2 withcolor blue;
    drawoptions (withpen pencircle scaled 0.4);
    for i=0,1,2:  % marchează unghiurile corespondente ale triunghiurilor
        marktriang (point 0 of p[i], point 1 of p[i], point 2 of p[i]);
    endfor;
    drawoptions(withpen pencircle scaled 1);
    for i=0 step 3 until 2:  % sugerează "latura comună" a trei triunghiuri
        draw (i/3)[a, b] -- ((i+1)/3)[a, b] withcolor 0.5black;
        draw ((i+1)/3)[a, b] -- ((i+2)/3)[a, b] withcolor orange;
        draw ((i+2)/3)[a, b] -- ((i+3)/3)[a, b] withcolor blue;
    endfor;
    label.lft(btex $A$ etex scaled 0.6, a);
    label.rt(btex $B$ etex scaled 0.6, b);
    label.rt(btex $C$ etex scaled 0.6, w0);
    label.rt(btex $D$ etex scaled 0.6, w1);
    label.lft(btex $E$ etex scaled 0.6, w2);
enddef;

Rămâne să definim o figură în care să folosim similar():

beginfig(1);
    save u, a, b; u = 1cm;
    pair a[]; a0 = origin*u; a1 = 2.5u*right;
    similar(a0, a1);
    currentpicture := currentpicture scaled 2.6;
endfig;

Învocând compilatorul de MetaPost (prin mpost -tex=latex 1demo.mp; v. [1]), obţinem fişierul "1demo-1.png" redat de două ori (ca imagine) mai sus.

vezi Cărţile mele (de programare)

docerpro | Prev | Next