Cyfroteka.pl

klikaj i czytaj online

Cyfro
Czytomierz
00087 007765 10476138 na godz. na dobę w sumie
C++ Builder. 20 efektownych programów - książka
C++ Builder. 20 efektownych programów - książka
Autor: Liczba stron: 220
Wydawca: Helion Język publikacji: polski
ISBN: 83-7197-656-9 Data wydania:
Lektor:
Kategoria: ebooki >> komputery i informatyka >> programowanie >> c++ builder - programowanie
Porównaj ceny (książka, ebook, audiobook).
Książka zawiera bardzo przystępne opisy niezwykle efektownych zjawisk z pogranicza różnych nauk przyrodniczych oraz ich komputerowe realizacje w dialekcie C++ Builder firmy Borland. Stanowi ona zbiór ćwiczeń do wykorzystania na szkolnym kółku komputerowym, ale zapewne zainteresuje też wykładowców i studentów kierunków przyrodniczych. Od Czytelnika wymagamy wiedzy na poziomie szkoły średniej, a niekiedy zaledwie gimnazjum.

Opisywane zagadnienia często są ledwie zarysowane i pozostawiają Czytelnikowi ogromne możliwości dalszego, samodzielnego eksperymentowania.

W realizacji pomysłów Autor po mistrzowsku posługuje się najprostszym, a przy tym w pełni obiektowym i bardzo nowoczesnym sposobem programowania komputerów.

Znajdź podobne książki Ostatnio czytane w tej kategorii

Darmowy fragment publikacji:

C++ Builder. 20 efektownych program(cid:243)w Autor: Andrzej Stasiewicz ISBN: 83-7197-656-9 No(cid:156)nik: CD Liczba stron: 224 Ksi„¿ka zawiera bardzo przystŒpne opisy niezwykle efektownych zjawisk z pogranicza r(cid:243)¿nych nauk przyrodniczych oraz ich komputerowe realizacje w dialekcie C++ Builder firmy Borland. Stanowi ona zbi(cid:243)r (cid:230)wiczeæ do wykorzystania na szkolnym k(cid:243)‡ku komputerowym, ale zapewne zainteresuje te¿ wyk‡adowc(cid:243)w i student(cid:243)w kierunk(cid:243)w przyrodniczych. Od Czytelnika wymagamy wiedzy na poziomie szko‡y (cid:156)redniej, a(cid:160) niekiedy zaledwie gimnazjum. Opi-sywane zagadnienia czŒsto s„ ledwie zarysowane i(cid:160) pozostawiaj„ Czytelnikowi ogromne mo¿liwo(cid:156)ci dalszego, samodzielnego eksperymentowania. W realizacji pomys‡(cid:243)w Autor po mistrzowsku pos‡uguje siŒ najprostszym, a przy tym w pe‡ni obiektowym i bardzo nowoczesnym sposobem programowania komputer(cid:243)w. IDZ DO IDZ DO PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ SPIS TRE(cid:140)CI SPIS TRE(cid:140)CI KATALOG KSI¥flEK KATALOG KSI¥flEK KATALOG ONLINE KATALOG ONLINE ZAM(cid:211)W DRUKOWANY KATALOG ZAM(cid:211)W DRUKOWANY KATALOG TW(cid:211)J KOSZYK TW(cid:211)J KOSZYK DODAJ DO KOSZYKA DODAJ DO KOSZYKA CENNIK I INFORMACJE CENNIK I INFORMACJE ZAM(cid:211)W INFORMACJE ZAM(cid:211)W INFORMACJE O NOWO(cid:140)CIACH O NOWO(cid:140)CIACH ZAM(cid:211)W CENNIK ZAM(cid:211)W CENNIK CZYTELNIA CZYTELNIA FRAGMENTY KSI¥flEK ONLINE FRAGMENTY KSI¥flEK ONLINE Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: helion@helion.pl Notka wydawnicza ...................................................n..........................5 Wstęp ...................................................n............................................7 Rozdział 1. Dywany na ustalonej powierzchni...................................................n.....9 Rozdział 2. Grafika rozpinanej nici ...................................................n...................17 Rozdział 3. Serwetka z cykloid...................................................n........................23 Rozdział 4. Skalowanie ...................................................n...................................31 Rozdział 5. Składanie drgań poprzecznych ...................................................n.......43 Rozdział 6. Sumowanie drgań...................................................n..........................51 Rozdział 7. Dywany iterowane...................................................n.........................61 Rozdział 8. Dywany afiniczne ...................................................n..........................69 Rozdział 9. Grafika układu współrzędnych...................................................n........87 Rozdział 10. Konkurencja międzygatunkowa...................................................n......97 Rozdział 11. Przyszłość nie do przewidzenia ...................................................n....111 Rozdział 12. Algorytm barwy fizycznej ...................................................n.............119 Rozdział 13. Grafika wykładników Lapunowa ...................................................n...127 Rozdział 14. Fraktal Mandelbrota...................................................n....................137 Rozdział 15. Eksplorator Mandelbrota ...................................................n.............147 Rozdział 16. Otwarty kosmos...................................................n..........................161 Rozdział 17. Gra w życie ...................................................n.................................171 Rozdział 18. Epidemia ...................................................n....................................185 Rozdział 19. Mrowisko pełne automatów...................................................n.........201 Rozdział 20. Jednowymiarowy automat komórkowy ............................................215 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ą należy 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:i  $(cid:11)(cid:12) STAŁE: 28)  ZMIENNE: 28  (cid:26) (cid:26)(cid:26) (cid:26)   036 83)   !72(cid:11)  (cid:12)!-37(cid:11)  (cid:12)   !-37(cid:11)  (cid:12)  ! !72(cid:11)  (cid:12)!-37(cid:11)  (cid:12)  !-37(cid:11)  (cid:12) 336  2/(cid:10) (cid:11) (cid:11)(cid:11)(cid:12) 2/8 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 końców linii, by zamknięta w pętli całość złożył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 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 gwoździków i rtozpięła między nimi 500 czarnych nici. Pozycje gwoździków nie są przypadkowe — dostarcza je ntiezbyt 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: (cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1) 2-9./:-  46+1+.67834 2-9./02-  2-9./+8  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, nieziwłocznie spiszmy jej algo- rytm, przekładając wcześniejsze, ogólne frazy na dialiekt C++ Buider: 4 C:\Andrzej\PDF\C++ Builder. 20 efektownych programów\skład!!.doc Rozdział 1.  Tytuł rozdziału 5 :3.))0+78-+$36 36 +28(cid:10)$,/-8 #/2./6(cid:12)  28 .39,/ (cid:26)(cid:26) (cid:26)(cid:26) (cid:26)(cid:26)  /28 .8  /28 .8  /28/18  036(cid:11)   (cid:12)    !72(cid:11)  (cid:12)!-37(cid:11)  (cid:12)   !-37(cid:11)  (cid:12)  ! !72(cid:11)  (cid:12)!-37(cid:11)  (cid:12)  !-37(cid:11)  (cid:12) +2:+7)3:/$3(cid:10) ,(cid:11) ,(cid:12) +2:+7)2/$3(cid:10),(cid:11),(cid:12)   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. Zauważmy 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 możliwości modyfikacji algorytmu. Przede wszystkim włóżmy trochę koloru w grafikę rozpinanej nici. Mam taiki pomysł: :3.))0+78-+$36 36 +28(cid:10)$,/-8 #/2./6(cid:12)  .39,/8(cid:26) (cid:26)(cid:26) (cid:26)(cid:26) (cid:26)(cid:26)  /28 .8  /28 .8  /28/18  036(cid:11)8 ) 8) 8 )   (cid:12)    !72(cid:11)8(cid:12)!-37(cid:11)8(cid:12)   !-37(cid:11)8(cid:12)  !72(cid:11)8(cid:12)!-37(cid:11)8(cid:12)  !-37(cid:11)8(cid:12) +2:+7) /2)336(cid:10)8)  -9/- /.(cid:12) +2:+7)3:/$3(cid:10) ,(cid:11) ,(cid:12) +2:+7)2/$3(cid:10),(cid:11),(cid:12)   !72(cid:11)8(cid:12)   !-37(cid:11)8(cid:12)!72(cid:11)8(cid:12)  !72(cid:11)8(cid:12)  !-37(cid:11)8(cid:12)!72(cid:11)8(cid:12) C:\Andrzej\PDF\C++ Builder. 20 efektownych programów\skład!!.doc 5 6 C++ Builder. 20 efektownych programów +2:+7) /2)336(cid:10)8)  - 8/-59+(cid:12) +2:+7)3:/$3(cid:10) ,(cid:11) ,(cid:12) +2:+7)2/$3(cid:10),(cid:11),(cid:12)   Rysunek 7. Czarne tło uzyskałem, opracowując w Inspektorze obietktów właściwość o nazwie Color. Modyfikacja algorytmu wbijania gwoździków polega na intnej organizacji pętli for() — teraz pętla nie liczy linii, a przebiega jakoś zakreśloną dziedzinę, atkceptowalną przez wykorzystane tutaj funkcje trygonometryczne. Stała o nazwie M_PI (liczba pi) jest z tdużą dokładnością zdefiniowana w doklejanym nagłówku matematycznym math.h. Co się tutaj zmieniło? Algorytm jest dwa razy dłuższy — w każdym 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 każdej 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:+7  /2 336(cid:10)8)  -9/- /.(cid:12) Dlaczego lubimy tę instrukcję? Bo daje się wbudowywać bezpośrednio w wyrażenia. Za pomocą klasycznego warunku logicznego powyższe zapiisalibyśmy np. tak: 0(cid:10)8)  (cid:12) +2:+7  /2 336-9/ 6 C:\Andrzej\PDF\C++ Builder. 20 efektownych programów\skład!!.doc Rozdział 1.  Tytuł rozdziału 7 /7/ +2:+7  /2 336- /. co oczywiście też jest dobrą, choć mniej profesjonalnią, 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ę zaczęła wpltatać kolorowe nici. Tu powoli kończy się analogia z realem (tak znajomi nazywają tent świat za oknem...). Nie ma kompletu nici o barwach tożsamych i równie bogatych, co kolorystykta funkcji RGB(). :3.))0+78-+$36 36 +28(cid:10)$,/-8 #/2./6(cid:12)  .39,/8(cid:26) (cid:26)(cid:26) (cid:26)(cid:26) (cid:26)(cid:26) 286(cid:11)1(cid:11),  /28 .8  /28 .8  /28/18  036(cid:11)8 ) 8) 8 )   (cid:12)    !72(cid:11)8(cid:12)   !-37(cid:11)8(cid:12)  !72(cid:11)8(cid:12)   6 ) 1 ) , )  +2:+7  /2 336(cid:10)$336(cid:12) (cid:10)6(cid:11)1(cid:11),(cid:12) +2:+7 3:/$3(cid:11)  (cid:26)  (cid:12) +2:+7 2/$3(cid:11) (cid:26) (cid:12)   C:\Andrzej\PDF\C++ Builder. 20 efektownych programów\skład!!.doc 7 8 C++ Builder. 20 efektownych programów Wyliczanie współrzędnych pod gwoździki zawiera szczególnie proste wyrażenia. Nie będziemy tego omawiać, bo jest to pole do popisu dla domowych programistów, a w dodatku nie mam godnej polecenia recepty, co naileżałoby tam wpisać. W algorytmie pojawiły się trzy dodatkowe zmienne — amplitudy trzech barw pod- stawowych. W powyższym programie każda z tych amplitud jest jakąś funkcją współ- rzędnych gwoździków. Nad sposobem wyliczania amplitud koloru, podobnie jak nad sposobem znajdowania miejsc na gwoździki, niewątpliwiie należy solidnie popracować. Zadania i problemy 1. Stała M_PI jest zadeklarowana i zainicjowana w pliku math.h. Spróbuj odszukać ten plik w katalogu Buildera, otwórz go w edyitorze, obejrzyj. Tylko niczego tam nie popsuj! 2. Trzymamy się tutaj kurczowo funkcji trygonometrycznyich, co jest uzasadnione ich przewidywalnym przebiegiem, ale jeszcze są funkcjie: log() (logarytm), fabs() (wartość bezwzględna), exp() (funkcja wykładnicza), sqrt() (pierwiastek kwadratowy). Czy uda Ci się coś z tego tworzywa zbudowiać? Rozwizania 1. W katalogu, w którym jest zainstalowany Builder, prawidopodobnie (podczas instalacji można zmieniać katalogi) znajduje się podkaitalog o nazwie Include. Jest tam plik math.h. Jego odpowiednik z algorytmami, prawdopodobnie o nazwie math.cpp, nie jest w wersji źródłowej udostępniany przez Borilanda — ot mają tam pewnie jakieś tajemnice implementacyjnei. Jest dostarczany w postaci skompilowanej, tak by już nikt nie był w istanie tego rozszyfrować. 2. Z pewnością, ale nie wiem jak (informatyka doświadczalnai!). Należy jedynie uważać, by pętla podawała takie wartości, które będą doi przyjęcia dla plątaniny tych funkcji. 8 C:\Andrzej\PDF\C++ Builder. 20 efektownych programów\skład!!.doc Rozdział 1.  Tytuł rozdziału 9 Rozdział 12. W poprzednich rozdziałach poznaliśmy system dobierania koloru do wykreślania ja- kiegoś obiektu graficznego. Centralne znaczenie ma tam funkcja RGB(), sterująca natężeniem trzech niezależnych barw kineskopowych: 336 (cid:10) (cid:11) (cid:11) (cid:12) Funkcja ta oczekuje trzech argumentów — natężeń czerwieni, zieleni i błękitu. Oprócz funkcji RGB(), mogącej zsyntetyzować praktycznie dowolny kolor, mamy w Builderze zestaw indywidualnie nazwanych barw, np. clRed, clGreen, clYellow. Cały zbiór nazw możemy zobaczyć w Inspektorze obiektów, ot choćby we właściwo- ści Color, należącej do formy. Mimo tego bogactwa zaopatrzony w kolorowy monitor przyrodnik napotka prędzej czy później poważną trudność — nie będzie potrafił uzyskać koloru fizycznego, wy- pełniającego cały otaczający nas świat. Kolor fizyczny określa się długością fali światła albo — alternatywnie — jej częstotliwością. Światło czerwone ma dłuższe fale niż światło żółte. Z kolei światło żółte ma dłuższą falę niż fiolet. Gdyby wreszcie wykreślić barwy wszystkich długości fal (wszystkich oczywiście się nie da), otrzy- malibyśmy na ekranie tęczę. Tymczasem istniejący, biblioteczny aparat koloru w ża- den sposób nie umożliwia nam wykreślenia tęczy. Gdzie leży zasadnicza trudność? Monitory posługują się trzema barwami podstawo- wymi, gdyż jakimś cudem trzy zmieszane barwy podstawowe potrafią doskonale oszukać nasze przebiegłe mózgi. Wrażenie uzyskane w wyniku wpuszczenia do oka światła czerwonego i zielonego w pełni odpowiada sytuacji, gdyby wpuszczono tam światło czysto żółte. Mieszanina czerwieni i zieleni jest dla oka tym samym, czym żółć. Dla oka, ale nie dla Natury. Jak fachowo mówimy, oko nie ma właściwości spektralnych — nie potrafi analizować mieszanin barw. Wystarczy spojrzeć na ekran przez spektroskop, by odkryć najważniejszą mistyfikację dwudziestego wieku: kolor żółty wcale nie jest żółty. Mało który kolor jest prawdziwy. W naszych komputerach i monitorach tylko pięć kolorów jest prawdziwych. C:\Andrzej\PDF\C++ Builder. 20 efektownych programów\skład!!.doc 9 10 C++ Builder. 20 efektownych programów Napiszemy nowy obiekt o nazwie TWidmo. Obiekt TWidmo będzie dostarczał barwę spektralną (czystą). Wystarczy podać długość fali światła — byle z zakresu widzial- nego — a obiekt TWidmo wytworzy odpowiednią barwę. Czy barwa ta będzie rze- czywiście czysta? Jasne, że nie. Wszak nasze kineskopy mają tylko trzy barwne działka elektronowe. Barwa nie będzie czysta, ale uzyiskiwane wrażenie — tak. Najważniejszym elementem obiektu TWidmo będzie publiczna funkcja o następują- cym prototypie (nagłówku): $336+,.+)83)336(cid:11)28+7237-(cid:26).39,/+,.+(cid:12) W fizyce symbolem lambda zwyczajowo określa się długość fali. Zatem powyższa funkcja ma przetworzyć rzeczywistą długość fali w kolor. Parametr jasnosc dodatko- wo pozwoli operować jaskrawością światła, zwiększając lub zmniejszając intensyw- ność koloru, ale tak, by nie popsuć barwy. Jeśli komuś z Państwa uda się dobrze napi- sać i udokumentować to, o czym za chwilę powiemy, myślę iże Borland to kupi. Algorytmy nowego obiektu lokujemy w nowym module — robiliśmy to już dwukrot- nie, rozpoczynając prace nad obiektami TSkalowanie i TDiagram. Bardzo ważna jest nazwa plików takiego modułu — powinna być czytelna, by w przyszłości już na pierwszy rzut oka było oczywiste, co znajduje się w tym module. Niech nazwa ta brzmi widmo. Rysunek 51. Zastanówmy się przez chwilę, co leży u źródeł naszycth kłopotów z tęczą. Nasze oczy postrzegają fale elektromagnetyczne z zakresu od 0.4 dto 0.65 mikrometra. Dzięki zróżnicowanej budowie receptorów potrafią też rozróżniać długości fal z powyższego zakresu — różnice te postrzegamy jako barwę (ale zauważmy, że oczy łatwo dają się oszukać — istnieje tnp. czysta zieleń spektralna (0.5 mikrometra) i taka sama co do koloru mieszanina światła niebiestkiego i żółtego). To, że poszczególnym długościom fal elektromagnetycznych odpowiadają takie, a nie inne ktolory, jest już sprawą naszych mózgów i zawartych tam algorytmów interpretujących elektryczne bodźce pochodzące z okta. Jest nawet prawdopodobne, że każdy człowiek inaczej widzi kolory. Co jest czerwone, ta co niebieskie, uzgodniliśmy wiele lat temu tylko i wyłącznie drogą ustnej wymiany poglądów na ten temat. Tymczasem komputery dysponują trzema drutami prowadzącymi do monitora. Biegną po nich trzy amplittudy kolorów, z których da się zbudować każdą barwę, albo lepiej — którymi da się oszukać każdy mózgt, tak by myślał, że widzi pełną paletę. Te kolory to: czerwony, niebieski i zielony. Taka triada nazywa tsię barwami dopełniającymi. Moglibyśmy nazwać je też barwami bazowymi. Wystarczy wziąć lupę i spojrzeć nta trójkolorową strukturę pojedynczego punktu ekranu, by doświadczalnie zweryfikować te słowa. Jeśli tchodzi o kolory, to jesteśmy brutalnie oszukiwani. 10 C:\Andrzej\PDF\C++ Builder. 20 efektownych programów\skład!!.doc Rozdział 1.  Tytuł rozdziału 11 Oto treść pliku widmo.h, zawierającego deklarację nowej klasy: 02./0;.3 ./02/;.3 (cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)4(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1) ,/846/-+-0-2.o9130+2++489. (cid:30)(cid:30) +4//283;+238/ +723;+8o+(cid:30)+.+;+2463-/2483;3 3. .3 ) -+77$ .3  46:+8/ 288/-+  .39,/7+(cid:26)7+(cid:26)7+ 63o+.;,6+2-4928+;8,-2+7o+.2  ;74+o-22433-2-/ 7+9-/) 49,- $ .3(cid:11):3.(cid:12) $336+,.+)83)336(cid:11)28+7237-(cid:26).39,/(cid:12) .39,/)(cid:26)) 76+2/.o913-0+;+8o+;.+2/13  /2.0 327869836 Powyższa klasa zapowiada dwie funkcje publiczne — jak zwykle oczekiwanego kon- struktora i równie oczekiwanej funkcji konwertującej fizyczną długość fali na borlan- dowski kolor. Konstruktor nie ma parametrów — to się zdarza w sytuacjach, w któ- rych nie ma nic do zainicjowania. Bezparametrowy konstruktor nie jest czymś niezwykłym. Ale w tym zagadnieniu konstruktor, choć bezparametrowy, będzie mu- siał wykonać niezwykle istotną część pracy — będzie musiał zainicjować tablicę tecza[][], gdzie umieścimy definicje 15 kluczowych barw tęczy. Publiczne parametry LAMBDA_MIN i LAMBDA_MAX to prezent dla użytkowników naszej klasy. Parametry te opisują fizyczne granice widzialnej części widma fal elek- tromagnetycznych. Zostały upublicznione, bo może komiuś się przydadzą. Takiej deklaracji należało się spodziewać. Zobaczmy zatem, jak zrealizowano szcze- góły implementacyjne obiektu TWidmo, czyli zajrzyjmy do pliku CPP: 2-9./:-  46+1+.67834 2-9./;.3  (cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)4(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1) 3278698362-9/;/;2,8629786+3,/89 $ .3$ .3(cid:10):3.(cid:12)  28)-78)336  -,+;/.38+,/8/-+ )   )   7+(cid:11).39,/(cid:12)(cid:11))-78)336 (cid:12) (cid:11)) )(cid:12) 7+ 7+!) 7+    16+2-+2+.03/83;+ 16+2-+43.-/6;32+ 7+3;+2/+723- 8/-+   8/-+  8/-+   8/-+   8/-+   8/-+   8/-+ 8/-+  8/-+ 8/-+ 8/-+  8/-+ C:\Andrzej\PDF\C++ Builder. 20 efektownych programów\skład!!.doc 11 12 C++ Builder. 20 efektownych programów 8/-+  8/-+  8/-+ 8/-+  8/-+ 8/-+  8/-+  8/-+ 8/-+  8/-+  8/-+ 8/-+  8/-+ 8/-+ 8/-+  8/-+ 8/-+ 8/-+ 8/-+  8/-+   8/-+   8/-+  8/-+   8/-+  8/-+  8/-+   8/-+   8/-+   8/-+   8/-+   8/-+   8/-+   8/-+    (cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)4(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1)(cid:1) +;+ 2/7+092-+(cid:30)+/2+-++723;3436 $336$ .3+,.+)83)336(cid:10)28+7237-(cid:11).39,/(cid:12)  284/6;7)336(cid:26)6(cid:26)1(cid:26), .39,/46+;.;)336(cid:26)9+/).691/13(cid:26)+ (cid:26)+ .39,/+72 0(cid:11)))(cid:12) 6/8962-+- 0(cid:11)+7237- (cid:12) +7237-  0(cid:11)+7237- (cid:12) +7237-  43++6/7/;./2+ ,8.9 ++723 ,8+o++723 +727+!+7237-  46/7+3;+2/+723- 46+;.;)3367+! 7+ 4/6;7)336(cid:11)28(cid:12)46+;.;)336 -,-+o3;8+(cid:30)24  9+/).691/1346+;.;)336 4/6;7)336 9o+/ 3369(cid:30)24   + 8/-+4/6;7)336 !+72 +8/-+4/6;7)336   !+72 6(cid:11)28(cid:12)(cid:11)+  9+/).691/13!(cid:11)+ + (cid:12)(cid:12) + 8/-+4/6;7)336 !+72 +8/-+4/6;7)336   !+72 1(cid:11)28(cid:12)(cid:11)+  9+/).691/13!(cid:11)+ + (cid:12)(cid:12) + 8/-+4/6;7)336!+72 +8/-+4/6;7)336  !+72 ,(cid:11)28(cid:12)(cid:11)+  9+/).691/13!(cid:11)+ + (cid:12)(cid:12) 6/8962 (cid:11)6(cid:26)1(cid:26),(cid:12)  Konstruktor, jak to czynią wszystkie konstruktory, inicjuje wewnętrzne (czyli pry- watne) zmienne obiektu. Najważniejsze jest zainicjowanie tablicy tecza[][], zawiera- jącej definicje 15 kluczowych kolorów tęczy. Ciekawsze rzeczy dzieją się w funkcji transformującej fizyczną długość fali światła i jego jasność w kolor. 12 C:\Andrzej\PDF\C++ Builder. 20 efektownych programów\skład!!.doc Rozdział 1.  Tytuł rozdziału 13 Rysunek 52. Spektralnie czystą tęczę, gdzie każdy kolor ma ściślet określoną długość fali, udajemy odpowiednio dobranymi mieszankami barw czerwonej, zitelonej i niebieskiej. Jak dobrać amplitudy tych trzech barw w każdym punkcie tęczy? Jak skonstruować utmieszczoną w konstruktorze TWidmo() tabelę definiującą rozkład tęczy na barwy bazowe? Trzeba zawotłać kilkoro dzieci i posadzić je przed jakimś programem typu Paint czy Corel. Są tam narzędzia, którte pozwalają na budowę własnego koloru, przy okazji pokazując zawartość sygnałów RGB. Dzieci doskonalte wiedzą, jak powinien wyglądać spektralny kolor pomarańczowy czy fioletowy. Nam pozostaje wynototwać amplitudy R, G i B, składające się na takie specjalne kolory. Amplitudy te wbudowujemy do tabeli ttecza[][]. Widoczny tutaj wykres, w istocie skonstruowany doświatdczalnie, pokazuje jakąś prawdę o fizjologii widzenia barw. Tęczę na dolnej osi wykreślono algoryttmem opisanym w tekście. Idea algorytmu jest taka: mamy jakąś długość fali światła lambda i szukamy trójki liczb R, G, B, które po wymieszaniu dadzą wrażenie światła o długości fali lambda. Wchodzimy z wartością tej długości fali do tablicy tecza[ ][ ] i szukamy najbliższej jej trójki amplitud R, G, B. Jeśli najbliższej nie ma, aproksymujemy amplitudy po- między dwiema sąsiednimi trójkami. Wyliczamy przybliżone wartości R, G i B. Jeśli potrzebny nam kolor pomiędzy pomarańczowo-czerwonym a czerwonym, bierzemy wartości amplitud R, G, B gdzieś spomiędzy obu tych trójek. Współczynniki Askal i Bskal mają tak dobrane wartości, by fraza: 46+;.;)3367+! 7+ dostarczyła numer koloru z zakresu od 0 do 15. Powinno się to kojarzyć nam z 15 elementami tablicy tecza[][]. Zmienna prawdziwy_kolor jest więc numerem trójki R, G, B w tablicy tecza[ ][ ] (ale zazwyczaj z ogonkiem ułamkowym, który posłuży do korekty barwy), zmienna L to długość fali światła. Współczynnik Cskal zamieni procentową wartość jaskrawości na większy lub mniej- szy zestaw amplitud R, G, B. Ma tak dobraną wartość, by najwyższa amplituda z ta- blicy tecza[ ][ ] (czyli 63) przemnożona przez najwyższą jaskrawość (czyli 100 ) mieściła się w zakresie tolerowanym przez bibliotecznąi funkcję RGB(): (cid:11)7+!+723!8P-+(cid:12) Funkcja lambda_to_kolor() wykorzystuje wartości wcześniej zainicjowanych współ- czynników i nie traci już czasu na nic, poza przeliczeniem rzeczywistej wartości dłu- gości fali w naturalne wartości amplitud barw składowych i zebranie tych składowych do ostatecznego koloru. C:\Andrzej\PDF\C++ Builder. 20 efektownych programów\skład!!.doc 13 14 C++ Builder. 20 efektownych programów Najpierw następuje kontrola, czy podana długość fali wypada gdzieś w widzialnym skrawku nieskończonego widma fal elektromagnetycznych. Jeśli długość fali nie mie- ści się w zakresie widzialnym, zwracanym kolorem jest iczerń — nic nie widać. Potem kontrolujemy, czy jaskrawość mieści się w przyzwoitym zakresie procento- wym i wyliczamy pomocniczy współczynnik o nazwie jasn. Wreszcie obliczamy wej- ście do tablicy kolorów tecza[ ][ ]: 46+;.;)3367+! 7+ 4/6;7)336(cid:11)28(cid:12)46+;.;)336 9+/).691/1346+;.;)336 4/6;7)336 9o+/(cid:30)24   24   -,-+o3;8+(cid:30)24  Zmienna prawdziwy_kolor zazwyczaj jest wartością ułamkową. Jej część całkowita, uchwycona w zmiennej pierwszy_kolor, oznacza czysty kolor z tablicy tecza[ ][ ]. Jednak prawdziwy_kolor ma także część ułamkową — złamanie barwy w stronę na- stępnego elementu tablicy tecza[ ][ ]. Tak oto dokonujemy złamania czystego koloru ułamkiem drugiego: + 8/-+4/6;7)336 !+72 +8/-+4/6;7)336   !+72 (cid:11)28(cid:12)(cid:11)+  9+/).691/13!(cid:11)+ + (cid:12)(cid:12) Powyższy fragment algorytmu dotyczył wyliczenia amplitudy czerwieni, stąd indeks zero w elementach tablicy tecza[ ][ ]. Potem jeszcze powtarzamy tę recepturę dla zieleni i błękitu. Wreszcie syntetyzujemy ostatecznyi kolor. Tak naprawdę, sztuką nie jest napisanie powyższego programu. Jeśli ktoś dobrze przemyślał obiekt TSkalowanie, nie ma tu wiele do roboty. Jakaś tajemnica tkwi jed- nak w tablicy tecza[][], definiującej 15 kolejnych barw z tęczy w rozkładzie na kom- puterowe amplitudy czerwieni, zieleni i błękitu. W tablicy tej krzyżują się dwa świa- ty: prosty, logicznie skonstruowany świat komputerów i cała nasza niezbadana fizjologia, która falę o takiej a takiej długości każe postrzegać jako taką a taką barwę. Dobre tablice tecza[][] pewnie są sporo warte dla grafika — przyrodnika, który po- trzebuje barwy światła o długości fali, powiedzmy 0.000000512 m. Skąd wziąłem tę tablicę? Znalazłem w jakiejś książce fotografię tęczy. Leciutko, by nie niszczyć książki, narysowałem na tęczy 15 równoodległych linii. Mówiąc inaczej, zaznaczy- łem na niej 15 spektralnych barw bazowych. To był pierwszy punkt mojego chytrego algorytmu. W drugim punkcie poprosiłem o pomoc kilkoro małych dzieci. Posadziłem je przed komputerem i położyłem przed nimi fotografię tęczy z zaznaczonymi punktami. Na ekranie był program, umożliwiający syntezę barwy z nastaw trzech suwaków, ot taki mieszacz kolorów. Dzieci miały zadanie dobrania takiego położenia suwaków czer- wieni, zieleni i błękitu, by wymieszany kolor odpowiadał kolorowi z zaznaczonego punktu tęczy. Wystarczyło wynotować nastawy suwaków i wpisać je do tablicy tecza[][]. 14 C:\Andrzej\PDF\C++ Builder. 20 efektownych programów\skład!!.doc Rozdział 1.  Tytuł rozdziału 15 Przy okazji zauważyłem ciekawą właściwość małych dzieci — dokładnie wiedzą, kiedy kolor jest odpowiedni i kiedy trzeba przerwać poszukiwania. Dorosły poprawia, marudzi, doskonali i traci czas. Dziecko po prostu wiie. Każdy dopiero co napisany obiekt trzeba przetestować. W funkcji — reakcji na zda- rzenie OnPaint — umieścimy algorytm kreślenia wszystkich barw tęczy we wszyst- kich jaskrawościach. Zamalujemy tęczą wydzielony z okienka, prostokątny obszar. Oto treść funkcji: :3.))0+78-+$36 36 +28(cid:11)$,/-8!#/2./6(cid:12)  -327828/  (cid:26)/  (cid:26)/7/6/28 .8  (cid:26)/;7/28/18  .39,/+,.+(cid:26)+72 28(cid:26) $ .3;.3 .39,/;.3)7/6;.3 ) ;.3 ) $#+3;+2/7+(cid:11)/ (cid:26)/ (cid:26)/7/6(cid:26)/;7(cid:26) ;.3 ) ;.3)7/6 (cid:26) (cid:26);.3)$7/6(cid:26) (cid:12) 036(cid:11)/ /  /7/6 (cid:12)  +,.+7+ .+)6/+)(cid:11)(cid:12) 036(cid:11)/ /  /;7 (cid:12)  +727+ .+)6/+)(cid:11)(cid:12) +2:+7  /7;.3 +,.+)83)336(cid:10)+72(cid:11)+,.+(cid:12)    Ten program wymaga dołączenia do projektu plików modułów skala i widmo — pa- miętajmy zatem o wstępnych operacjach Add File to Project — dodaj pliki do pro- gramu. Nie zapomnijmy o doklejeniu dwóch nagłówków, które zapowiedzą kompi- latorowi, co oznaczają napisy TSkalowanie i TWidmo. W funkcji — reakcji na OnPaint — najpierw parametryzujemy obszar okienka prze- znaczony pod grafikę, ot taki rodzaj porządku. Potem deklarujemy zmienną typu TWidmo — jest to oczywiście zmienna obiektowa, złożona. Najważniejsze jest utwo- rzenie zmiennej typu TSkalowanie — w jej konstruktorze mamy precyzyjne opisanie teatru ekranowego i fizycznego. Teatr ekranowy nie wymaga specjalnych komentarzy — jest to okienko o miłych oku rozmiarach i położeniu. Teatr rzeczywisty natomiast zawiera się między LAMBDA_MIN i LAMBDA_MAX w poziomie oraz między warto- ścią 0 i 100 w pionie. W poziomie odłożymy wszystkie możliwe długości światła wi- dzialnego, w pionie wszystkie możliwe jaskrawości świaitła. Potem mamy popis możliwości obiektu skalującego. Dwie pętle przebiegają punkt po punkcie cały obszar okienkowy, ale następuje transformacja współrzędnych każdego punktu ekranowego do długości fali i do jaskrawości. Parametry te służą do wylicze- nia barwy, czyli do przetestowania poprawności działiania obiektu TWidmo. C:\Andrzej\PDF\C++ Builder. 20 efektownych programów\skład!!.doc 15 16 C++ Builder. 20 efektownych programów Zadania i problemy 1. Obiekt TWidmo nie nadaje się do pracy z grafiką 256-kolorową (bo w tym systemie mamy kolory arbitralnie ponumerowane, nie diynamicznie tworzone funkcją RGB()). Jednak okazuje się, że także kolory 16-bitowe (czyli niepełne RGB()), aczkolwiek tworzone poprawnie, wykazują jakąś ziarnistość. Receptą jest domieszanie niewielkiej skłaidowej pseudolosowej do każdej barwy — niech kolor będzie żółty, ale z ewenitualną domieszką okolicznych barw. Domieszka niech nie będzie duża — npi. 1 odchylenia od barw wyliczonych. Jak to zaimplementować? Odpowiedzi 1. Należy zaimplementować rozmywanie zarówno jaskrawości,i jak i długości fali. Gdzieś na samym początku funkcji lambda_to_kolor() dodajmy dwa wiersze, lekko psujące otrzymane argumenty: +7237- (cid:11)  6+2.3(cid:11)(cid:12)(cid:12)    !(cid:11)  (cid:11).39,/(cid:12)6+2.3(cid:11) (cid:12)  (cid:12) Pierwszy wiersz psuje całkowitą wartość zmiennej jasność, dodając do niej 1, 0 lub –1 (czyli na głębokość +/– 1 ). Drugi wiersz psuje rzeczywiistą wartość zmiennej lambda na głębokość +/– 0.1E–8 (czyli o dwa rzędy mniej niż podawana długość fali). To rzeczywiście pomaga usunąć ziiarnistość odwzorowania barwy! 16 C:\Andrzej\PDF\C++ Builder. 20 efektownych programów\skład!!.doc
Pobierz darmowy fragment (pdf)

Gdzie kupić całą publikację:

C++ Builder. 20 efektownych programów
Autor:

Opinie na temat publikacji:


Inne popularne pozycje z tej kategorii:


Czytaj również:


Prowadzisz stronę lub blog? Wstaw link do fragmentu tej książki i współpracuj z Cyfroteką: