Ćwiczenie P-1 „Wstęp do środowiska Processing”

Transkrypt

Ćwiczenie P-1 „Wstęp do środowiska Processing”
Grafika komputerowa
Ćwiczenie P-1
„Wstęp do środowiska Processing”
Instrukcja laboratoryjna
opracował: mgr inż. Jakub Możaryn
„Człowiek - najlepsza inwestycja”
Projekt współfinansowany przez Unię Europejską
w ramach Europejskiego Funduszu Społecznego
Warszawa 2009
2
Ćwiczenie P-1
Wstęp do środowiska Processing
SPIS TREŚCI
1. Środowisko Processing ........................................................................................................... 3
1.1. WPROWADZENIE ........................................................................................................ 3
1.2. INSTALACJA ................................................................................................................ 3
1.3. URUCHOMIENIE PDE ................................................................................................. 3
2. Praca z Processingiem i PDE – kompilowanie i uruchamianie programów .......................... 4
2.1. PODSTAWOWE ELEMENTY INTERFEJSU ŚRODOWISKA PROCESSING ........ 4
2.2. UTWORZENIE NOWEGO PROJEKTU....................................................................... 5
2.3. PISANIE KODU ............................................................................................................. 5
2.4. URUCHOMIENIE APLIKACJI ..................................................................................... 6
2.5. KOMPILOWANIE APLIKACJI PROCESSING DO APLETU JAVA......................... 7
3. Podstawowe elementy języka Processing ............................................................................... 8
3.1. TYPY DANYCH ............................................................................................................ 8
3.2. TABLICE ........................................................................................................................ 8
3.3. INSTRUKCJE WARUNKOWE .................................................................................... 9
3.4. PĘTLE............................................................................................................................. 9
3.5. OPERACJE MATEMATYCZNE ................................................................................ 10
3.6. FUNKCJE ..................................................................................................................... 13
3.7. OBSŁUGA KLAWIATURY I MYSZKI. .................................................................... 13
4. Wstęp do grafiki 2D w Processingu ..................................................................................... 14
4.1. UKŁAD WSPÓŁRZĘDNYCH .................................................................................... 14
4.2. GRAFIKA 2D ............................................................................................................... 15
4.2.1. Śledzenie położenia myszki ................................................................................ 16
4.3. ANIMACJA .................................................................................................................. 18
4.3.1. Ruch jednego obiektu ......................................................................................... 18
4.3.2. Ruch kilku obiektów ........................................................................................... 20
5. Zadania do samodzielnego wykonania ................................................................................. 23
5.1. ZADANIE 1 - WIELOBOK ......................................................................................... 23
5.2. ZADANIE 2 - GRADIENT .......................................................................................... 23
6. Literatura............................................................................................................................... 24
Grafika komputerowa
Ćwiczenie P-1
Wstęp do środowiska Processing
3
1. Środowisko Processing
1.1.
WPROWADZENIE
Processing jest językiem programowania przeznaczonym do pisania aplikacji
wykorzystujących obrazy, animację i dźwięk. Jest on oparty na języku JAVA.
Projekt zinicjowali w 2001 roku dwaj pracownicy naukowi uczelni
amerykańskich Ben Fry z MIT i Casey Reas z UCLA. Kod oprogramowania do tworzenia
aplikacji w Processingu jest udostępniony na zasadach Open Source i jest rozwijany przez
grono ochotników z całego świata. Dotychczas opracowywano wersje testowe, jednak obecnie
dostępna jest pełna wersja środowiska Processing 1.0 (aktualna wersja to 1.0.7).
1.2.
INSTALACJA
Instalacja oprogramowania do pisania i kompilowania aplikacji pisanych w
Processingu jest bardzo prosta. Wystarczy rozpakować na swoim komputerze odpowiedni plik
znajdujący się na stronie http://www.processing.org, zawierający archiwum całego
środowiska PDE (ang. Processing Developement Enviroment)
Możliwe jest ściągnięcie najnowszej wersji (wersja ‘without JAVA’), przygotowanej
dla trzech popularnych systemów operacyjnych: Linux, Microsoft Windows, Mac OSX.
Dodatkowo, jeśli nie zostało zainstalowane środowisko Java RE, udostępniono archiwa, które
je zawierają (wersja ‘standard’). Najwygodniej jest zainstalować wersję ‘standard’, szczególnie gdy użytkownik nie miał wcześniej doświadczenia z językiem JAVA.
1.3.
URUCHOMIENIE PDE
Po rozpakowaniu wszystkich plików środowiska pisania aplikacji PDE w wybranym
katalogu należy uruchomić znajdujący się w nim plik processing.exe. Nazwa Processing jako
nazwa języka oraz środowiska programowania są zwykle stosowane zamiennie.
Grafika komputerowa
4
Ćwiczenie P-1
Wstęp do środowiska Processing
2. Praca z Processingiem i PDE – kompilowanie i
uruchamianie programów
2.1. PODSTAWOWE ELEMENTY INTERFEJSU ŚRODOWISKA PROCESSING
Podstawowe elementy interfejsu środowiska Processing zostały przedstawione na rys. 2.1.
Rysunek 2.1 Podstawowe elementy Processing Developement Enviroment
Wszystkie grupy opcji zostały zebrane w menu głównym. Należą do nich: obsługa
plików i projektów (File), edycja kodu (Edit), uruchamianie i kompilacja programów
(Sketch), dodatkowe opcje (Tools) i rozbudowaną pomoc w formacie HTML (Help).
Najczęściej wykorzystywane opcje znajdują się na pasku narzędziowym w postaci
przycisków.
RUN
Kompiluje i uruchamia program w nowym oknie.
STOP
Zatrzymuje program ale nie zamyka okna.
NEW
Otwiera nowy projekt.
OPEN
Otwiera menu, z którego można wybrać wcześniej zapisany projekt.
SAVE
Zapisuje projekt w aktualnym katalogu.
EXPORT Eksportuje bieżący program jako aplet zagnieżdżony w pliku HTML.
Grafika komputerowa
Ćwiczenie P-1
Wstęp do środowiska Processing
5
2.2. UTWORZENIE NOWEGO PROJEKTU
W celu utworzenia nowego projektu należy wybrać opcje z menu głównego
File > New (skrót klawiszowy Ctrl+N) co spowoduje automatycznie utworzenie nowego
projektu, tzw. szkicu (ang. sketch) o nadanej mu przez środowisko standardowej nazwie (np.
Sketch_Aug10c) i związanego z nim okna edycyjnego. Najlepiej od razu zapisać projekt pod
wybraną przez użytkownika nazwą wybierając opcję File > Save As... i zapisując projekt pod
dowolną nazwą w wybranym przez siebie miejscu na dysku. Automatycznie tworzony jest
katalog o identycznej nazwie, jak nazwa projektu. Zapisywanie programów pod charakterystycznymi, a nie standardowymi, nazwami znacznie ułatwia późniejszą pracę.
Standardowym rozszerzeniem programów, które są interpretowane przez środowisko
Processing jest .pde.
2.3. PISANIE KODU
Kod w środowisku Processing można pisać w trzech różnych trybach, w zależności od
stopnia zaawansowania programisty.
•
Basic Mode – tryb podstawowy – ten tryb charakteryzuje się prostymi komendami bez
dodatkowych funkcji.
•
Continuous Mode – tryb ciągły – ten tryb umożliwia tworzenie własnych klas, funkcji
i metod. W tym trybie najważniejsze funkcje, które zwykle znajdują się w programie,
to:
o setup() – w tej funkcji znajdują się instrukcje, które służą do inicjacji i wykonywane są tylko raz na początku programu,
o draw() – w tej funkcji znajdują się instrukcje, które wykonywane są w pętli
aż do zatrzymania programu, chyba że w funkcji setup() umieści się polecenie noLoop(), co spowoduje że wykonają się tylko raz.
•
JAVA Mode – tryb JAVY – Ten tryb pozwala na programowanie w języku JAVA.
Jest najbardziej złożony, jednak daje programistom najwięcej możliwości.
W praktyce proste programy można napisać w trybie ciągłymi, tak więc będzie to tryb
przykładów realizowanych w trakcie laboratorium.
Składnia języka Processing jest analogiczna do składni języka JAVA. Przykładowa
aplikacja napisana w trybie ciągłym ma następującą postać:
Grafika komputerowa
6
Ćwiczenie P-1
Wstęp do środowiska Processing
Aplikacja 2.1.
//funkcja inicjująca tryb ciągły
void setup()
{
size(200, 200);
//rozmiar okna aplikacji
noStroke();
//brak krawędzi
background(255);
//tło
fill(0, 102, 153, 204);
//kolor wypełnienia z parametrem alfa
smooth();
//wygładzenie linii
noLoop();
//ograniczenie do jednej pętli
}
//pętla trybu ciągłego, rysowanie okręgów funkcją circles()
void draw()
{
circles(40, 80);
circles(90, 70);
}
//definicja funkcji rysującej okręgi
void circles(int x, int y) {
ellipse(x, y, 50, 50);
ellipse(x+20, y+20, 60, 60);
}
2.4. URUCHOMIENIE APLIKACJI
Po napisaniu kodu należy uruchomić aplikację. Z menu głównego należy wybrać opcję
Sketch > Run (skrót klawiszowy Ctrl+R) lub kliknąć na odpowiedni przycisk w pasku narzędziowym. Wywoła to kompilację kodu i uruchomienie aplikacji. Informacja o przebiegu kompilacji i pojawiających się błędach pojawi się w odpowiednim polu tekstowym pod polem
edycyjnym. W wyniku prawidłowej kompilacji aplikacja powinna uruchomić się w oddzielnym oknie (Rys. 2.2).
Rysunek 2.2. Okno z wynikiem działania aplikacji 2.1
Grafika komputerowa
Ćwiczenie P-1
Wstęp do środowiska Processing
7
2.5. KOMPILOWANIE APLIKACJI PROCESSING DO APLETU JAVA
Pliki .pde mogą być otwierane i kompilowane przez środowisko Processing.
Środowisko pozwala na wyeksportowanie ich do postaci apletu języka JAVA. Można to
zrobić na dwa sposoby.
Pierwszy z nich to eksport aplikacji do oddzielnego pliku wykonywalnego .exe (wraz z
podkatalogiem ‘/lib’). W tym celu należy wybrać z menu głównego opcję File > Export Application. Następnie pojawi się okno z możliwością wyboru systemu operacyjnego
(MS Windows, MAC OS, Linux), oraz opcją uruchamiania pełnoekranowego (Full Screen)
Rys. 2.3). Po kliknięciu przycisku 'Export' automatycznie zostanie utworzona aplikacja,
w odpowiednim podkatalogu o nazwie odpowiadającej systemowi operacyjnemu.
Rysunek 2.3. Okno z wyborem opcji eksportu aplikacji do apletu Java
Drugim sposobem jest wyeksportowanie aplikacji jako apletu zagnieżdżonego w
pliku HTML, wyświetlanego przez przeglądarki obsługujące język JAVA. W tym celu należy
z menu głównego wybrać opcję File > Export (skrót Ctrl+E), co spowoduje utworzenie w
katalogu z projektem podkatalogu ‘/applet’ a w nim odpowiednich plików wraz z plikiem
‘index.hml’ (Rys. 2.4), w którym zostanie zagnieżdżony skompilowany aplet.
Rysunek 2.4. Wygląd przykładowej strony ‘index.html’ z zagnieżdżonym apletem Java
Grafika komputerowa
8
Ćwiczenie P-1
Wstęp do środowiska Processing
3. Podstawowe elementy języka Processing
3.1. TYPY DANYCH
Standardowe typy danych stosowane w Processingu zostały zebrane w Tab. 3.1.
Tabela 3.1. Standardowe typy danych.
Oznaczenie Przykład
int
a = 1;
float
a = 1.0;
byte
a = -1;
boolean
tak = true;
color
n = color(0, 0, 255);
lub
n = #0000FF;
char
znak = 'a';
string
text = "Ala";
Opis
Liczby całkowite
Liczby 4-bajtowe zmiennoprzecinkowe
Liczby 1-bajtowe
Typ logiczny, zmienna może przyjmować
wartości logiczne prawda/fałsz (true/false)
32 bitowa zmienna, służy do przechowywania
wartości koloru w postaci 3 wartości
składowych barw RGB (każda od 0 do 255) lub
wartości heksadecymalnej.
Typ znakowy, znak musi być ujęty w
pojedynczy cudzysłów.
Typ tekstowy, zmienna jest łańcuchem znaków,
przy deklaracji tekst musi być ujęty w podwójny
cudzysłów
3.2. TABLICE
W języku Processing można definiować tablice składające się ze stałej liczby
elementów określonego typu. Do każdego elementu odwołujemy się poprzez indeks określający pozycję danego elementu. Indeks pierwszego elementu tablicy ma wartość 0.
Ogólna postać definicji typu tablicowego jest następująca:
LICZBA_EL_TABLICY=10;
typ[] zmienna = new typ[LICZBA_EL_TABLICY];
//liczba elementów tablicy
W Processingu możliwe jest także wykorzystanie tablic wielowymiarowych. Deklaracja przykładowej tablicy dwuwymiarowej może wyglądać następująco:
int RZEDY=10;
int KOLUMY=15;
int[][] tablica2D = new int[RZEDY][KOLUMNY]
Grafika komputerowa
Ćwiczenie P-1
Wstęp do środowiska Processing
9
3.3. INSTRUKCJE WARUNKOWE
Instrukcja warunkowa if…else w języku Processing pozwala zdecydować, czy
przejść do wykonywania określonego ciągu instrukcji czy nie. Jest sterowana warunkiem
mającym wartość logiczną. Ogólna postać instrukcji warunkowej if…else jest następująca:
if (warunek1)
{
…
//ciąg instrukcji wykonywany jeśli warunek1 spełniony
}
else
{
…
//ciąg instrukcji wykonywany jeśli warunek 1 nie spełniony
};
Kolejnym przypadkiem instrukcji warunkowej jest instrukcja wielokrotnego wyboru
Warunek, od którego zależy wybór określonego ciągu instrukcji, musi
wykorzystywać zmienną typu wyliczeniowego integer, byte lub char. Ogólna postać
instrukcji wielokrotnego wyboru jest następująca:
switch.
switch(zmienna sterująca)
{
case wartosc_1:
…
//ciąg instrukcji;
break;
case wartosc_2:
…
//ciąg instrukcji;
break;
case wartosc_n:
…
//ciąg instrukcji;
break;
default:
…
//ciąg instrukcji;
}
Przy wykonywaniu instrukcji wielokrotnego wyboru dyrektywa case pozwala wybrać
ciąg instrukcji, który wykonywany jest, jeśli zmienna sterująca przyjmie określoną wartość. Z
danego ciągu instrukcji wychodzi się poleceniem break. Możliwe jest także dodanie bloku
instrukcji zatytułowanego default, który będzie wykonywany domyślnie, jeśli żadna z
wartości podanych po instrukcjach case nie będzie równa wartości sprawdzanej zmiennej
sterującej.
3.4. PĘTLE
W języku Processing podstawowa pętla realizowana jest przez instrukcję for i ma
postać
for(inicjacja_zmiennej; warunek; krok_pętli)
{
…
//ciąg instrukcji
}
W celu zastosowania pętli for należy zdefiniować i nadać początkową wartość zmiennej, która będzie ulegać zmianie po każdorazowym wykonaniu określonego ciągu instrukcji
(poprzez zdefiniowanie tzw. kroku pętli). Zmienna jest także nazywana licznikiem. Następnie
podawany jest warunek, przyjmujący wartość logiczną, sprawdzany przed
każdym przebiegiem pętli. Jeżeli warunek ma wartość true (prawda), wykonywane jest ciąg
instrukcji znajdujący się w pętli for. W przeciwnym przypadku, kiedy warunek ma wartość
Grafika komputerowa
10
Ćwiczenie P-1
Wstęp do środowiska Processing
false (fałsz), następuje zakończenie pętli. Krok_pętli to instrukcja wywoływana po wykonaniu ciągu instrukcji pętli for. Zwykle jest tu modyfikowana wartość licznika.
Aplikacja 3.1 – Przykład działania pętli for
for (int i = 30; i < 80; i = i+5) {
for (int j = 0; j < 80; j = j+5) {
point(i, j);
}
}
Rysunek 3.1. Wynik działania aplikacji 3.1., przykład działania pętli for
W języku Processing dostępna jest instrukcja while(), która także może służyć do
tworzenia pętli.
while(warunek)
{
…
//ciąg instrukcji
}
Zazwyczaj podczas korzystania z instrukcji while do tworzenia pętli definiowana jest
zmienna, do której odnosi się warunek pętli i jej wartość modyfikowana jest w ciągu instrukcji.
3.5. OPERACJE MATEMATYCZNE
W języku Processing zdefiniowano podstawowe operatory matematyczne (Tab. 3.3) i
logiczne (Tab. 3.3), oraz dodatkowe funkcje matematyczne analogiczne do występujących w
języku C lub JAVA (Tab. 3.4). Oznaczenie float/int dotyczy typu zmiennych, które mogą
być zarówno rzeczywiste jak i całkowite. Wynik funkcji jest zwykle tego samego typu co
parametry, oprócz wyszczególnionych w tabelach przypadków.
Grafika komputerowa
Ćwiczenie P-1
Wstęp do środowiska Processing
Tabela 3.2. Podstawowe operatory matematyczne
Operator
-=
+
/=
*=
%
+=
/
*
++
--
Opis
Skrócone odejmowanie
Dodawanie
Skrócone dzielenie
Odejmowanie
Skrócone mnożenie
Dzielenie modulo, podaje resztę z dzielenia
Skrócone dodawanie
Dzielenie
Mnożenie
Inkrementacja (powiększenie o 1)
Dekrementacja (pomniejszenie o 1)
Tabela 3.3. Podstawowe operatory logiczne
Operator
<
<=
>
>=
==
!=
&&
||
!
Opis
Mniejsze od
Mniejsze lub równe
Większe
Większe lub równe
Równe
Nierówne
Logiczne AND
Logiczne OR
Logiczne NOT
Grafika komputerowa
11
12
Ćwiczenie P-1
Wstęp do środowiska Processing
Tabela 3.4. Podstawowe funkcje matematyczne.
Funkcja
Opis
Funkcja zwraca wartość bezwzględną liczby
podanej jako parametr.
Funkcja zaokrągla wartość rzeczywistą w górę, do
najbliższej liczby całkowitej. Wynik jest liczbą
całkowitą.
Funkcja ogranicza zadaną wartość wart aby nie
przekraczała zadanych granic [min…max].
abs(float/int wart)
ceil(float wart)
constrain(float/int wart,
float/int min, float/int max)
dist(float/int x1, float/int y1,
float/int x2, float/int y2)
floor(float wart)
max(float/int tablica)
min(float/int tablica)
pow(float/int podstawa,
float/int wykładnik)
round(float wart)
sq(float/int wart)
sqrt(float/int wart)
sin(float wart)
cos(float wart)
tan(float wart)
atan2(float y, float x)
radians(float/int wart)
degrees(float/int wart)
Funkcja oblicza odległość pomiędzy dwoma
zadanymi punktami P1 =(x1,y1), P2=(x2,y2).
Funkcja zaokrągla wartość rzeczywistą w dół, do
najbliższej liczby całkowitej. Wynik jest liczbą
całkowitą
Funkcja zwraca największą wartość spośród
wartości znajdujących się w tablicy podanej jako
parametr.
Funkcja zwraca najmniejszą wartość spośród
wartości znajdujących się w tablicy podanej jako
parametr.
Funkcja zwraca wynik potęgowania, je parametry
to podstawa i wykładnik. Wynik jest liczbą
rzeczywistą.
Funkcja zaokrągla wartość rzeczywistą do
najbliższej liczby całkowitej. Wynik jest liczbą
całkowitą.
Funkcja zwraca wartość podaną jako parametr podniesioną do kwadratu.
Funkcja zwraca pierwiastek kwadratowy z
wartości podanej jako parametr.
Funkcja zwraca sinus wartości podanej jako
parametr.
Funkcja zwraca cosinus wartości podanej jako parametr.
Funkcja zwraca tangens wartości podanej jako parametr, zakres [- ∞, +∞].
Funkcja zwraca wartość kąta (w radianach)
pomiędzy prostą przechodzącą przez początek
układu i danym punktem (x,y), a osią OX układu.
Funkcja dokonuje konwersji stopni na radiany.
Wynik jest liczbą rzeczywistą.
Funkcja dokonuje konwersji radianów na stopnie.
Wynik jest liczbą rzeczywistą.
Grafika komputerowa
Ćwiczenie P-1
Wstęp do środowiska Processing
13
3.6. FUNKCJE
Oprócz standardowo określonych w Processingu funkcji można także tworzyć własne.
Dla danej funkcji można określić liczbę parametrów podawanych podczas jej wywoływania.
Funkcja może zwracać wartość określonego typu. W tym celu należy wewnątrz funkcji
wywołać instrukcję return z wynikiem działania funkcji. W przypadku gdy funkcja nie
zwraca wartości należy w miejsce typu napisać void. Ogólna postać definiowanej funkcji
wygląda następująco:
typ nazwa_funkcji(typ1 parametr_1;typ2 parametr_2; …;typn parametr_n)
{
… //ciąg instrukcji;
return wynik_działania_funkcji;
}
3.7. OBSŁUGA KLAWIATURY I MYSZKI.
Do obsługi reakcji na klawisze służą dwie podstawowe funkcje wykonywane
każdorazowo przy ich naciśnięciu lub puszczeniu.
Naciśnięcie klawisza
void keyPressed()
{
…
//ciąg instrukcji
}
Zwolnienie klawisza
void keyReleased ()
{
…
//ciąg instrukcji
}
Po umieszczeniu takiego kodu program samoczynnie przejdzie do wykonywania funkcji keyPressed() przy naciśnięciu dowolnego klawisza klawiatury oraz do wykonywania
funkcji keyReleased() przy jego puszczeniu. Podczas ciągłego trzymania wciśniętego
klawisza klawiatury funkcja keyPressed() będzie wykonywana wielokrotnie.
Wyrażenie keyPressed może być użyte także jako zmienna logiczna przyjmująca
wartość true (prawda) jeżeli jakiś z przycisków klawiatury jest wciśnięty oraz false (fałsz)
gdy żaden z nich nie jest wciśnięty. Do przechowywania wartości aktualnie wciśniętego
klawisza służy zmienna key. Można sprawdzić czy wciśnięty jest klawisz specjalny
odczytując wartość zmiennej keyCode, która może przyjmować wartości: ALT, CONTROL,
SHIFT, BACKSPACE, TAB, ENTER, RETURN, ESC, DELETE (wartości wpisywane
dużymi literami). Przykład instrukcji warunkowej sprawdzającej, które klawisze zostały
wciśnięte może być następujący:
if (keyPressed = = true)
{
if (key == 'a' || key == 'A' || keyCode = = CONTROL)
{
… //ciąg instrukcji
}
}
Grafika komputerowa
14
Ćwiczenie P-1
Wstęp do środowiska Processing
W Processingu zdefiniowano także funkcje obsługi myszki mousePressed() – naciśnięcie przycisku myszki, oraz mouseReleased()- zwolnienie przycisku myszki.
Zastosowanie ich jest analogiczne jak funkcji klawiszowych. Kod aktualnie wciśniętego
przycisku przechowywany jest w zmiennej mouseButton (wartość LEFT - lewy przycisk
myszki i RIGHT - prawy przycisk myszki).
Funkcja służąca do analizy informacji pochodzących z ruchu kursora sterowanego
myszką jest funkcja mouseMoved() sprawdzająca czy został on przesunięty. Współrzędne
ekranowe, w których aktualnie znajduje sie kursor przechowywane są w zmiennych mouseX
oraz mouseY. Kolejne zmienne to pmouseX oraz pmouseY, w których przechowywane są
współrzędne, w których znajdował sie kursor w poprzedniej ramce (wywołaniu funkcji
draw()) podczas działania aplikacji.
Inną stosowaną funkcją jest mouseDragged(), która reaguje na ruch kursora, w
przypadku gdy wciśnięty jest jeden z przycisków myszki.
4. Wstęp do grafiki 2D w Processingu
4.1. UKŁAD WSPÓŁRZĘDNYCH
W Processingu do opisu położeń punktów w oknie aplikacji stosuje się kartezjański prawoskrętny układ współrzędnych. Początek układu znajduje sie w lewym górnym rogu okna (Rys.
4.1). Oś OX skierowana jest w prawo, natomiast oś OY skierowana jest w dół.
Wielkość okna aplikacji określa się się przy pomocy funkcji size()
size(int szerokość, int wysokość);
gdzie podawane parametry to szerokość i wysokość okna aplikacji w pikselach.
Wysokość i szerokość okna przechowywane są w predefiniowanych zmiennych,
odpowiednio width i height. Współrzędne pierwszego punktu na ekranie to [0,0], natomiast
ostatniego to [width-1, height-1].
Dodając trzecią współrzędną (z) przechodzi się do przestrzeni trójwymiarowej, oś OZ
skierowana jest wtedy do środka ekranu (Rys. 4.1).
Rysunek 4.1. Układy współrzędnych 2D i 3D w Processingu
Grafika komputerowa
Ćwiczenie P-1
Wstęp do środowiska Processing
15
4.2. GRAFIKA 2D
Język Processing jest przygotowany do szybkiego prototypowania aplikacji graficznych zarówno dwuwymiarowych jak i trójwymiarowych.
Kolor wypełnienia figur zamkniętych określa się przy pomocy funkcji fill(), z
parametrami będącymi trzema wartościami składowych barw RGB i współczynnikiem przezroczystości alpha (każdy z parametrów przyjmuje wartości z zakresu 0-255, domyślnie
przyjmowana jest wartość 255):
fill(int/float R, int/float G, int/float B, int/float alpha);
Jeśli istotne jest wyrysowanie tylko konturu figury, bez wypełnienia, należy poprzedzić wywołanie danej funkcji poleceniem noFill().
Kolor konturu określa się korzystając z funkcji stroke() o składni analogicznej jak
funkcja fill(). Jeśli kontur ma być niewidoczny należy skorzystać z polecenia
noStroke().
Do
ustawienia
grubości
konturu
w
pikselach
służy
funkcja
strokeWeight()(stosowana dla linii, konturu obiektów i punktów).
strokeWeight(int/float grubość);
Podstawowe funkcje służące do rysowania dwuwymiarowych figur zebrano w
Tab. 4.1. Wszystkie wymienione funkcje związane z grafiką dwuwymiarową można
wywoływać z parametrami będącymi liczbami całkowitymi lub rzeczywistymi.
Tabela 4.1. Podstawowe funkcje graficzne.
Funkcja
arc(x, y, szer, wys, start,
stop)
ellipse(x, y, szer, wys)
line(x1, y1, x2, y2) lub
line(x1, y1, z1, x2, y2, z2)
point (x, y) lub point(x, y, z)
quad(x1, y1, x2, y2, x3, y3,
x4, y4)
Opis
Funkcja służy do rysowania łuku (wycinka elipsy).
Parametry funkcji: x, y – współrzędne środka
elipsy; szer, wys – wartości szerokości i wysokości elipsy; start, stop – wartości kątowe
(podane w radianach) początku i końca wycinka
elipsy.
Funkcja rysuje elipsę. Parametry funkcji: x, y –
współrzędne środka elipsy; szer, wys – wartości
szerokości i wysokości elipsy.
Funkcja rysuje linię. Parametry funkcji: x1, y1,
z1 – współrzędne początku linii oraz x2, y2, z2
– współrzędne końca linii.
Funkcja rysuje punkt. Parametry funkcji: x, y, z
– współrzędne punktu.
Funkcja rysuje czworobok. Parametry funkcji:
współrzędne czterech wierzchołków czworoboku
rect(x, y, szer, wys)
Funkcja rysuje prostokąt. Parametry funkcji:
współrzędne x, y górnego lewego wierzchołka
oraz szerokość i wysokość prostokąta.
triangle(x1, y1, x2, y2, x3, y3) Funkcja rysuje trójkąt. Parametry funkcji: współrzędne x, y wierzchołków trójkąta.
Grafika komputerowa
16
Ćwiczenie P-1
Wstęp do środowiska Processing
4.2.1. Śledzenie położenia myszki
Przykładem aplikacji wykorzystującej interakcję z użytkownikiem i grafikę 2D, będzie
aplikacja śledząca położenie kursora na ekranie. Za poruszającym się kursorem będzie
pozostawał “ślad”.
W programie będą wykorzystane dwa wektory, w których będzie zapisywana historia
ruchu - N ostatnich położeń. W tym celu należy zadeklarować dwa wektory N elementowe:
Aplikacja 4.1. – deklaracja zmiennych
//50 ostatnich połoŜeń
int N=50;
int[] xpos = new int[50];
int[] ypos = new int[50];
//współrzędna x
//współrzędna y
Następnie w funkcji setup() dokonana zostanie inicjalizacja wektorów, należy pamiętać że wektory są indeksowane od 0, więc ostatnim ich indeksem będzie wartość N-1.
Drugą z pojawiających się funkcji jest smooth(), która powoduje wygładzenie
krawędzi z wykorzystaniem techniki tzw. antyaliasingu, co poprawia efekt wizualny.
Instrukcja noSmooth() wyłącza antyaliasing. Należy podkreślić, że antyaliasing można
włączać i wyłączać dla poszczególnych instrukcji aplikacji, co pozwala rysować różne kształty z wygładzaniem lub bez.
Aplikacja 4.1. – funkcja inicjująca
void setup() {
// inicjalizacja wektorów przechowujących połoŜenie
for (int i=0; i<N; i++){
xpos[i]=0;
ypos[i]=0;
};
size(200,200);
//rozmiar okna
smooth();
//antyaliasing
}
W kolejnym kroku w trybie ciągłym, należy zadeklarować funkcję draw(). Jest ona
wywoływana w sposób ciągły, przez cały czas działania aplikacji. Pierwsza z instrukcji,
background(), o składni analogicznej do funkcji fill() i stroke(), określa jakim
kolorem będzie wypełnione okno. Jej każdorazowe wykonanie czyści zawartość okna.
Następnie zostanie dokonane przepisanie wartości pomiędzy kolejnymi elementami
zadeklarowanych wektorów, tak aby zapamiętywane było N ostatnich położeń.
Współrzędne położenia kursora zostaną odczytane z wykorzystaniem instrukcji
mouseX, mouseY i zapisywane w ostatnich elementach wektorów. Ostatnia pętla spowoduje
narysowanie okręgów o malejących średnicach i wypełnieniu ich zanikającymi odcieniami
szarości. Średnica każdego z okręgów jest bezpośrednio związana z jego położeniem w wektorze (indeks, kolejny krok). Do wypełnienia wykorzystana zostanie funkcja fill(), która
może być wywoływana z jednym parametrem określającym odcień szarości (od 255 – kolor
biały do 0 – kolor czarny).
Grafika komputerowa
Ćwiczenie P-1
Wstęp do środowiska Processing
Aplikacja 4.1. – funkcja rysująca
void draw() {
background(255);
//tło
for (int i=0; i<N-1; i++ ) {
xpos[i]=xpos[i+1];
ypos[i]=ypos[i+1];
};
xpos[N-1]=mouseX;
ypos[N-1]=mouseY;
for (int i=0; i<N; i++ ) {
noStroke();
//brak krawędzi
fill(255-i*5);
//wypełnienie figury
ellipse(xpos[i],ypos[i],i,i);
//rysowanie okręgu
};
}
Rysunek 4.2. Wygląd okna aplikacji 4.1.
Grafika komputerowa
17
18
Ćwiczenie P-1
Wstęp do środowiska Processing
4.3. ANIMACJA
4.3.1. Ruch jednego obiektu
W Processingu możliwe jest łatwe zrealizowanie animacji, co zostanie zobrazowane
na przykładzie kuli odbijającej się od krawędzi okna.
Na początku zostaną zadeklarowane zmienne globalne
Aplikacja 4.2. - inicjacja zmiennych
int xspeed, yspeed;
int xpos, ypos;
int vposx, vposy;
int r;
//informacja o ruchu kuli
int ruch=0; int predkosc=0;
//współrzędne prędkości kuli
//połoŜenie kuli
//współrzędne ‘strzałki’ prędkości
//promień kuli
Następnie zostaną zainicjowane własności aplikacji
Aplikacja 4.2. – funkcja inicjująca
void setup(){
size(400, 400);
background(255);
fill(0);
noStroke();
xspeed = 0;
yspeed = 0;
r=10;
xpos = width/2;
ypos = height/2;
frameRate(30);
}
//wypełnienie kuli
//na początku kula znajduje się na środku ekranu
Nową instrukcją, która pojawia się w powyższym fragmencie kodu, jest
frameRate(). Określa ona częstotliwość odświeżania okna aplikacji. Jest to funkcja o jednym
argumencie, będącym liczbą wywołań funkcji rysującej draw() (tzw. ramek) na sekundę.
frameRate(int liczbaKlatekNaSec)
W kolejnym kroku zostanie zdefiniowana funkcja draw(), wykonywana w sposób
ciągły. W tej funkcji zostaną wykonane następujące kroki. Na początku sprawdzany jest ruch
kuli. Jeśli kulka się porusza (flaga Predkosc ma wartość 1), w pierwszej kolejności zostanie
przerysowane tło (funkcja background() ), co spowoduje wyczyszczenie ekranu. Następnie
zostaje narysowana kula na ekranie w określonej pozycji. W kolejnym kroku współrzędne
położenia kuli zostaną uzupełnione o współrzędne prędkości. Na koniec zostaną sprawdzone
dwa warunki zależne od położenia kuli wobec krawędzi. W przypadku ich spełnienia
zmieniają się kierunki prędkości, co odpowiada odbiciu kuli od krawędzi okna.
Grafika komputerowa
Ćwiczenie P-1
Wstęp do środowiska Processing
19
Aplikacja 4.2. – funkcja rysująca
void draw(){
if (ruch==1){
background(255);
noStroke();
ellipse(xpos-round(r/2), ypos-round(r/2), r, r);
xpos+=xspeed;
ypos+=yspeed;
//warunki odbicia od krawędzi okna, zmiana kierunku ruchu
if (xpos>=width-r/2 || xpos<=r/2){
xspeed*=-1;
};
if (ypos>=height-r/2 || ypos<=r/2){
yspeed*=-1;
};
};
};
W aplikacji zostaną także obsłużone zdarzenia związane z ruchem kursora. Przyjęto,
że po najechaniu końcem kursora na dany punkt okna i wciśnięciu przycisku myszki
współrzędne tego punktu stają się współrzędnymi środka nieruchomej kuli.
Aplikacja 4.2. - Obsługa zdarzenia związanego z kliknięciem przyciskiem myszy
void mousePressed(){
if (ruch==1){
xpos=mouseX;
//połoŜenie myszy – współrzędna x
ypos=mouseY;
//połoŜenie myszy – współrzędna y
background(255);
noStroke();
ellipse(xpos, ypos, r, r);
ruch=0;
//kula się nie rusza
predkosc=0;
//prędkość nie jest ustawiona
}else if(predkosc==0){
predkosc=1;
//prędkość jest ustawiona
ruch=1;
//kula się rusza
};
};
Kolejne obsłużone zdarzenie związanie jest z ruchem myszki, po pojawieniu się kuli
na ekranie. Po ustawieniu kuli, za pomocą kursora określany jest kierunek i współrzędne
wektora prędkości, z którą inicjowany jest ruch kuli. Kolejne naciśnięcie przycisku myszy
spowoduje ruch kuli w wybranym kierunku z zadaną prędkością.
Grafika komputerowa
20
Ćwiczenie P-1
Wstęp do środowiska Processing
Aplikacja 4.2. - obsługa zdarzenia związanego z ruchem myszy
void mouseMoved(){
if (predkosc==0){
//warunek –kula jest nieruchoma
background(255);
noStroke();
fill(0);
ellipse(xpos, ypos, r, r);
//odczytanie współrzędnych końca wektora prędkości
int vposX=mouseX;
int vposY=mouseY;
stroke(255,0,0);
line(xpos,ypos,vposX,vposY);
//rysunek wektora prędkości
xspeed=(vposX-xpos)/10;
yspeed=(vposY-ypos)/10;
ruch=0;
//kula się nie rusza
};
};
Rysunek 4.3. Wygląd okna aplikacji 4.2.
4.3.2. Ruch kilku obiektów
Kolejny przykład będzie dotyczył animacji wielu obiektów na ekranie. Przyjmijmy, że
poruszającymi się obiektami są kule. Zachowanie każdego z obiektów jest kopią zachowania
kuli z poprzedniego przykładu. Ponieważ jest wiele kul, informacje o każdej z nich
przechowywane są w tablicach, zainicjowanych na początku programu, przed funkcją
setup(). Ponadto w tablicy al zostanie określony parametr alfa każdej kul, odpowiadający
za jej przezroczystość. W ten sposób zostanie uzyskany efekt przezroczystych kul, poruszających się na różnych poziomach.
Grafika komputerowa
Ćwiczenie P-1
Wstęp do środowiska Processing
21
Aplikacja 4.3. - inicjacja zmiennych
int liczbaElementow = 100;
int rozmiarKuli = 30;
int predkoscKuli = 3;
float[]xv = new float[liczbaElementow];
float[]yv = new float[liczbaElementow];
float[]xpos = new float[liczbaElementow];
float[]ypos = new float[liczbaElementow];
float[]r = new float[liczbaElementow];
float[]al = new float[liczbaElementow];
W funkcji inicjującej należy określić warunki początkowe każdej kul. Należą do nich
położenie, prędkość, promień oraz przezroczystość (parametr alpha). Do losowania wartości
można wykorzystać funkcję random()
float random(float low, float high);
Funkcja random() losuje wartość rzeczywistą z zakresu [low,high).
Inną funkcją losującą w Processingu jest noise(), która zwraca wartość losową z
zakresu [0,1). Może być wywołana z 1-3 parametrami, w zależności od ilości losowanych
liczb. Jest w niej zaimplementowana funkcja nazywana szumem Perlina, zaproponowana
przez Kena Perlina w latach 80-tych. W niektórych przypadkach pozwala ona uzyskać rozkład bardziej zbliżony do normalnego niż funkcja random(). Jest stosowana w popularnych
programach graficznych do generowania tekstur, powierzchni, ruchu zbliżonego do
naturalnego, etc.
Aplikacja 4.3. – funkcja inicjująca
void setup(){
size(400, 400);
background(255);
for (int i=0; i< liczbaElementow; i++){
// losowy dobór prędkości kul
xv[i] = random(1, predkoscKuli);
yv[i] = random(-predkoscKuli, predkoscKuli);
// losowy dobór rozmiaru kul
r[i]= random(1, rozmiarKuli);
//określenie przezroczystości kul
al[i]=255-r[i]*5;
//losowe rozmieszczenie kul
xpos[i] = width/2+random(-width/3, width/3);
ypos[i] = height/2+random(-height/3, height/3);
};
noStroke();
smooth();
frameRate(30);
}
Grafika komputerowa
22
Ćwiczenie P-1
Wstęp do środowiska Processing
Ostatecznie zostanie napisana funkcja draw() odświeżająca okno w kolejnych
krokach i odpowiadająca za animację. Instrukcje sterujące ruchem poszczególnych kul wywołane są w pętli tyle razy ile jest kul. Na ich podstawie modyfikowane są wartości w tablicach
przechowujących współrzędne położenia (xpos[i], ypos[i]) każdej z kul.
Aplikacja 4.3. – funkcja rysująca
void draw(){
background(255);
// pętla wywoływana dla kaŜdej z kul
for (int i=0; i<liczbaElementow; i++){
//rysowanie kuli (i)
fill(255,0,0,al[i]);
ellipse(xpos[i], ypos[i], r[i], r[i]);
//określenie połoŜeń kuli (i) w kolejnym kroku
xpos[i]+=xv[i];
ypos[i]+=yv[i];
//warunki na zderzenie kuli (i) z krawędziami okna
if (xpos[i]+r[i]/2>=width || xpos[i]<=r[i]/2){
xv[i]*=-1;
};
if (ypos[i]+r[i]/2>=height || ypos[i]<=r[i]/2){
yv[i]*=-1;
};
};
};
Rysunek 4.4. Wygląd okna aplikacji 4.3.
Grafika komputerowa
Ćwiczenie P-1
Wstęp do środowiska Processing
23
5. Zadania do samodzielnego wykonania
5.1. ZADANIE 1 - WIELOBOK
Treść zadania:
Należy napisać aplikację rysującą wielobok foremny o n bokach.
W programie należy zaimplementować i wywołać funkcję o nazwie wielobok() z
następującymi parametrami:
• środek wieloboku,
• promień,
• liczba boków wieloboku.
Przydatne informacje:
Na początku należy zaimplementować funkcję inicjującą, w której należy zdefiniować wielkość wyświetlanego okna aplikacji i w tej funkcji wywołać napisaną funkcję wielobok().
Podczas implementacji przydatne mogą być funkcje trygonometryczne, funkcja rysującą linię
pomiędzy dwoma punktami line(), oraz predefiniowane w Processingu stałe PI (π), oraz
TWO_PI (2π).
5.2. ZADANIE 2 - GRADIENT
Treść zadania:
Należy napisać aplikację pozwalającą na wyświetlenie gradientu danego koloru, w taki sposób
że pierwsza linia (pozioma) jest rysowana w kolorze początkowym, natomiast ostatnia linia
jest rysowana w kolorze końcowym. Linie pośrednie należy rysować z zachowaniem liniowej
zmiany gradientu.
W programie należy zaimplementować i wywołać funkcję o nazwie gradient() z
następującymi parametrami:
• 3 składowe RGB koloru początkowego – wartości całkowite
• 3 składowe RGB koloru końcowego – wartości całkowite
Przydatne informacje:
Na początku należy zaimplementować funkcję inicjującą, w której należy zdefiniować wielkość wyświetlanego okna aplikacji i w tej funkcji wywołać napisaną funkcję gradient().
Podczas implementacji funkcji przydatne mogą być: implementacja liniowej interpolacji każdej z poszczególnych składowych RGB, funkcja rysującą linię pomiędzy dwoma punktami,
predefiniowane w Processingu zmienne width i height, zwracające szerokość i wysokość
okna oraz funkcja stroke() wywoływana z trzema parametrami R, G, B, pozwalająca na
zmianę koloru konturu (w tym przypadku rysowanej linii)
Grafika komputerowa
24
Ćwiczenie P-1
Wstęp do środowiska Processing
6. Literatura
[1] Bożena Pawlak “Processing – nowe narzędzie do tworzenia apletów. Analiza możliwości
na przykładzie apletów z dziedziny grafiki komputerowej”, Praca dyplomowa inżynierska,
Wydział Mechatroniki, 2005/2006.
[2] Ira Greenberg: ”Processing: Creative Coding and Computational Art”, Friendsof, 2007.
[3] Casey Reas, Ben Fry, „Processing: A Programming Handbook for Visual Designers
and Artists”, MIT Press, 2007.
[4] Daniel Shiffman: “Learning Processing. A Beginners Guide to Programming Images,
Animation and Interaction”, Elsevier, 2008.
[4] Pomoc środowiska Processing.
Grafika komputerowa

Podobne dokumenty