GDI
Wersja A
Zbiór Mandelbrota
- Wzór programu
- Cechy okna:
- czarny kolor tła
- możliwa zmiana rozmiaru
- Zbiór Mandelbrota:
- kolor czerwony, intensywnosc zalezna od wartosci
- pokazywany przedział wartości:
- domyślnie: x od -2.5 do 1.5, y od -1.5 do 1.5
- zaznaczanie obszaru lewym przyciskiem myszy - zwężenie
- naciśnięcie prawego przycisku myszy - rozszerzenie
- wartości skrajne wypisane w lewym górnym i prawym dolnym rogu
- klawisz F2 - przywrócenie domyślnych wartości
- zmiana liczby iteracji: klawisze '+' i '-'
- Wskazówki:
- wielkosc obszaru klienta okna: GetClientRect()
- ustawianie piksela: SetPixel(), RGB()
- rysowanie tekstu: SetBkMode(), SetTextColor(), TextOut(), SetTextAlign()
- przechwytywanie myszy poza obszarem klienta: SetCapture(), ReleaseCapture()
- rysowanie prostokąta zaznaczenia: GetDC(), ReleaseDC(), SetROP2(), SelectObject(), GetStockObject()
- ustawić tryb R2_XORPEN używając SetROP2()
- drugie narysowanie tej samej figury (np. ramki prostokąta) usunie ją
- wszystkie stworzone obiekty GDI muszą być zniszczone, nie można niszczyć obiektów, które są wybrane jako aktualne na DC
#define FIXSIZE 25
#define mul(a,b) ((((long long)a)*(b)) >> FIXSIZE)
#define fixpt(a) ((long)(((a)*(1 << FIXSIZE))))
#define integer(a) (((a)+(1 << (FIXSIZE-1))) >> FIXSIZE)
long x0,y0,p,q,xn;
int i;
xs=(xmax-xmin)/rc.right;
ys=(ymax-ymin)/rc.bottom;
unsigned v = 0;
COLORREF color = 0;
for ( int x = 0; x < rc.right; x++ ) {
for ( int y = 0; y < rc.bottom; y++ ) {
if ( x >= rcUpdate.left && x <= rcUpdate.right &&
y >= rcUpdate.top && y <= rcUpdate.bottom ) {
p=fixpt(xmin+x*xs);
q=fixpt(ymin+y*ys);
xn=0;
x0=0;
y0=0;
i=0;
while ((mul(xn,xn)+mul(y0,y0)) < fixpt(4) && ++i < maxIterations) {
xn=(long)mul((x0+y0),(x0-y0)) +p;
y0=(long)mul(fixpt(2),mul(x0,y0)) +q;
x0=xn;
}
if (i==maxIterations) {
i=1;
}
color = RGB(( i * 256 + maxIterations/2 ) / maxIterations, 0, 0 );
SetPixel( hdc, x, y, color );
}
}
}
- Przybliżona punktacja:
- rysowanie zbioru Mandelbrota: 1.5
- zmiana przedziału wartości: 2.0
- zmiana liczby iteracji: 1.0
- zaznaczanie obszaru przeciągając lewym przyciskiem myszy: 3.5
- wypisywanie skrajnych wartości pokazywanego przedziału: 1.5
- czarny kolor tła okna: 0.5