Rozdział 17


Grafika

 

Podsumowanie

PLOT, DRAW, CIRCLE
POINT
piksele

 

W tym rozdziale zobaczymy, jak rysować obrazy na ZX Spectrum. Część ekranu do twojej dyspozycji ma 22 wiersze po 32 kolumny, co daje razem 22*32=704 pozycje znakowe. Być może pamiętasz z Rozdziału 16, że każda z tych pozycji znakowych składa się z matrycy 8 na 8 punktów, które nazywamy pikselami (ang. pixel = picture element - element obrazu).

Piksel jest określany przez dwie liczby, jego współrzędne. Pierwsza z nich, jego współrzędna x, mówi, jak daleko znajduje się od lewej krawędzi ekranu. A druga, jego współrzędna y, mówi, jak daleko jest u gry od spodu ekranu. Współrzędne te zwykle zapisuje się jako parę w nawiasach, więc (0,0), (255,0), (0,175) i (255,175) to odpowiednio narożniki lewy dolny, prawy dolny, lewy górny i prawy górny.

 

Polecenie

 

PLOT współrzędna x, współrzędna y

 

wypełnia kolorem tuszu piksel na tych współrzędnych, zatem ten ospowaty program

 

10 PLOT INT (RND*256), INT (RND*176): INPUT a$: GO TO 10

 

rysuje punkt w przypadkowym punkcie za każdym razem, gdy naciśniesz ENTER.

 

Oto nieco bardziej interesujący program. Rysuje on wykres funkcji SIN (falę sinusoidalną) dla wartości pomiędzy 0 a 2π.

 

10 FOR n=0 TO 255
20 PLOT n,88+80*SIN (n/128*PI)
30 NEXT n

 

Ten następny program rysuje wykres SQR (część paraboli) pomiędzy 0 i 4

 

10 FOR n=0 TO 255
20 PLOT n,80*SQR (n/64)
30 NEXT n

 

Zwróć uwagę, że współrzędne pikseli dosyć się różnią od wierszy i kolumn w elemencie AT. W Rozdziale 15 umieszczony jest rysunek ekranu, który ci się może przydać, gdy będziesz ustalał współrzędne pikseli dla danych wierszy i kolumn.

 

Aby pomóc ci w rysowaniu obrazków, komputer narysuje ci linie proste, okręgi oraz ich części przy pomocy poleceń DRAW i CIRCLE.

 

Polecenie DRAW dla narysowania prostej linii przyjmuje postać

 

DRAW x,y

 

Punktem początku linii jest piksel, na którym zakończyło działanie ostatnie polecenie PLOT, DRAW lub CIRCLE (nazywa się to pozycją PLOT; RUN, CLEAR, CLS i NEW ustawiają ją w lewym dolnym narożniku ekranu na współrzędnych (0,0)), a punktem końcowym jest piksel na współrzędnych (x,y). Polecenie DRAW samodzielnie określa długość i kierunek linii, lecz nie jej punkt początkowy.

Eksperymentuj z kilkoma rozkazami PLOT i DRAW, na przykład

 

PLOT 0,100: DRAW 80,-35
PLOT 90,150: DRAW 80,-35

 

Zauważ, że liczby w poleceniu DRAW mogą być ujemne, chociaż liczby w poleceniu PLOT nie mogą.

Możesz również rysować punkty i linie w kolorze, chociaż musisz pamiętać, że kolory zawsze pokrywają całą pozycję znakową i nie można ich określić dla pojedynczych pikseli. Gdy piksel zostaje umieszczony na ekranie, jest ustawiany tak, aby pokazywał pełny kolor tuszu, a cała pozycja znakowa, w której się znajduje, otrzymuje bieżący kolor tuszu. Ten program demonstruję to zjawisko:

 

10 BORDER 0: PAPER 0: INK 7: CLS: REM zaczerniamy ekran
20 LET x1=0: LET y1=0: REM poczatek linii
30 LET c=1: REM kolor tuszu, zaczynamy od niebieskiego
40 LET x2=INT (RND*256): LET y2=INT (RND*176): REM przypadkowy punkt konca linii
50 DRAW INK c;x2-x1,y2-y1
60 LET x1=x2: LET y1=y2: REM kolejna linia rozpocznie sie w koncu poprzedniej
70 LET c=c+1: IF c=8 THEN LET c=1: REM nowy kolor
80 GO TO 40

 

 

Linie wydają się coraz grubsze w miarę działania programu, a dzieje się tak dlatego, iż linia zmienia kolory wszystkich pikseli w kolorze tuszu we wszystkich pozycjach znakowych, przez które przechodzi. Zwróć uwagę, iż możesz osadzać elementy PAPER, INK, FLASH, BRIGHT, INVERSE i OVER w poleceniu PLOT lub DRAW tak samo, jak możesz to robić z PRINT oraz INPUT. Idą one pomiędzy słowo kluczowe a współrzędne i kończą się albo średnikiem, albo przecinkiem.

 

Dodatkową frajdą z DRAW jest to, że możesz użyć go do rysowania fragmentów okręgów zamiast prostych linii przez dodanie dodatkowej liczby, która określa kąt zatoczenia łuku; postać jest następująca

 

DRAW x,y,a

 

x i y są używane do określania punktu końcowego linii tak samo jak przedtem, natomiast a jest liczbą radianów, które linia musi zatoczyć w miarę swojego postępu — jeśli a jest dodatnie, to skręca w lewo, natomiast dla ujemnego a skręca w prawo. Innym sposobem patrzenia na a jest przyjęcie, że pokazuje ono ułamek pełnego okręgu, który zostanie narysowany: pełny okrąg ma 2π radianów, więc jeśli a=π, to narysuje pół okręgu, jeśli a=0.5*π, to otrzymasz ćwiartkę okręgu, i tak dalej.

 

Na przykład, załóżmy, że a=π. To bez względu na wartości jakie przyjmą x i y, zostanie narysowany półokrąg. Uruchom

 

10 PLOT 100,100: DRAW 50,50, PI

 

co narysuje to:

 

 

Rysowanie rozpoczyna się w kierunku południowo-wschodnim, lecz gdy się zakończy, będzie zmierzać na północny zachód: w międzyczasie obróciło się dookoła o 180 stopni lub π radianów (wartość a).

Uruchom ten program kilka razy z PI zastąpionym różnymi innymi wyrażeniami — np. -PI, PI/2, 3*PI/2, PI/4, 1.0.

 

Ostatnim poleceniem w tym rozdziale jest CIRCLE, które rysuje pełny okrąg. Określasz współrzędne środka i promień okręgu przy użyciu

 

CIRCLE współrzędna x, współrzędna y, promień

 

Tak samo jak z PLOT i DRAW możesz wstawiać na początku polecenia CIRCLE różne rodzaje kolorowych elementów.

 

Funkcja POINT mówi ci, czy piksel ma kolor tuszu, czy papieru. Ma ona dwa argumenty, współrzędne tego piksela (i muszą one być ujęte w nawiasy), a wynikiem jest 0 dla piksela w kolorze tła i 1 dla piksela w kolorze tuszu. Wypróbuj

 

CLS: PRINT POINT (0,0): PLOT 0,0: PRINT POINT (0,0)

 

Wpisz

 

PAPER 7: INK 0

 

i zbadajmy, jak INVERSE i OVER działają wewnątrz polecenia PLOT. Oddziaływają one tylko na dany piksel, a nie na resztę pozycji znakowej. Są zwykle wyłączone (0) w poleceniu PLOT, zatem wystarczy ci je wspomnieć, aby się włączyły (1).

 

Oto lista wszystkich możliwości do wglądu:

PLOT

-

to jest zwykła postać. Rysuje punkt, tj. ustawia piksel tak, aby był koloru tła

PLOT INVERSE 1

-

to drukuje kropkę wymazującą w kolorze tła, tj. ustawia piksel tak, aby był koloru papieru.

PLOT OVER 1

-

to zmienia piksel z tego czym był, na drugi kolor: więc jeśli był koloru tła, to stanie się pikselem koloru tuszu i na odwrót

PLOT INVERSE 1; OVER 1

-

to zostawia piksel w takim stanie jak był poprzednio, lecz zauważ, że zmienia również pozycję PLOT, zatem możesz to stosować po prostu do tego celu.

 

Jako kolejny przykład stosowania polecenia OVER, wypełnij ekran tekstem, pisząc w kolorze czarnym na białym, a następnie wpisz

 

PLOT 0,0: DRAW OVER 1;255,175

 

To narysuje dosyć uczciwą linię, chociaż będzie ona posiadała przerwy w miejscach przejścia po literach tekstu. Teraz wykonaj dokładnie te same polecenia jeszcze raz. Linia zniknie bez śladu. To wielka zaleta OVER 1. Gdybyś narysował tę linię za pomocą

 

PLOT 0,0: DRAW INVERSE 1;255,175

 

to wtedy maiłabyś wymazane również nieco tekstu.

 

Teraz spróbuj

 

PLOT 0,0: DRAW OVER 1;250,175

 

i postaraj się to wymazać za pomocą

 

DRAW OVER 1;-250,-175

 

Niezupełnie zadziałało, ponieważ piksele używane przy rysowaniu linii z powrotem nie są dokładnie takie same, jak przy pierwszej linii. Linię musisz usuwać, rysując ją dokładnie w tym samym kierunku, co przy pierwszym rysowaniu.

 

Jednym ze sposobów otrzymywania niezwykłych kolorów jest zmieszanie dwóch normalnych razem w pojedynczym kwadracie przy pomocy grafiki definiowanej przez użytkownika. Uruchom ten program:

 

1000 FOR n=0 TO 6 STEP 2
1010 POKE USR "a"+n, BIN 01010101: POKE USR "a"+n+1, BIN 10101010
1020 NEXT n

 

który stworzy grafikę definiowaną przez użytkownika o wzorze szachownicy. Jeśli wydrukujesz ten znak (tryb graficzny, następnie a) w kolorze tuszu czerwonym na żółtym papierze, to otrzymasz w miarę dobry kolor pomarańczowy.

 

 

Ćwiczenia

1. Pobaw się z elementami PAPER, INK, FLASH i BRIGHT w poleceniu PLOT. Są to elementy oddziaływujące na całą pozycję znakową zawierającą piksel. Gdy polecenie PLOT rozpoczyna działanie, to jego atrybuty są jakby ustawione na

 

PLOT PAPER 8; FLASH 8; BRIGHT 8;...

 

i tylko kolor tuszu jest zmieniany, jeśli coś rysujemy w danym miejscu, lecz możesz sobie to zmienić.

Bądź szczególnie ostrożny, używając kolorów z INVERSE 1, ponieważ ustawia to piksel na kolor tła, lecz zmienia kolor tuszu, a tego niekoniecznie oczekujesz.

 

2. Spróbuj narysować okręgi za pomocą SIN i COS (jeśli przeczytałeś Rozdział 10, postaraj się odgadnąć, jak to zrobić). Uruchom to:

 

10 FOR n=0 TO 2*PI STEP PI/180
20 PLOT 100+80*COS n,87+80*SIN n
30 NEXT n
40 CIRCLE 150,87,80

 

Jak widzisz, polecenie CIRCLE jest dużo szybsze, nawet jeśli mniej dokładne.

 

3. Wypróbuj

 

CIRCLE 100,87,80: DRAW 50,50

 

Widać z tego, że polecenie CIRCLE pozostawia pozycję PLOT raczej w nieokreślonym miejscu — jest to zawsze gdzieś w połowie drogi po prawej stronie okręgu. Zwykle po poleceniu CIRCLE będziesz musiał wykonać polecenie PLOT, zanim zaczniesz dalej rysować.

 

4. Oto program rysujący wykres prawie każdej funkcji. Najpierw prosi cię on o liczbę n; będzie rysował wykres dla wartości od -n do +n. Następnie prosi cię o samą funkcję, którą wprowadzasz jako łańcuch. Łańcuch powinien być wyrażeniem używającym x jako argumentu funkcji.

 

  10 PLOT 0,87: DRAW 255,0
  20 PLOT 127,0: DRAW 0,175
  30 INPUT s,e$
  35 LET t=0
  40 FOR f=0 TO 255
  50 LET x=(f-128)*s/128: LET y=VAL e$
  60 IF ABS y>87 THEN LET t=0: GO TO 100
  70 IF NOT t THEN PLOT f,y+88: LET t=1: GO TO 100
  80 DRAW 1,y-stare y
100 LET stare y=INT(y+0.5)
110 NEXT f

 

Uruchom go i jako przykład wpisz 10 dla liczby n oraz 10*TAN x dla funkcji. Narysuje wykres funkcji tangens x dla x z zakresu od -10 do +10.

 

 

 


   I Liceum Ogólnokształcące   
im. Kazimierza Brodzińskiego
w Tarnowie

©2018 mgr Jerzy Wałaszek

Dokument ten rozpowszechniany jest zgodnie z zasadami licencji
GNU Free Documentation License.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

W artykułach serwisu są używane cookies. Jeśli nie chcesz ich otrzymywać,
zablokuj je w swojej przeglądarce.
Informacje dodatkowe