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
Spis treci
Wstp ............................................................................................... 7
Rozdzia 1. Operacje na liczbach........................................................................ 11
Ile cyfr ma liczba? .............................................................................................................11
Program LCyf w Pascalu ............................................................................................11
Ptle w Pascalu ...........................................................................................................12
Ptle w C i C++...........................................................................................................13
Program LCyf w C++ .................................................................................................13
Uruchamianie programu w rodowisku programowania............................................14
Odwrcenie kolejnoci bitw liczby .................................................................................15
Program Bity w Pascalu..............................................................................................15
Program Bity w C++...................................................................................................16
Wyraenia przypisujce w C i C++ ............................................................................16
Zapis liczby w notacji rzymskiej.......................................................................................17
Program LRzym w Pascalu.........................................................................................18
Program LRzym w C++..............................................................................................19
Wskaniki a acuchy w C i C++ ...............................................................................20
Wspczynniki Newtona i trjkt Pascala.........................................................................20
Algorytm iteracyjny ....................................................................................................21
Algorytm rekurencyjny...............................................................................................22
Program TPascala w Pascalu ......................................................................................22
Program TPascala w C++ ...........................................................................................24
Tablicowanie funkcji Bessela............................................................................................24
Algorytm obliczania sumy szeregu liczbowego .........................................................25
Program FBessela w Pascalu ......................................................................................26
Program FBessela w C++ ...........................................................................................27
Formatowanie wydruku w funkcji printf ....................................................................28
wiczenia ..........................................................................................................................29
Spis treci
5
Program Lissa w Pascalu ............................................................................................98
Przekazywanie parametrw przez warto i referencj w C++ ................................100
Program Lissa w C++ ...............................................................................................101
Ukad planetarny .............................................................................................................102
Model komputerowy ukadu planetarnego ...............................................................103
Program Grawit w Pascalu........................................................................................104
Program Grawit w C++.............................................................................................107
Hipocykloida ...................................................................................................................109
Obliczanie wsprzdnych punktw .........................................................................109
Algorytm animacji oparty na kopiowaniu fragmentw obrazu ................................110
Dynamiczne przydzielanie i zwalnianie pamici......................................................111
Program Hipo w Pascalu...........................................................................................112
Program Hipo w C++................................................................................................113
Elementy charakterystyczne dla C++ .......................................................................114
wiczenia ........................................................................................................................115
Rozdzia 3.
Grafika
Jednym ze sposobw tworzenia grafiki na ekranie monitora komputerowego jest skadanie obrazu z podstawowych elementw graficznych, takich jak punkty, odcinki proste, wielokty i okrgi, oraz wypenianie obszarw zadanym kolorem lub wzorcem.
Wszystkie programy zawarte w tym rozdziale dziaaj na tej zasadzie, korzystaj z biblioteki BGI (ang. Borland Graphics Interface interfejs graficzny firmy Borland)
i pracuj w 16-kolorowym trybie graficznym VGA o rozdzielczoci ekranu 640480
pikseli. Dotycz one nastpujcych zagadnie:
rysowanie trjkta Sierpiskiego (gra w chaos),
krelenie wielokta foremnego i gwiazdki,
wyznaczanie najmniejszego wielokta wypukego zawierajcego dany zbir
punktw,
zliczanie liter w pliku tekstowym i zobrazowanie wyniku w formie wykresu
supkowego,
tworzenie wykresu funkcji drga harmonicznych tumionych.
Gra w chaos
Niekiedy bardzo proste algorytmy prowadz do zaskakujcych wynikw. Jednym
z nich jest zaprezentowany poniej algorytm generowania obrazu, zwany gr w chaos1.
Rysunek utworzony na ekranie monitora zaskakuje szczeglnie, poniewa cae postpowanie jest oparte na losowoci, czyli niemonoci przewidywania, chaosie.
Waciwie jest to jedna z gier polegajcych na losowym wyborze jednej z kilku prostych regu
postpowania. Przykad zaczerpnito z ksiki [8].
54
Jaki bdzie rezultat wykonania duej liczby powtrze wyznaczania nastpnego punktu wiodcego i rysowania go na ekranie? Wydaje si oczywiste, e jeli punkt wiodcy Q0 zosta wybrany na zewntrz trjkta P0P1P2, to po niewielkiej liczbie krokw
kolejny wyznaczony punkt wiodcy dostanie si do wntrza tego trjkta. Ponadto
gdy jaki punkt wiodcy znajdzie si we wntrzu trjkta, kady nastpny tam pozostanie. Mona wic przypuszcza, e po duej liczbie iteracji punkty wiodce zapeni
losowo wntrze trjkta. Aby si przekona, czy rzeczywicie tak bdzie, wystarczy
napisa i uruchomi prosty program.
Symulacja zdarze losowych na komputerze wymaga odpowiedniego podprogramu
generujcego liczby losowe. Naley jednak sobie uwiadomi, e generator taki dziaa
wedug cile okrelonego algorytmu, a dostarczone przez niego liczby jedynie sprawiaj wraenie losowoci. Bardziej stosowne jest wic nazywanie ich liczbami pseudolosowymi.
Rozdzia 3. Grafika
55
Zazwyczaj przed wykorzystaniem generatora inicjuje si go za pomoc bezparametrowej procedury
. Generator niezainicjowany tworzy taki sam cig liczb za
kadym uruchomieniem programu, co mona wykorzysta podczas testowania programu. Peny kod rdowy programu w Turbo Pascalu realizujcego gr w chaos jest
przedstawiony na wydruku 3.1.
Wydruk 3.1. Program Chaos.pas realizujcy gr w chaos
!"##$%&'($"(")*"+
!"##$%&'*,-)"-)"+
.
/
01
/
2'34564723+
')-"+
/'-8"+
&09*",""""
/
'(+
':!
%+.$
/'/: !
%+.$
&0;"661'/ +
1
#
cieka dostpu podana w wywoaniu procedury 2, okrelajca miejsce sterownika karty
graficznej (plik egavga.bgi), moe by inna w przypadku innego komputera.
56
Wynik utworzony przez program na ekranie monitora jest pokazany na rysunku 3.2.
Uwiadamia on, jak zawodna moe by intuicja. Wygenerowany obraz przedstawia
tzw. trjkt Sierpiskiego. Jest on zbiorem punktw wyjtkowo uporzdkowanym,
niemajcym wydawaoby si nic wsplnego z chaosem i losowoci.
Rysunek 3.2.
Trjkt Sierpiskiego
po 50 000 krokach
gry w chaos
Rozdzia 3. Grafika
57
&'0;"+1'/CD+
?
'+
1
'+
?
Rysunek 3.3.
Wielokt foremny
wpisany w okrg
y = r sin + q,
0 2
58
2
n
k = k
czyli korzystajc ze wzorw:
x k = r cos k + p,
y k = r sin k + q
Zmiana znaku (minus zamiast plus) w wyraeniu wystpujcym w roli drugiego parametru w wywoaniu procedury wynika z dziwnego zaoenia przyjtego przez
projektantw komputera i twrcw rodowiska programowania, i pocztek ukadu
wsprzdnych znajduje si w lewym grnym rogu ekranu, a o y jest skierowana
w d3. Funkcja
zostaa wykorzystana w celu zaokrglenia wartoci rzeczywistej
do najbliszej wartoci cakowitej, uycie typu rzeczywistego spowodowaoby bd
(type mismatch niezgodno typu). Rwnie dobrze mona tu wykorzysta funkcj
, ktra obcina warto rzeczywist do czci cakowitej.
W tym przypadku zmiana znaku nie ma znaczenia z uwagi na symetri wielokta wzgldem prostej
rwnolegej do osi x i przechodzcej przez jego rodek S.
Rozdzia 3. Grafika
59
Niech P0 , P1 ,....Pn = P0 bd wierzchokami gwiazdki lecymi, podobnie jak w przypadku wielokta foremnego, na okrgu o promieniu r i rodku S = ( p, q ) , niech rwnie promie okrgu czcy punkty S i P0 bdzie rwnolegy do osi y. Natomiast
niech Q1 , Q2 ,..., Qn bd wierzchokami gwiazdki lecymi na drugim okrgu o promieniu r1 i rodku S. Wsprzdne punktw Qk = (u k , v k ) dla k = 1,2,..., n mona
take wyznaczy z rwna parametrycznych okrgu. Promienie, ktrych kocami s
punkty Qk , s obrcone wok rodka S zgodnie z ruchem wskazwek zegara (kierunek ujemny) o kt /2 wzgldem promieni, ktrych kocami s punkty Pk . Zatem
spenione s rwnoci
60
u k = r1 cos k + p, v k = r1 sin k + q
w ktrych
k = k
= k
n
2
Rozdzia 3. Grafika
61
9$!1
%
92
$$9 $!9$
2
$$:$$%
!;(<(=<+(%
$
>
Program wczytuje z klawiatury liczb n ramion gwiazdki i promie r okrgu okrelajcego jej wielko, przecza kart graficzn w tryb graficzny, ustawia kolor rysowania linii ( jasnoczerwony) i styl wypeniania obszarw (
peny,
kolor
ty). Nastpnie rysuje porodku ekranu gwiazdk o 2n wierzchokach lecych na przemian na okrgach o promieniach r i r/2, a w kocu zapenia j,
poczynajc od rodka. Gdy uytkownik wybierze dowolny znak na klawiaturze, program powraca do trybu tekstowego i koczy dziaanie.
62
Zazwyczaj przejcie od rodowiska Turbo Pascala do Borland C++ nie sprawia kopotw, gdy wykorzystuje si rwnowane biblioteki standardowe. Nazwy zdefiniowanych w bibliotekach staych i podprogramw s w obu rodowiskach takie same, z tym
e w C++ pierwsze pisane s duymi, a drugie maymi literami. Zdarzaj si jednak
niespodzianki, czego przykadem s stae
i (pene wypenianie
obszarw) uyte w dwch ostatnich programach (por. wydruki 3.3 i 3.4).
Rozdzia 3. Grafika
y = p( x) =
63
y j yi
( x xi ) + yi
x j xi
Ptla
przebiega kolejno punkty i bada ich pooenie wzgldem prostej wyznaczonej przez punkty o indeksach i i j. Istotne dziaania s podejmowane, gdy rozpatrywany punkt nie ley na prostej (v 0). Wtedy zmiennej z przypisana zostaje warto 1,
gdy punkt ley poniej prostej, albo 1, gdy powyej. Dalsze postpowanie zaley od
wartoci zmiennej s. Warto zerowa s oznacza, e napotkany punkt jest pierwszym,
ktry nie ley na prostej, a wtedy jego pooenie wzgldem niej (liczba 1 lub 1) zostaje zapamitane w zmiennej s. Z kolei niezerowa warto s okrela pooenie wszystkich dotd uwzgldnionych punktw. Jeli jest ona rna od wartoci z, le one po innej stronie prostej ni rozpatrywany punkt. W takim przypadku ptla zostaje przerwana,
wykonanie podprogramu zakoczone, a rezultatem wywoania funkcji jest warto
oznaczajca, e odcinek wyznaczony przez punkty Pi i Pj nie naley do brzegu
wielokta. Jeeli wszystkie punkty le po jednej stronie prostej lub na niej, ptla zostaje zakoczona w sposb naturalny, a do miejsca wywoania funkcji zostaje przekazana warto oznaczajca, e odcinek PiPj stanowi fragment brzegu wielokta.
Funkcja Brzeg wymaga udoskonalenia, poniewa nie zadziaa prawidowo w przypadku, gdy punkty Pi i Pj wyznaczaj prost pionow, tj. gdy xi = x (ang. divide by
zero dzielenie przez zero). Mona temu zaradzi, wyliczajc wartoci dx = xi x j
i dy = y i y j , ktre posu do wybrania jednego z dwch rwna prostej, w zalenoci od jej kta nachylenia wzgldem osi x. I tak, dla dx dy , tj. gdy nachylenie
prostej nie przekracza kta 45o, korzystamy ze wzoru
64
y=
dy
( x xi ) + y i
dx
natomiast dla dx < dy , czyli dla nachyle wikszych, traktujemy zmienn x jako zalen od zmiennej y, co prowadzi do wzoru
y=
dy
( x xi ) + y i
dx
Rozdzia 3. Grafika
65
LLJIK0LJ
K
JIK0 J
K
'!L<%! <%FL
<
'#
'!@A
%!@AI%
)
')
!L%A)
! %
& +L,!LJK0LJ
K%/ J
K0 JK
$
&L+ ,! JK0 J
K%/LJ
K0LJK
'&@A<
)
'&A<#$
0#
'
<
$
'
@AFL
8
N
&
I
)
'
#
)
1
!LJ
K0( J
K0(LJ
K/( J
K/(%
1
!LJ
K0( J
K/(LJ
K/( J
K0(%
'
#0#
'I
/#
'8!
I%1
!LJ
K J
KLJIK JIK%
)
IG
6
!47.*7864%
N
$
>
Nazwa pliku jest podawana z klawiatury. Przyjto zaoenie, e plik zwiera co najwyej 1000 wierszy, tj. n 1000, oraz e wiersze pliku zawieraj po dwie liczby cakowite, oddzielone co najmniej jedn spacj, okrelajce wsprzdne ekranowe kolejnego punktu:
66
W funkcji Brzeg dodatkowo zabezpieczono si przed bdem w patologicznym przypadku, gdy parametry okrelaj punkty o takich samych wsprzdnych: dla dx = dy =
0 obliczenia s przerywane, wynikiem wywoania funkcji jest warto . Korzystajcy z funkcji Brzeg podprogram UtworzRysunek najpierw rysuje wszystkie punkty, a nastpnie sprawdza, czy punkty o indeksach 1 i < j n okrelaj odcinki na
brzegu najmniejszego wielokta wypukego, i w przypadku spenienia warunku odcinki takie rysuje. Tym razem wygodniejszym narzdziem rysowania jest procedura
, ktra wymaga czterech parametrw reprezentujcych wsprzdne pocztku
i koca odcinka. W przeciwiestwie do
, nie przenosi ona pisaka do koca rysowanego odcinka.
Rozdzia 3. Grafika
67
B
!&A<%S#0#
'!
<%
$
'!
Q%<
C
#
C
&
!%
B
I
'!
<
@
//%
B
$
!LJ
K0( J
K0(LJ
K/( J
K/(%
$
!LJ
K0( J
K/(LJ
K/( J
K0(%
C
'!
<
@0#
//%
'!I
/#I@I//%
'!)!
I%%$
!LJ
K J
KLJIK JIK%
C
&
!%
B
'! I!%%
B
!EED7787786D%
!%
!%
$
!%
C
$
B
'!DM
$
7D%
!%
C
C
Program rwnie rozpoczyna dziaanie od wczytania danych z pliku tekstowego, wykorzystujc funkcj czytajdane. Jednake w przypadku podania przez uytkownika
niewaciwej nazwy pliku, informuje o nieudanym otwarciu pliku, a nie koczy si
bdem (ang. file not found plik nieznaleziony). Parametrami funkcji
s nazwa pliku i tryb jego otwarcia (r oznacza odczyt, t plik tekstowy). Wartoci funkcji jest wskanik do struktury typu , gdy plik zosta otwarty, bd tzw. wskanik
pusty , gdy z rnych przyczyn pliku nie udao si otworzy. Funkcja
zamyka plik.
Do wczytania dwch wsprzdnych kolejnego punktu uyto funkcji . Jej wywoanie, zamieszczone w warunku kontynuacji ptli
, daje warto rwn liczbie
wczytanych pl, gdy operacja czytania powioda si, bd warto (ang. end of
file koniec pliku), gdy napotkano koniec pliku. Cztery parametry wywoania oznaczaj kolejno: wskanik do pliku, format czytanych danych (symbole formatujce
odnosz si do liczb cakowitych dziesitnych) i dwa wskaniki okrelajce elementy
tablic, ktrych wartoci maj by wczytane.
68
!"'#
i
!"(#
i
!"+#
i
................
!%,
!",#
i
................
oraz
!"'#
!"(#
!"+#
i &!
i &)!%(*
i &)!%+*
..................
!",#
i &)!%,*
..................
Najpierw obliczane jest pierwsze wyraenie. Jeli jego warto jest rna od zera, obliczana jest warto drugiego wyraenia i ona zostaje potraktowana jako warto caego wyraenia warunkowego. W przeciwnym przypadku obliczana jest warto trzeciego wyraenia i ona zostaje przyjta jako warto wynikowa. Tak wic spord dwch
wyrae, drugiego i trzeciego, obliczane jest tylko jedno.
Prostym przykadem uycia wyraenia warunkowego jest wyznaczenie wartoci c jako wikszej z a i b. Mona oczywicie zastosowa instrukcj warunkow
'!A)%
$
)
Rozdzia 3. Grafika
69
70
Rozdzia 3. Grafika
71
sokoci 440 pikseli, odpowiada literze, ktra pojawia si w pliku najczciej. Licznik
wystpie tej litery jest maksymaln wartoci wszystkich elementw tablicy L. Wyznacza si go w zmiennej Max wedug schematu:
jeeli kolejny element ma warto wiksz od dotychczasowej wartoci zmiennej
Max, przypisz zmiennej Max warto tego elementu.
Elementy s nieujemne, na wstpie naleao wic wyzerowa zmienn Max. Jednake
z uwagi na obliczanie wysokoci supka litery c ze wzoru
h(c ) =
L[c]
440
Max
72
Rozdzia 3. Grafika
73
&
!%
B
'!$
!%%
B
!EG
&E-D7787786D%
!%
!%
$
!%
C
$
B
'!DM
$
7D%
!%
C
C
Wystpujca w funkcji liczenie definicja zmiennej c, sucej do pamitania kolejnego znaku pobranego z pliku, moe rodzi pytanie: dlaczego zmienna ta jest typu ,
a nie typu ? Powodem uycia typu zamiast jest typ wartoci zwracanych
przez funkcj , ktra czyta znak z pliku i zwraca go jako warto wynikow,
a w przypadku napotkania koca pliku zwraca warto odpowiadajc nazwie symbolicznej , okrelon w pliku nagwkowym stdio.h jako 1. Tak wic wartociami zwracanymi przez funkcj s wszystkie moliwe znaki i dodatkowa warto
1 typu , ktra binarnie jest cigiem samych jedynek. Przeksztacenie jej do typu
polega na obciciu tego cigu do 8 bitw, co daje warto 2555. Zatem gdyby
zmienna c bya typu , program zawieszaby si, poniewa wykrycie koca pliku
powodowaoby przypisywanie zmiennej c wartoci 255, w efekcie warunek kontynuacji ptli byby zawsze speniony.
Przy wczonej opcji Uunsigned characters kompilator Borland C++ traktuje wartoci typu jak
(liczby cakowite bez znaku). Domylnie opcja ta jest wczona.
74
Wykres funkcji
drga harmonicznych tumionych
Sporzdzenie wykresu funkcji cigej jednej zmiennej sprowadza si do obliczania
wartoci tej funkcji w odpowiednio duej liczbie punktw rozpatrywanego przedziau
i narysowania linii amanej o wyznaczonych w ten sposb wierzchokach punktach
paszczyzny. W celu zobrazowania wykresu na ekranie monitora komputerowego konieczne jest przejcie od rzeczywistego ukadu wsprzdnych, w ktrym zdefiniowana
jest funkcja, do ukadu ekranowego. Operacja ta, zwana okienkowaniem (ang. windowing), dotyczy dwch obszarw prostoktnych o bokach rwnolegych do osi wsprzdnych: okna w ukadzie rzeczywistym i widoku (ang. viewport) w ukadzie ekranowym [2].
Rozdzia 3. Grafika
75
Takie rozwizanie pozwala na wygodne okrelanie rozmiarw rysunku i jego umiejscowienie na ekranie6. Wystarczy ustali parametry tego prostokta i wyliczy granice widoku ze wzorw:
xVmax = xE max dx s
yVmax = yE max + dy + s
gdzie dx i dy s odstpami (poziomym i pionowym) granic prostoktw rwnymi dugociom odcinkw osi wystajcych poza widok, a s dugoci strzaki koczcej te
odcinki. Wartoci dx, dy i s mona dobra eksperymentalnie, kierujc si wzgldami
estetycznymi. Uycie znaku : (minus) zamiast % (plus) we wzorach okrelajcych
wsprzdne y widoku jest konsekwencj faktu, i na ekranie o y jest skierowana
w d. Jest oczywiste, e gdy o nie jest rysowana, stosowne brzegi obu prostoktw
pokrywaj si.
Odwzorowanie opisujce przejcie od wsprzdnych ( xR, yR) okna w ukadzie rzeczywistym do wsprzdnych ( xV , yV ) widoku w ukadzie ekranowym ma posta:
xV = xV min + sx ( xR xR min ),
yV = yV min + sy ( yR yR min )
sx =
xVmax xV min
yV max yVmin
, sy =
xRmax xR min
yR max yRmin
76
y = A e bx cos( x + )
Wzr przedstawia amplitud (przemieszczenie) y drgajcego punktu materialnego
w zalenoci od czasu x. Staa A oznacza amplitud w chwili pocztkowej, b czynnik tumicy, czstotliwo drga, faz pocztkow. Wartoci A, b i s
liczbami dodatnimi. Wielko amplitudy zawiera si pomidzy dwoma asymptotami
Amin ( x) = A e bx y A e bx = Amax ( x)
i zanika w czasie, dc do zera.
Na wydruku 3.9 przedstawiony jest peny program w Turbo Pascalu tworzcy wykres
drga harmonicznych dla parametrw A = 3, b = 1/2, = 5 i = 0 w przedziale czasowym od 0 do 2. Podstawowymi skadowymi programu s:
funkcje xV i yV opisujce przejcie od ukadu rzeczywistego do ekranowego,
funkcje Amax i Amin stanowice deklaracje obydwu asymptot,
funkcja Ruch opisujca drgania harmoniczne tumione,
procedura Ustaw_Paramery nadajca wartoci wszystkim zmiennym
globalnym,
procedura Rysuj_Uklad rysujca osie ukadu wsprzdnych,
procedura Rysuj_Wykres rysujca wykres funkcji.
Wydruk 3.9. Program Drgania.pas tworzcy wykres funkcji drga harmonicznych tumionych
!"" #
$
%!%!% ! !%%
%&%&% & &%%%% %
'
(%)
%(%!)
*
%!(%+(%!,%!))-%
( !)
Rozdzia 3. Grafika
*
!( +( !, !))-
%(%)
*
%.+%(,/01+%)
(%)
*
, %(%)
!(%)
*
! %(%)+(1+%)
23
4
$
*
%&/%&%5%6
&5%7 &%/
%!/%!%8+4
! (%!) !% %(%!)
(%&%,%&)$81
%%&-%%%&%,,9
( &%, &)$81
&- % &%,-9
%(%%,%):(%!%,%!)
( %, ):( !%, !)
!
2
$
*
(/)
5$;(%&)<;(%&%)
<!(,9,.)5$;(%&%)<!(,9.)
=;%67(%&%,9,>?@%@)
%(/)
5$;( &)<;( &%)
<!(,.9)5$;( &%)<!(.9)
=;%67(,>? &%@ @)
!
('
)
$
%
*
5$;(% ((%!)))
%%->%%
<;(% ((%!-(%,%):%)))
77
78
Procedura Ustaw_Parametry wykonuje szereg wanych operacji pomocniczych. Najpierw okrela usytuowanie i wielko prostokta obejmujcego rysunek, przypisujc
zmiennym xEmin, xEmax, yEmin i yEmax stosowne wartoci kracowe. Proponowany prostokt zajmuje cay ekran, poniewa jego lewy grny rg jest umiejscowiony
w punkcie (0, 0), a prawy dolny w punkcie (, ). Funkcja podaje maksymaln warto wsprzdnej x, a maksymaln warto wsprzdnej y ekranu graficznego (dla trybu
s to liczby 639 i 479). Nastpnie procedura
Ustaw_Parametry wyznacza okno w ukadzie rzeczywistym, przypisujc zmiennym
xRmin i xRmax wartoci kocw rozpatrywanego przedziau czasowego, a zmiennym
yRmin i yRmax minimaln i maksymaln amplitud. Kolejne obliczenia dotycz ustalenia kracw widoku w ukadzie ekranowym. Poniewa na rysunku maj by pokazane odcinki obu osi ukadu wsprzdnych, granice widoku s przesunite wzgldem
granic prostokta obejmujcego cay rysunek o 1/25 jego szerokoci i 1/25 wysokoci, z uwzgldnieniem strzaek o dugoci 8 pikseli. Wartoci wynikowe zostaj zapamitane w zmiennych xVmin, xVmax, yVmin i yVmax. Na koniec procedura wylicza
w zmiennych sx i sy czynniki skalujce, ktre s wykorzystywane przez funkcje xV i yV.
Uproszczenia wynikajce z dbaoci o niewielki i czytelny kod programu sprawiy, e
procedura Ustaw_Parametry nie umoliwia okrelania parametrw drga harmonicznych (A, b, i ) i zakresu czasowego (xRmax), ani ustalania rozmiaru i pooenia
rysunku na ekranie (xEmin, xEmax, yEmin, yEmax). Czytelnik moe takie udoskonalenia wprowadzi, modyfikujc kod programu (podprogramy Amax, Ruch i Ustaw_
Parametry).
Procedura Rysuj_Uklad jest bardzo prosta. Rysuje odcinki osi ukadu wsprzdnych,
koczc je strzakami i opisujc tradycyjnymi jednoliterowymi nazwami x i y. Strzaki s skadane z dwch krtkich odcinkw za pomoc procedury
, ktra rysuje
odcinek od biecej pozycji pisaka do jego nowej pozycji przesunitej o okrelon
liczb pikseli.
Rozdzia 3. Grafika
79
Turbo Pascal rozrnia wskaniki 16-bitowe ( bliskie) i 32-bitowe ( dalekie). Nazwa
podprogramu jest wskanikiem, a gdy wystpuje jako parametr, musi by wskanikiem 32-bitowym.
W rodowiskach 32-bitowych sowa i s ignorowane.
80
Powrmy do deklaracji podprogramu rysowania funkcji. Prawidowym jego parametrem okrelajcym funkcj, ktrej wykres ma by tworzony, jest
*(+)(*)
Rozdzia 3. Grafika
81
I
$3
()
H
%&/%&%%%()
&% () &%/
%!/%!%8+5
4A
! (%!) !% %(%!)
%%&-((%&%,%&):81)
%%%&%,,9
&-(( &%, &):81)
% &%,-9
%(%%,%):(%!%,%!)
( %, ):( !%, !)
I
$
()
H
$(%& (/))(%&%)
(,9,.)$(%&%)(,9.)
%% (%&%,9,>?J%J)
$(%(/) &)( &%)
(,.9)$( &%)(.9)
%% (,>? &%J J)
I
$
3
(*(+)(*))
H
$(% ((%!)))
(%%->%F%%%--)
(% ((%!-(%,%):%)))
I
$()
H
(KK!""JBBCBBCAJ)
3
()
(7 L)
()
3
( %)
3
( )
(#A;&)
3
(!)
()
()
I
W funkcji rysuj_wykres skorzystano z powszechnie stosowanego w C++ udogodnienia deklarowania zmiennej w wyraeniu inicjujcym ptli . Dotyczy to zmiennej
xV penicej rol licznika ptli. Tak zadeklarowana zmienna jest dostpna od miejsca
jej zadeklarowania do koca bloku obejmujcego ptl, w tym przypadku do koca
funkcji rysuj_wykres.
82
wiczenia
wiczenie 3.1
Trjkt Sierpiskiego mona wygenerowa, korzystajc z ukadu trzech tzw. iterowanych odwzorowa, ktre punktowi (x, y) przyporzdkowuj punkt (x, y) na podstawie rwna:
a) x = 0,5x,
y = 0,5y
b) x = 0,5x + 0,5,
y = 0,5y
c) x = 0,5x + 0,25,
y = 0,5y + 0,5
Algorytm jest rwnie prosty jak w przypadku omwionej na pocztku tego rozdziau
gry w chaos, stanowi waciwie jej odmian. Na pocztku wybieramy dowolny punkt
(x0, y0). Nastpnie losujemy jedno z trzech odwzorowa i wyznaczamy punkt (x1, y1)
jako obraz punktu (x0, y0) przeksztaconego przez wylosowane odwzorowanie. Losowanie odwzorowania i wyznaczanie kolejnego punktu powtarzamy, np. 50 000 razy.
Otrzymany cig punktw, po ewentualnym pominiciu pewnej liczby pocztkowych
elementw, tworzy trjkt Sierpiskiego zawarty w kwadracie [0, 1][0, 1]. Przedstawienie go na ekranie monitora wymaga odwzorowania tego kwadratu do stosownego widoku w ukadzie ekranowym. Napisa program rysujcy w ten sposb trjkt
Sierpiskiego.
wiczenie 3.2
Napisa program, ktry rysuje li paprotki Barnsleya8, wykorzystujc ukad czterech
iterowanych odwzorowa losowanych z rnym prawdopodobiestwem p:
a) x = 0,849x + 0,037y + 0,075,
p = 0,74
p = 0,13
p = 0,11
d) x = 0,500,
p = 0,02
y = 0,160y,
Podany nierwnomierny rozkad prawdopodobiestwa mona uzyska, rozrniajc cztery zakresy wartoci losowych Random(100): 0 73, 74 86, 87 97
i 98 99.
wiczenie 3.3
Zmodyfikowa procedur rysowania gwiazdki (wydruki 3.3 i 3.4) tak, aby jedno jej rami byo skierowane w gr. Napisa program przedstawiajcy flag USA, ktry wykorzystuje tak zmodyfikowan procedur do rysowania 50 gwiazdek picioramiennych.
8
Trjkt Sierpiskiego i paprotka Barnsleya s tzw. fraktalami. Te i inne przykady fraktali oraz ich
metody generowania mona znale np. w ksikach [6, 8, 9].
Rozdzia 3. Grafika
83
wiczenie 3.4
Napisa program, ktry tworzy wykres funkcji
y = sin x cos 3 x
1
1 2
cos 2 x +
x 1,
4
20
x [2 ,2 ]
Przed sporzdzeniem wykresu program powinien wyznaczy wysoko okna w ukadzie rzeczywistym, znajdujc minimaln i maksymaln warto funkcji. Obliczenia te
nie musz by bardzo dokadne, wystarczy porwna wartoci funkcji w punktach
dzielcych przedzia np. na 100 rwnych odcinkw.
wiczenie 3.5
W obliczeniach numerycznych korzysta si niekiedy z wielomianw Czebyszewa, ktre mona zdefiniowa nastpujco:
T0 ( x) = 1
T1 ( x) = x
Tk ( x) = 2 xTk 1 ( x) Tk 2 ( x) (k = 2,3,...)
Ich wartoci bezwzgldne dla x nalecych do przedziau [-1, 1] nie przekraczaj wartoci 1. Napisa program, ktry w jednym widoku, odpowiadajcemu oknu [-1, 1][-1, 1],
rysuje wykresy kilku pocztkowych wielomianw Czebyszewa.