c++-builder.-20-efektownych-programow full scan.pdf

(10185 KB) Pobierz
888541894.001.png
Rozdział 2.
Jest pod Białymstokiem artystka, która niegraficznymi technikami tworzy dziwne
grafiki. Wbija ta niemłoda ju babcia setki gwo dzików, a potem rozpina na nich ko-
lorowe nitki. Nie jest to jednak takie łatwe, jak mogłoby si$ wydawa% — artystce
z pewno'ci( naley si$ uznanie. Sił( tych obrazów jest ich matematyczna precyzja
— drobne niejednorodno'ci w prowadzeniu nici, nierównomierne odst$py nasze oczy
wychwytuj( natychmiast.
B$dziemy wbija% gwo dziki w wirtualn( desk$ wirtualnego obrazu. Wbi% gwo dzik
b$dzie znaczyło tyle, co wyliczy% jakim' algorytmem jego współrz$dne (x, y). Roz-
pi(% nitk$ mi$dzy dwoma gwo dzikami b$dzie znaczyło tyle, co poci(gn(% kolorow(
lini$ od jednego punktu do drugiego.
Algorytm rozpinania nici musi mie% jaki' taki kształt:
STAŁE:
ZMIENNE:
!"#$!%"#$
!%"#$
&!!"#$!%"#$
&!%"#$
' (
)
Po wst$pnych deklaracjach, ustaleniu liczby rozpinanych nici MAX_IL, wyliczamy
cztery współrz$dne dwóch gwo dzików, a potem rozpinamy lini$ — nitk$ mi$dzy
nimi. Zmienna R oraz cała ta pl(tanina funkcji trygonometrycznych to kaprys progra-
misty. Cała sztuka polega na dobraniu takich formuł na cztery współrz$dne ko0ców
linii, by zamkni$ta w p$tli cało'% złoyła si$ na mił( oku grafik$. Znów nie ma ad-
nych reguł, gwarantuj(cych sukces artystyczny. Nazwijmy to programowaniem eks-
perymentalnym...
C:\Andrzej\PDF\C++ Builder. 20 efektownych programów\skład!!.doc
3
888541894.002.png
4
C++ Builder. 20 efektownych programów
Spróbujmy zaimplementowa% nasz algorytm w dialekcie C++ Buildera. Jak zwykle,
zaczynamy od wydania polecenia New Application, po którym Builder oczyszcza
swoje wn$trze z dotychczasowych programów i jest gotów do pracy nad nowym za-
gadnieniem.
Rysunek 6. Babcia wbiła w wirtualn desk 1000 gwodzików i rozpiła midzy nimi 500 czarnych nici.
Pozycje gwodzików nie s przypadkowe — dostarcza je niezbyt zło$ona kombinacja funkcji
trygonometrycznych.
W okienku edytora, które na pocz(tek jest ukryte pod okienkiem z form(, od razu do-
klejmy nagłówek modułu z algorytmami matematycznymi. Oto fragment kodu, który
powinni'my najpierw zlokalizowa% w górnej cz$'ci pliku CPP, potem uzupełni%
o fraz$ doklejania nagłówka:
##&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
*%'+,)-.%'$/0
*1 2342/, "1
*%'+,)5%$/5
$$$
Grafik$ oczywi'cie umie'cimy w uzgodnionej z systemem operacyjnym funkcji — reak-
cji na zdarzenie OnPaint — chc$ rysowa%. Tylko wtedy nasz program automatycznie
odnowi swoj( grafik$, gdy jego okienko nagle wyłoni si$ spod Worda czy Excela.
Odszukajmy wi$c Inspektora obiektów, przejd my na jego zakładk$ Events — zda-
rzenia — i dwukrotnym klikni$ciem wygenerujmy funkcj$ — reakcj$ na zdarzenie
OnPaint. Gdy Builder wykreuje puste ciało tej funkcji, niezwłocznie spiszmy jej algo-
rytm, przekładaj(c wcze'niejsze, ogólne frazy na dialekt C++ Buider:
4
C:\Andrzej\PDF\C++ Builder. 20 efektownych programów\skład!!.doc
888541894.003.png
Rozdział 1.
Tytuł rozdziału
5
!! "#$%&'
6
,+7')8
')9,/#
')9,/#
8'):)3/#
-;<<
6
!"#$!%"#$
!%"#$
&!!"#$!%"#$
&!%"#$
()*+,-,.
()*,-,.
=
=
Jest to w zasadzie ten sam algorytm, ale wypowiedziany w innym j$zyku i osadzony
w konkretnym okienku. Zmienne R, A i B maj( znaczenie czysto techniczne — R rozci(-
ga grafik$, A i B j( pozycjonuje w okienku Windows. Parametry ClientWidth i Client-
Height zadaj( rozpi$to'% graficznej powierzchni okienka. Zauwamy te, e u Borlanda
nie ma czteroargumentowej funkcji Line(), za to jest para funkcji MoveTo() — id do
punktu i LineTo() — ci(gnij stamt(d lini$. Ta para funkcji z powodzeniem zast$puje
klasyczn( funkcj$ Line().
Pora na wskazanie kilku moliwo'ci modyfikacji algorytmu. Przede wszystkim
włómy troch$ koloru w grafik$ rozpinanej nici. Mam taki pomysł:
!! "#$%&'
6
,+7')8
')9,/#
')9,/#
8'):)3/#
&>-><>#
6
!"!%"
!%"
&!"!%"
&!%"
()*")*( /0+"123.!4
()*+,-,.
()*,-,.
!"
!%"!"
&!"
&!%"!"
C:\Andrzej\PDF\C++ Builder. 20 efektownych programów\skład!!.doc
5
6
C++ Builder. 20 efektownych programów
()*")*( /0+"1235!-6
()*+,-,.
()*,-,.
=
=
Rysunek 7. Czarne tło uzyskałem, opracowujc w Inspektorze obiektów wła)ciwo)* o nazwie Color.
Modyfikacja algorytmu wbijania gwodzików polega na innej organizacji ptli for() — teraz ptla nie
liczy linii, a przebiega jako) zakre)lon dziedzin, akceptowaln przez wykorzystane tutaj funkcje
trygonometryczne. Stała o nazwie M_PI (liczba pi) jest z du$ dokładno)ci zdefiniowana w doklejanym
nagłówku matematycznym math.h.
Co si$ tutaj zmieniło? Algorytm jest dwa razy dłuszy — w kadym obiegu p$tli kre-
'limy nie jedn(, a dwie linie. Sama p$tla przebiega od warto'ci –3.14 do +3.14 (sym-
bol M_PI to zdefiniowana w pliku nagłówkowym math.h liczba pi) ze skokiem rów-
nym pi/200. Dlaczego taki zakres p$tli? Nie wiadomo — prosz$ spróbowa% rozegra% to
inaczej. Na tym mi$dzy innym polega wielka sztuka — trzeba co' zrobi% po swojemu.
Przed wykre'leniem kadej z dwóch linii pojawia si$ fraza dobierania koloru. Za ko-
lor linii w aparacie Canvas (płótno malarskie) odpowiada obiekt Pen (pióro), który
z kolei ma zmienn( Color. Kolor ustala bardzo sprytna i ch$tnie wykorzystywana in-
strukcja warunkowego przypisania:
$$$
2.2"&0>)&0' 0+"123.!4
$$$
Dlaczego lubimy t$ instrukcj$? Bo daje si$ wbudowywa% bezpo'rednio w wyraenia.
Za pomoc( klasycznego warunku logicznego powysze zapisaliby'my np. tak:
$$$
0+"12
2.2"&0>)&0' %'8'+)
6
C:\Andrzej\PDF\C++ Builder. 20 efektownych programów\skład!!.doc
888541894.004.png
Zgłoś jeśli naruszono regulamin