You are on page 1of 16

IDZ DO

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

Ksika zawiera bardzo przystpne opisy niezwykle efektownych zjawisk z pogranicza


rnych nauk przyrodniczych oraz ich komputerowe realizacje w dialekcie C++ Builder
firmy Borland. Stanowi ona zbir wicze do wykorzystania na szkolnym kku
komputerowym, ale zapewne zainteresuje te wykadowcw i studentw kierunkw
przyrodniczych. Od Czytelnika wymagamy wiedzy na poziomie szkoy redniej,
a niekiedy zaledwie gimnazjum. Opi-sywane zagadnienia czsto s ledwie zarysowane
i pozostawiaj Czytelnikowi ogromne moliwoci dalszego, samodzielnego
eksperymentowania.
W realizacji pomysw Autor po mistrzowsku posuguje si najprostszym, a przy tym
w peni obiektowym i bardzo nowoczesnym sposobem programowania komputerw.

Notka wydawnicza .............................................................................5


Wstp ...............................................................................................7
Rozdzia 1. Dywany na ustalonej powierzchni........................................................9
Rozdzia 2. Grafika rozpinanej nici ......................................................................17
Rozdzia 3. Serwetka z cykloid...........................................................................23
Rozdzia 4. Skalowanie ......................................................................................31
Rozdzia 5. Skadanie drga poprzecznych ..........................................................43
Rozdzia 6. Sumowanie drga.............................................................................51
Rozdzia 7. Dywany iterowane............................................................................61
Rozdzia 8. Dywany afiniczne .............................................................................69
Rozdzia 9. Grafika ukadu wsprzdnych...........................................................87
Rozdzia 10. Konkurencja midzygatunkowa.........................................................97
Rozdzia 11. Przyszo nie do przewidzenia .......................................................111
Rozdzia 12. Algorytm barwy fizycznej ................................................................119
Rozdzia 13. Grafika wykadnikw Lapunowa ......................................................127
Rozdzia 14. Fraktal Mandelbrota.......................................................................137
Rozdzia 15. Eksplorator Mandelbrota ................................................................147
Rozdzia 16. Otwarty kosmos.............................................................................161
Rozdzia 17. Gra w ycie....................................................................................171
Rozdzia 18. Epidemia .......................................................................................185
Rozdzia 19. Mrowisko pene automatw............................................................201
Rozdzia 20. Jednowymiarowy automat komrkowy ............................................215

Rozdzia 2.

Jest pod Biaymstokiem artystka, ktra niegraficznymi technikami tworzy dziwne


grafiki. Wbija ta niemoda ju babcia setki gwodzikw, a potem rozpina na nich kolorowe nitki. Nie jest to jednak takie atwe, jak mogoby si wydawa artystce
z pewnoci naley si uznanie. Si tych obrazw jest ich matematyczna precyzja
drobne niejednorodnoci w prowadzeniu nici, nierwnomierne odstpy nasze oczy
wychwytuj natychmiast.
Bdziemy wbija gwodziki w wirtualn desk wirtualnego obrazu. Wbi gwodzik
bdzie znaczyo tyle, co wyliczy jakim algorytmem jego wsprzdne (x, y). Rozpi nitk midzy dwoma gwodzikami bdzie znaczyo tyle, co pocign kolorow
lini od jednego punktu do drugiego.
Algorytm rozpinania nici musi mie jaki taki ksztat:



STAE:

 

ZMIENNE:




   
!"   #$ !%"  #$ 
!%"  #$ 
&!!"   #$ !%"  #$ 
&!%"  #$ 
' (

   
)

Po wstpnych deklaracjach, ustaleniu liczby rozpinanych nici MAX_IL, wyliczamy


cztery wsprzdne dwch gwodzikw, a potem rozpinamy lini nitk midzy
nimi. Zmienna R oraz caa ta pltanina funkcji trygonometrycznych to kaprys programisty. Caa sztuka polega na dobraniu takich formu na cztery wsprzdne kocw
linii, by zamknita w ptli cao zoya si na mi oku grafik. Znw nie ma adnych regu, gwarantujcych sukces artystyczny. Nazwijmy to programowaniem eksperymentalnym...

C:\Andrzej\PDF\C++ Builder. 20 efektownych programw\skad!!.doc

C++ Builder. 20 efektownych programw

Sprbujmy zaimplementowa nasz algorytm w dialekcie C++ Buildera. Jak zwykle,


zaczynamy od wydania polecenia New Application, po ktrym Builder oczyszcza
swoje wntrze z dotychczasowych programw i jest gotw do pracy nad nowym zagadnieniem.

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:

C:\Andrzej\PDF\C++ Builder. 20 efektownych programw\skad!!.doc

Rozdzia 1. Tytu rozdziau

 !! "


#$% &' 
6
  
,+7')8
' )9 ,/#
' )9 ,/#
8' ):) 3/#
   -; <<
6
!"   #$ !%"  #$ 
!%"  #$ 
&!!"   #$ !%"  #$ 
&!%"  #$ 
()*+ 
,- ,.
()* 
,- ,.
=
=

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 
()*+ 
,- ,.
()* 
,- ,.
!"   
!%"  !"   
&!"   
&!%"  !"   

C:\Andrzej\PDF\C++ Builder. 20 efektownych programw\skad!!.doc

C++ Builder. 20 efektownych programw


()*" )*( /
0+"1235 !-6
()*+ 
,- ,.
()* 
,- ,.
=
=

Rysunek 7. Czarne to uzyskaem, opracowujc w Inspektorze obiektw waciwo o nazwie Color.


Modyfikacja algorytmu wbijania gwodzikw polega na innej organizacji ptli for() teraz ptla nie
liczy linii, a przebiega jako zakrelon dziedzin, akceptowaln przez wykorzystane tutaj funkcje
trygonometryczne. Staa o nazwie M_PI (liczba pi) jest z du dokadnoci zdefiniowana w doklejanym
nagwku matematycznym math.h.

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  
$$$

Dlaczego lubimy t instrukcj? Bo daje si wbudowywa bezporednio w wyraenia.


Za pomoc klasycznego warunku logicznego powysze zapisalibymy np. tak:
$$$

0+"12
2.2"&0>)&0' %'8'+)

C:\Andrzej\PDF\C++ Builder. 20 efektownych programw\skad!!.doc

Rozdzia 1. Tytu rozdziau


2.2"&0>)&0' %'),
$$$

co oczywicie te jest dobr, cho mniej profesjonaln, szko programowania.


Inny pomys to wprowadzenie linii barwionej nie kolorem dobranym arbitralnie,
a wyliczanym w smakowitej funkcji RGB(). Konieczne do wykonania modyfikacje s
naprawd proste:

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 
=
=

C:\Andrzej\PDF\C++ Builder. 20 efektownych programw\skad!!.doc

C++ Builder. 20 efektownych programw

Wyliczanie wsprzdnych pod gwodziki zawiera szczeglnie proste wyraenia. Nie


bdziemy tego omawia, bo jest to pole do popisu dla domowych programistw,
a w dodatku nie mam godnej polecenia recepty, co naleaoby tam wpisa.
W algorytmie pojawiy si trzy dodatkowe zmienne amplitudy trzech barw podstawowych. W powyszym programie kada z tych amplitud jest jak funkcj wsprzdnych gwodzikw. Nad sposobem wyliczania amplitud koloru, podobnie jak nad
sposobem znajdowania miejsc na gwodziki, niewtpliwie naley solidnie popracowa.

Zadania i problemy
1. Staa M_PI jest zadeklarowana i zainicjowana w pliku math.h. Sprbuj

odszuka ten plik w katalogu Buildera, otwrz go w edytorze, obejrzyj.


Tylko niczego tam nie popsuj!
2. Trzymamy si tutaj kurczowo funkcji trygonometrycznych, co jest uzasadnione

ich przewidywalnym przebiegiem, ale jeszcze s funkcje: log() (logarytm),


fabs() (warto bezwzgldna), exp() (funkcja wykadnicza), sqrt() (pierwiastek
kwadratowy). Czy uda Ci si co z tego tworzywa zbudowa?

Rozwizania
1. W katalogu, w ktrym jest zainstalowany Builder, prawdopodobnie (podczas

instalacji mona zmienia katalogi) znajduje si podkatalog o nazwie Include.


Jest tam plik math.h. Jego odpowiednik z algorytmami, prawdopodobnie
o nazwie math.cpp, nie jest w wersji rdowej udostpniany przez Borlanda
ot maj tam pewnie jakie tajemnice implementacyjne. Jest dostarczany
w postaci skompilowanej, tak by ju nikt nie by w stanie tego rozszyfrowa.
2. Z pewnoci, ale nie wiem jak (informatyka dowiadczalna!). Naley jedynie

uwaa, by ptla podawaa takie wartoci, ktre bd do przyjcia dla pltaniny


tych funkcji.

C:\Andrzej\PDF\C++ Builder. 20 efektownych programw\skad!!.doc

Rozdzia 1. Tytu rozdziau

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.
99 99 99 
$$$

Funkcja ta oczekuje trzech argumentw nate czerwieni, zieleni i bkitu.


Oprcz funkcji RGB(), mogcej zsyntetyzowa praktycznie dowolny kolor, mamy
w Builderze zestaw indywidualnie nazwanych barw, np. clRed, clGreen, clYellow.
Cay zbir nazw moemy zobaczy w Inspektorze obiektw, ot choby we waciwoci Color, nalecej do formy.
Mimo tego bogactwa zaopatrzony w kolorowy monitor przyrodnik napotka prdzej
czy pniej powan trudno nie bdzie potrafi uzyska koloru fizycznego, wypeniajcego cay otaczajcy nas wiat. Kolor fizyczny okrela si dugoci fali
wiata albo alternatywnie jej czstotliwoci. wiato czerwone ma dusze
fale ni wiato te. Z kolei wiato te ma dusz fal ni fiolet. Gdyby wreszcie
wykreli barwy wszystkich dugoci fal (wszystkich oczywicie si nie da), otrzymalibymy na ekranie tcz. Tymczasem istniejcy, biblioteczny aparat koloru w aden sposb nie umoliwia nam wykrelenia tczy.
Gdzie ley zasadnicza trudno? Monitory posuguj si trzema barwami podstawowymi, gdy jakim cudem trzy zmieszane barwy podstawowe potrafi doskonale
oszuka nasze przebiege mzgi. Wraenie uzyskane w wyniku wpuszczenia do oka
wiata czerwonego i zielonego w peni odpowiada sytuacji, gdyby wpuszczono tam
wiato czysto te. Mieszanina czerwieni i zieleni jest dla oka tym samym, czym
. Dla oka, ale nie dla Natury. Jak fachowo mwimy, oko nie ma waciwoci
spektralnych nie potrafi analizowa mieszanin barw. Wystarczy spojrze na ekran
przez spektroskop, by odkry najwaniejsz mistyfikacj dwudziestego wieku: kolor
ty wcale nie jest ty. Mao ktry kolor jest prawdziwy. W naszych komputerach
i monitorach tylko pi kolorw jest prawdziwych.

C:\Andrzej\PDF\C++ Builder. 20 efektownych programw\skad!!.doc

10

C++ Builder. 20 efektownych programw

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):

' '247,2?'  @2""%,+7')'247,2 

W fizyce symbolem lambda zwyczajowo okrela si dugo fali. Zatem powysza


funkcja ma przetworzy rzeczywist dugo fali w kolor. Parametr jasnosc dodatkowo pozwoli operowa jaskrawoci wiata, zwikszajc lub zmniejszajc intensywno koloru, ale tak, by nie popsu barwy. Jeli komu z Pastwa uda si dobrze napisa i udokumentowa to, o czym za chwil powiemy, myl e Borland to kupi.
Algorytmy nowego obiektu lokujemy w nowym module robilimy to ju dwukrotnie, rozpoczynajc prace nad obiektami TSkalowanie i TDiagram. Bardzo wana jest
nazwa plikw takiego moduu powinna by czytelna, by w przyszoci ju na
pierwszy rzut oka byo oczywiste, co znajduje si w tym module. Niech nazwa ta
brzmi widmo.

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

C:\Andrzej\PDF\C++ Builder. 20 efektownych programw\skad!!.doc

Rozdzia 1. Tytu rozdziau

11

Oto tre pliku widmo.h, zawierajcego deklaracj nowej klasy:


##&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
* ,)A ,4:
*,) )A ,4:

 
     
  !
"
 # $%#  #
 #&'('')!
%'2""
9 ,4
6
1 .2)B
 )%C2D;EDFE
  # *
 +# , %
,+7')"?2'8"?2'"?2' #%
+ 
 &% )
1+7' %B

9 ,4 . , 
%  

' '247,2?'  @2""%,+7') 
,+7')8( 8(%  # #  
=
*), 

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(  
8"?2'&"?2'!8( 
"?2'I$#$
% #%
)%C2DEDEF)%C2DEDEH)%C2DEDEI
)%C2DEDEI)%C2DEDE)%C2DEDE;
)%C2DEDEIH)%C2DEDE;)%C2DEDEGF
)%C2DFEDEF)%C2DFEDEF)%C2DFEDEGF

C:\Andrzej\PDF\C++ Builder. 20 efektownych programw\skad!!.doc

11

12

C++ Builder. 20 efektownych programw


)%C2DIEDE)%C2DIEDEI)%C2DIEDEGF
)%C2D;EDE)%C2D;EDE;F)%C2D;EDE;
)%C2DGEDE)%C2DGEDEGF)%C2DGEDE
)%C2DHEDEF)%C2DHEDEGF)%C2DHEDE
)%C2DJEDEGF)%C2DJEDEGF)%C2DJEDE
)%C2DKEDEGF)%C2DKEDEIH)%C2DKEDEH
)%C2DEDEGF)%C2DEDEF)%C2DEDE;
)%C2DEDEGF)%C2DEDE;)%C2DEDEH
)%C2DEDEGF)%C2DEDE)%C2DEDE
)%C2DFEDE;)%C2DFEDE)%C2DFEDE
)%C2DIEDEI)%C2DIEDE)%C2DIEDE
=

.#$%  /%# 
( 5!!$:
% $ 
6
 1 ) A"C?'  37
,+7')1 2A,C A?' +'24)?, +3 )322
,+7')@2"
  -8( LL08(
 )+ %'8'2%?


   %# 

  @2""%0
@2""%
  @2""%-
@2""%
@2""?2'!@2""% 

  $%
  %

% #%

1 2A,C A?' "?2'!<8"?2'


1 ) A"C?'   1 2A,C A?'  ,# 
!0
+'24)?, +3 )31 2A,C A?' &1 ) A"C?' 1!  
!'!23
2)%C2D1 ) A"C?' EDE!@2"
2)%C2D1 ) A"C?' <EDE!@2"
   2<+'24)?, +3 )3! 2&2 
2)%C2D1 ) A"C?' EDE!@2"
2)%C2D1 ) A"C?' <EDE!@2"
3  2<+'24)?, +3 )3! 2&2 
2)%C2D1 ) A"C?' EDE!@2"
2)%C2D1 ) A"C?' <EDE!@2"
7  2<+'24)?, +3 )3! 2&2 
 )+ M8  37 
=

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

C:\Andrzej\PDF\C++ Builder. 20 efektownych programw\skad!!.doc

Rozdzia 1. Tytu rozdziau

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'

dostarczya numer koloru z zakresu od 0 do 15. Powinno si to kojarzy nam z 15


elementami tablicy tecza[][]. Zmienna prawdziwy_kolor jest wic numerem trjki R,
G, B w tablicy tecza[ ][ ] (ale zazwyczaj z ogonkiem uamkowym, ktry posuy do
korekty barwy), zmienna L to dugo fali wiata.
Wspczynnik Cskal zamieni procentow warto jaskrawoci na wikszy lub mniejszy zestaw amplitud R, G, B. Ma tak dobran warto, by najwysza amplituda z tablicy tecza[ ][ ] (czyli 63) przemnoona przez najwysz jaskrawo (czyli 100%)
miecia si w zakresie tolerowanym przez biblioteczn funkcj RGB():
 "?2'!@2"NO!P%C2DEDE -;;

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.

C:\Andrzej\PDF\C++ Builder. 20 efektownych programw\skad!!.doc

13

14

C++ Builder. 20 efektownych programw

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
$$$

Zmienna prawdziwy_kolor zazwyczaj jest wartoci uamkow. Jej cz cakowita,


uchwycona w zmiennej pierwszy_kolor, oznacza czysty kolor z tablicy tecza[ ][ ].
Jednak prawdziwy_kolor ma take cz uamkow zamanie barwy w stron nastpnego elementu tablicy tecza[ ][ ]. Tak oto dokonujemy zamania czystego koloru
uamkiem drugiego:
$$$
2)%C2D1 ) A"C?' EDE!@2"
2)%C2D1 ) A"C?' <EDE!@2"
  2<+'24)?, +3 )3! 2&2 
$$$

Powyszy fragment algorytmu dotyczy wyliczenia amplitudy czerwieni, std indeks


zero w elementach tablicy tecza[ ][ ]. Potem jeszcze powtarzamy t receptur dla
zieleni i bkitu. Wreszcie syntetyzujemy ostateczny kolor.
Tak naprawd, sztuk nie jest napisanie powyszego programu. Jeli kto dobrze
przemyla obiekt TSkalowanie, nie ma tu wiele do roboty. Jaka tajemnica tkwi jednak w tablicy tecza[][], definiujcej 15 kolejnych barw z tczy w rozkadzie na komputerowe amplitudy czerwieni, zieleni i bkitu. W tablicy tej krzyuj si dwa wiaty: prosty, logicznie skonstruowany wiat komputerw i caa nasza niezbadana
fizjologia, ktra fal o takiej a takiej dugoci kae postrzega jako tak a tak barw.
Dobre tablice tecza[][] pewnie s sporo warte dla grafika przyrodnika, ktry potrzebuje barwy wiata o dugoci fali, powiedzmy 0.000000512 m. Skd wziem t
tablic? Znalazem w jakiej ksice fotografi tczy. Leciutko, by nie niszczy
ksiki, narysowaem na tczy 15 rwnoodlegych linii. Mwic inaczej, zaznaczyem na niej 15 spektralnych barw bazowych. To by pierwszy punkt mojego chytrego
algorytmu.
W drugim punkcie poprosiem o pomoc kilkoro maych dzieci. Posadziem je przed
komputerem i pooyem przed nimi fotografi tczy z zaznaczonymi punktami. Na
ekranie by program, umoliwiajcy syntez barwy z nastaw trzech suwakw, ot taki
mieszacz kolorw. Dzieci miay zadanie dobrania takiego pooenia suwakw czerwieni, zieleni i bkitu, by wymieszany kolor odpowiada kolorowi z zaznaczonego
punktu tczy. Wystarczyo wynotowa nastawy suwakw i wpisa je do tablicy
tecza[][].

14

C:\Andrzej\PDF\C++ Builder. 20 efektownych programw\skad!!.doc

Rozdzia 1. Tytu rozdziau

15

Przy okazji zauwayem ciekaw waciwo maych dzieci dokadnie wiedz,


kiedy kolor jest odpowiedni i kiedy trzeba przerwa poszukiwania. Dorosy poprawia,
marudzi, doskonali i traci czas. Dziecko po prostu wie.
Kady dopiero co napisany obiekt trzeba przetestowa. W funkcji reakcji na zdarzenie OnPaint umiecimy algorytm krelenia wszystkich barw tczy we wszystkich jaskrawociach. Zamalujemy tcz wydzielony z okienka, prostoktny obszar.
Oto tre funkcji:
. ,2"%2''
 4BB 4>2 
Q7@)%!R),)
6
%" ););)"C) ' )9 ,/&)A"' ):) 3/&

,+7')'247,2@2"
 
5;
,+7')A ,4"C) A ,4$8(&A ,4$8( 

R?2'A2 )"?2' )))"C) )A"
A ,4$8( <A ,4"C) #;A ,4"C)  
 )-)<)"C) <<
6
'247,2"?2'$,2@ )2'  
 )-)<)A"<<
6
@2""?2'$,2@ )2'  
2.2"&0> )'"DEDE;$:
% $ 
=
=
=

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.

C:\Andrzej\PDF\C++ Builder. 20 efektownych programw\skad!!.doc

15

16

C++ Builder. 20 efektownych programw

Zadania i problemy
1. Obiekt TWidmo nie nadaje si do pracy z grafik 256-kolorow (bo w tym

systemie mamy kolory arbitralnie ponumerowane, nie dynamicznie tworzone


funkcj RGB()). Jednak okazuje si, e take kolory 16-bitowe (czyli
niepene RGB()), aczkolwiek tworzone poprawnie, wykazuj jak
ziarnisto. Recept jest domieszanie niewielkiej skadowej pseudolosowej
do kadej barwy niech kolor bdzie ty, ale z ewentualn domieszk
okolicznych barw. Domieszka niech nie bdzie dua np. 1% odchylenia
od barw wyliczonych.
Jak to zaimplementowa?

Odpowiedzi
1. Naley zaimplementowa rozmywanie zarwno jaskrawoci, jak i dugoci

fali. Gdzie na samym pocztku funkcji lambda_to_kolor() dodajmy dwa


wiersze, lekko psujce otrzymane argumenty:
$$$
@2""%< & 2,4 F 
<$&J! $& ,+7') 2,4  #$ 
$$$

Pierwszy wiersz psuje cakowit warto zmiennej jasno, dodajc do niej 1, 0


lub 1 (czyli na gboko +/ 1%). Drugi wiersz psuje rzeczywist warto
zmiennej lambda na gboko +/ 0.1E8 (czyli o dwa rzdy mniej ni
podawana dugo fali). To rzeczywicie pomaga usun ziarnisto
odwzorowania barwy!

16

C:\Andrzej\PDF\C++ Builder. 20 efektownych programw\skad!!.doc

You might also like