Skalowanie
Janusz Sobieraj - 28 LO

Skalowanie rysunku narzędziami klasy lo28

W klasie lo28 przyjęto skalę "1:1" tzn jednostka=20 piksli ekranowych. Nie przewiduję bezpośrednio wbudowanego mechanizmu skalującego wykonywany rysunek.
Powiększanie / zmniejszanie zrealizujemy jednak bez trudu. Wystarczy zdefiniować aktualne potrzeby.

Zacznijmy od sytuacji prostej. Niekiedy wystarcza zastosować jednokładność
Jk(0,0)(x,y)=(k·x,k·y) ( jednokładność o środku (0,0) i skali k).
Np rysując atraktory : Henona lub atraktor Wallpaper powiększenie realizujmy rysując punkt atraktora : lo28.punkt(g,lo28.p2d(sk*w.x,sk*w.y));

Załóżmy teraz, że prostokątny obszar wyznaczony przez przekątną diagonalną CD (łacznie z zawartością) chcemy powiększyć tak, by zajmował całą powierzchnię apletu o przekątnej diagonalnej AB.
Niech:
A(-lo28.max_x() , lo28.max_y());
B(lo28.max_x() , -lo28.max_y());
C(x_min , y_max);
D(x_max , y_min);

Nowy obszar (z przekątna CD) umieszczamy znowu na naszym aplecie, tak by zajął całą płaszczyznę. Aby uzyskać ten efekt wykonamy złożenie jednokładności z przesunięciem równoległym : Jk(0,0)T[-s.x,-s.y]
Oto procedura, która przygotuje odpowiednie zmienne:
void skaluj( )
{
    dl=x_max-x_min;
    sz=y_max-y_min;
    s.war(x_min+dl/2,y_min+sz/2);
    kx=2.0*lo28.max_x( )/dl;
    ky=2.0*lo28.max_y( )/sz;
    dx=dl/(double)getWidth();
    dy=sz/(double)getHeight();
}


dl, sz - rzeczywiste wymiary powiększanego obszaru
s(x,y) - środek powiększanego obszaru
kx, ky - skala powiększenia (odpowiednio pozioma / pionowa)
dx, dy - dokładność nowego rysunku - zobacz zb.Mandelbrota

Operacje graficzne (np punkt p(x,y) ) adresujemy :

lo28.punkt(g,lo28.p2d(kx*(p.x-s.x),ky*(p.y-s.y)));

Opisany mechanizm powiększania zastosowałem rysując również figury Chladniego 2D oraz figury Chladniego 3D