Professional Documents
Culture Documents
PRZYKADOWY ROZDZIA
SPIS TRECI
KATALOG KSIEK
KATALOG ONLINE
ZAMW DRUKOWANY KATALOG
TWJ KOSZYK
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
ZAMW INFORMACJE
O NOWOCIACH
ZAMW CENNIK
CZYTELNIA
FRAGMENTY KSIEK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
C++ Builder.
20 efektownych programw
Autor: Andrzej Stasiewicz
ISBN: 83-7197-656-9
Nonik: CD
Liczba stron: 224
Rozdzia 2.
STAE:
ZMIENNE:
!"
#$!%"
#$
!%"
#$
&!!"
#$!%"
#$
&!%"
#$
' (
)
Rysunek 6. Babcia wbia w wirtualn desk 1000 gwodzikw i rozpia midzy nimi 500 czarnych nici.
Pozycje gwodzikw nie s przypadkowe dostarcza je niezbyt zoona kombinacja funkcji
trygonometrycznych.
W okienku edytora, ktre na pocztek jest ukryte pod okienkiem z form, od razu doklejmy nagwek moduu z algorytmami matematycznymi. Oto fragment kodu, ktry
powinnimy najpierw zlokalizowa w grnej czci pliku CPP, potem uzupeni
o fraz doklejania nagwka:
##&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
*
%'+,)-.%'$/0
*1 2342/, "1
*
%'+,)5
%
$/5
$$$
Grafik oczywicie umiecimy w uzgodnionej z systemem operacyjnym funkcji reakcji na zdarzenie OnPaint chc rysowa. Tylko wtedy nasz program automatycznie
odnowi swoj grafik, gdy jego okienko nagle wyoni si spod Worda czy Excela.
Odszukajmy wic Inspektora obiektw, przejdmy na jego zakadk Events zdarzenia i dwukrotnym klikniciem wygenerujmy funkcj reakcj na zdarzenie
OnPaint. Gdy Builder wykreuje puste ciao tej funkcji, niezwocznie spiszmy jej algorytm, przekadajc wczeniejsze, oglne frazy na dialekt C++ Buider:
Jest to w zasadzie ten sam algorytm, ale wypowiedziany w innym jzyku i osadzony
w konkretnym okienku. Zmienne R, A i B maj znaczenie czysto techniczne R rozciga grafik, A i B j pozycjonuje w okienku Windows. Parametry ClientWidth i ClientHeight zadaj rozpito graficznej powierzchni okienka. Zauwamy te, e u Borlanda
nie ma czteroargumentowej funkcji Line(), za to jest para funkcji MoveTo() id do
punktu i LineTo() cignij stamtd lini. Ta para funkcji z powodzeniem zastpuje
klasyczn funkcj Line().
Pora na wskazanie kilku moliwoci modyfikacji algorytmu. Przede wszystkim
wmy troch koloru w grafik rozpinanej nici. Mam taki pomys:
!! "
#$% &'
6
,+7')8
'
)9
,/#
'
)9
,/#
8'
):)
3/#
&> -> <> #
6
!"
!%"
!%"
&!"
!%"
&!%"
()*" )*( /
0+"123. !4
()*+
,-,.
()*
,-,.
!"
!%"!"
&!"
&!%"!"
Co si tutaj zmienio? Algorytm jest dwa razy duszy w kadym obiegu ptli krelimy nie jedn, a dwie linie. Sama ptla przebiega od wartoci 3.14 do +3.14 (symbol M_PI to zdefiniowana w pliku nagwkowym math.h liczba pi) ze skokiem rwnym pi/200. Dlaczego taki zakres ptli? Nie wiadomo prosz sprbowa rozegra to
inaczej. Na tym midzy innym polega wielka sztuka trzeba co zrobi po swojemu.
Przed wykreleniem kadej z dwch linii pojawia si fraza dobierania koloru. Za kolor linii w aparacie Canvas (ptno malarskie) odpowiada obiekt Pen (piro), ktry
z kolei ma zmienn Color. Kolor ustala bardzo sprytna i chtnie wykorzystywana instrukcja warunkowego przypisania:
$$$
2.2"&0>)&0'
0+"123. !4
$$$
2.2"&0>)&0' %'),
$$$
Rysunek 8. Nasza babcia artystka w swoj grafik zacza wplata kolorowe nici. Tu powoli
koczy si analogia z realem (tak znajomi nazywaj ten wiat za oknem...). Nie ma kompletu nici
o barwach tosamych i rwnie bogatych, co kolorystyka funkcji RGB().
!! "
#$% &'
6
,+7')8
7$
'
)9
,/#
'
)9
,/#
8'
):)
3/#
&> -> <> #
6
!"
!%"
&!"
/)
7/)
$/)
2.2"&0>)&0'
( 48.
7$
2.2"&0.)
<<8
2.2"&0
)
<<8
=
=
Zadania i problemy
1. Staa M_PI jest zadeklarowana i zainicjowana w pliku math.h. Sprbuj
Rozwizania
1. W katalogu, w ktrym jest zainstalowany Builder, prawdopodobnie (podczas
Rozdzia 12.
W poprzednich rozdziaach poznalimy system dobierania koloru do wykrelania jakiego obiektu graficznego. Centralne znaczenie ma tam funkcja RGB(), sterujca
nateniem trzech niezalenych barw kineskopowych:
?' 48.
999999
$$$
10
Napiszemy nowy obiekt o nazwie TWidmo. Obiekt TWidmo bdzie dostarcza barw
spektraln (czyst). Wystarczy poda dugo fali wiata byle z zakresu widzialnego a obiekt TWidmo wytworzy odpowiedni barw. Czy barwa ta bdzie rzeczywicie czysta? Jasne, e nie. Wszak nasze kineskopy maj tylko trzy barwne
dziaka elektronowe. Barwa nie bdzie czysta, ale uzyskiwane wraenie tak.
Najwaniejszym elementem obiektu TWidmo bdzie publiczna funkcja o nastpujcym prototypie (nagwku):
Rysunek 51. Zastanwmy si przez chwil, co ley u rde naszych kopotw z tcz. Nasze oczy
postrzegaj fale elektromagnetyczne z zakresu od 0.4 do 0.65 mikrometra. Dziki zrnicowanej budowie
receptorw potrafi te rozrnia dugoci fal z powyszego zakresu rnice te postrzegamy jako barw
(ale zauwamy, e oczy atwo daj si oszuka istnieje np. czysta ziele spektralna (0.5 mikrometra)
i taka sama co do koloru mieszanina wiata niebieskiego i tego). To, e poszczeglnym dugociom fal
elektromagnetycznych odpowiadaj takie, a nie inne kolory, jest ju spraw naszych mzgw i zawartych
tam algorytmw interpretujcych elektryczne bodce pochodzce z oka. Jest nawet prawdopodobne, e
kady czowiek inaczej widzi kolory. Co jest czerwone, a co niebieskie, uzgodnilimy wiele lat temu tylko
i wycznie drog ustnej wymiany pogldw na ten temat. Tymczasem komputery dysponuj trzema drutami
prowadzcymi do monitora. Biegn po nich trzy amplitudy kolorw, z ktrych da si zbudowa kad
barw, albo lepiej ktrymi da si oszuka kady mzg, tak by myla, e widzi pen palet. Te kolory
to: czerwony, niebieski i zielony. Taka triada nazywa si barwami dopeniajcymi. Moglibymy nazwa je
te barwami bazowymi. Wystarczy wzi lup i spojrze na trjkolorow struktur pojedynczego punktu
ekranu, by dowiadczalnie zweryfikowa te sowa. Jeli chodzi o kolory, to jestemy brutalnie oszukiwani.
10
11
Powysza klasa zapowiada dwie funkcje publiczne jak zwykle oczekiwanego konstruktora i rwnie oczekiwanej funkcji konwertujcej fizyczn dugo fali na borlandowski kolor. Konstruktor nie ma parametrw to si zdarza w sytuacjach, w ktrych nie ma nic do zainicjowania. Bezparametrowy konstruktor nie jest czym
niezwykym. Ale w tym zagadnieniu konstruktor, cho bezparametrowy, bdzie musia wykona niezwykle istotn cz pracy bdzie musia zainicjowa tablic
tecza[][], gdzie umiecimy definicje 15 kluczowych barw tczy.
Publiczne parametry LAMBDA_MIN i LAMBDA_MAX to prezent dla uytkownikw
naszej klasy. Parametry te opisuj fizyczne granice widzialnej czci widma fal elektromagnetycznych. Zostay upublicznione, bo moe komu si przydadz.
Takiej deklaracji naleao si spodziewa. Zobaczmy zatem, jak zrealizowano szczegy implementacyjne obiektu TWidmo, czyli zajrzyjmy do pliku CPP:
*
%'+,)-.%'$/0
*1 2342/, "1
*
%'+,)5A
,4$/5
-% ##, % + !
5!!5
6
'%C"?' ;
#
8( $F;&G
#
8($H&G
#
"?2',+7')
'%C"?' (&8(
8"?2'&"?2'!8(
"?2'I$#$
%
#%
)%C2DEDEF)%C2DEDEH)%C2DEDEI
)%C2DEDEI)%C2DEDE)%C2DEDE;
)%C2DEDEIH)%C2DEDE;)%C2DEDEGF
)%C2DFEDEF)%C2DFEDEF)%C2DFEDEGF
11
12
%#
@2""%0
@2""%
@2""%-
@2""%
@2""?2'!@2""%
$%
%
%
#%
Konstruktor, jak to czyni wszystkie konstruktory, inicjuje wewntrzne (czyli prywatne) zmienne obiektu. Najwaniejsze jest zainicjowanie tablicy tecza[][], zawierajcej definicje 15 kluczowych kolorw tczy.
Ciekawsze rzeczy dziej si w funkcji transformujcej fizyczn dugo fali wiata
i jego jasno w kolor.
12
13
Rysunek 52. Spektralnie czyst tcz, gdzie kady kolor ma cile okrelon dugo fali, udajemy
odpowiednio dobranymi mieszankami barw czerwonej, zielonej i niebieskiej. Jak dobra amplitudy tych
trzech barw w kadym punkcie tczy? Jak skonstruowa umieszczon w konstruktorze TWidmo() tabel
definiujc rozkad tczy na barwy bazowe? Trzeba zawoa kilkoro dzieci i posadzi je przed jakim
programem typu Paint czy Corel. S tam narzdzia, ktre pozwalaj na budow wasnego koloru, przy
okazji pokazujc zawarto sygnaw RGB. Dzieci doskonale wiedz, jak powinien wyglda spektralny
kolor pomaraczowy czy fioletowy. Nam pozostaje wynotowa amplitudy R, G i B, skadajce si na takie
specjalne kolory. Amplitudy te wbudowujemy do tabeli tecza[][].
Widoczny tutaj wykres, w istocie skonstruowany dowiadczalnie, pokazuje jak prawd o fizjologii
widzenia barw. Tcz na dolnej osi wykrelono algorytmem opisanym w tekcie.
Idea algorytmu jest taka: mamy jak dugo fali wiata lambda i szukamy trjki
liczb R, G, B, ktre po wymieszaniu dadz wraenie wiata o dugoci fali lambda.
Wchodzimy z wartoci tej dugoci fali do tablicy tecza[ ][ ] i szukamy najbliszej
jej trjki amplitud R, G, B. Jeli najbliszej nie ma, aproksymujemy amplitudy pomidzy dwiema ssiednimi trjkami. Wyliczamy przyblione wartoci R, G i B. Jeli
potrzebny nam kolor pomidzy pomaraczowo-czerwonym a czerwonym, bierzemy
wartoci amplitud R, G, B gdzie spomidzy obu tych trjek.
Wspczynniki Askal i Bskal maj tak dobrane wartoci, by fraza:
1 2A,C
A?' "?2'!<8"?2'
Funkcja lambda_to_kolor() wykorzystuje wartoci wczeniej zainicjowanych wspczynnikw i nie traci ju czasu na nic, poza przeliczeniem rzeczywistej wartoci dugoci fali w naturalne wartoci amplitud barw skadowych i zebranie tych skadowych
do ostatecznego koloru.
13
14
Najpierw nastpuje kontrola, czy podana dugo fali wypada gdzie w widzialnym
skrawku nieskoczonego widma fal elektromagnetycznych. Jeli dugo fali nie mieci si w zakresie widzialnym, zwracanym kolorem jest czer nic nie wida.
Potem kontrolujemy, czy jaskrawo mieci si w przyzwoitym zakresie procentowym i wyliczamy pomocniczy wspczynnik o nazwie jasn. Wreszcie obliczamy wejcie do tablicy kolorw tecza[ ][ ]:
$$$
1 2A,C
A?' "?2'!<8"?2'
!0!23
1
) A"C?'
1 2A,C
A?'
,#
!0
+'24)?, +3
)31 2A,C
A?' &1
) A"C?'
!'!23
$$$
14
15
Ten program wymaga doczenia do projektu plikw moduw skala i widmo pamitajmy zatem o wstpnych operacjach Add File to Project dodaj pliki do programu. Nie zapomnijmy o doklejeniu dwch nagwkw, ktre zapowiedz kompilatorowi, co oznaczaj napisy TSkalowanie i TWidmo.
W funkcji reakcji na OnPaint najpierw parametryzujemy obszar okienka przeznaczony pod grafik, ot taki rodzaj porzdku. Potem deklarujemy zmienn typu
TWidmo jest to oczywicie zmienna obiektowa, zoona. Najwaniejsze jest utworzenie zmiennej typu TSkalowanie w jej konstruktorze mamy precyzyjne opisanie
teatru ekranowego i fizycznego. Teatr ekranowy nie wymaga specjalnych komentarzy
jest to okienko o miych oku rozmiarach i pooeniu. Teatr rzeczywisty natomiast
zawiera si midzy LAMBDA_MIN i LAMBDA_MAX w poziomie oraz midzy wartoci 0 i 100 w pionie. W poziomie odoymy wszystkie moliwe dugoci wiata widzialnego, w pionie wszystkie moliwe jaskrawoci wiata.
Potem mamy popis moliwoci obiektu skalujcego. Dwie ptle przebiegaj punkt po
punkcie cay obszar okienkowy, ale nastpuje transformacja wsprzdnych kadego
punktu ekranowego do dugoci fali i do jaskrawoci. Parametry te su do wyliczenia barwy, czyli do przetestowania poprawnoci dziaania obiektu TWidmo.
15
16
Zadania i problemy
1. Obiekt TWidmo nie nadaje si do pracy z grafik 256-kolorow (bo w tym
Odpowiedzi
1. Naley zaimplementowa rozmywanie zarwno jaskrawoci, jak i dugoci
16