bg‑gray4

Treści zawarte w tym e‑materiale wykraczają poza podstawę programową. Jeśli jednak:

  • interesujesz się informatyką i programowaniem,

  • chcesz poszerzyć swoją wiedzę na temat tekstowych języków programowania,

  • poznać mniej znane języki i zintegrowane środowiska programistyczne,

zachęcamy Cię do zapoznania się z tym e‑materiałem.

Wstęp

Chcąc przystąpić do wykonania interaktywnej aplikacji, należy najpierw pozyskać odpowiednie materiały potrzebne do realizacji projektu. Możesz znaleźć je w internecie lub wykonać je sam. Więcej na temat wyszukiwania w internecie znajdziesz w materiałach:

Posiadając odpowiednie materiały, można przystąpić do programowania aplikacji. Pierwszym krokiem powinien być wybór języka programowania. Dobrym kandydatem jest język ProcessingProcessingProcessing. Służy on do:

  • tworzenia projektowanych scenografii do spektakli tanecznych i muzycznych,

  • generowania obrazów do teledysków i filmów,

  • tworzenia obrazów do plakatów, czasopism i książek,

  • tworzenia interaktywnych instalacji w galeriach, muzeach i na ulicy.

Chcąc stworzyć interaktywną aplikację, należy mieć możliwość wyświetlania tekstu, ilustracji oraz filmów, dodatkowo należy mieć możliwość obsługiwania zdarzeń generowanych przez użytkownika (przykładowo kliknięcie myszy). Processing oferuje wszystkie powyższe możliwości, dodatkowo jest przyjazny dla początkujących, posiada własne środowisko oraz prostą składnię.

Drugim krokiem powinno być pobranie i zainstalowanie zintegrowanego środowiska programistycznego. (IDE - ang. Integrated Development Environment)IDE - ang. Integrated Development Environment(IDE - ang. Integrated Development Environment)
Processing rozwijany jest jako projekt Open Source, natomiast Processing IDE jest rozpowszechniane na licencji GPLlicencja_GNU_GPLlicencji GPL. Biblioteki oraz kod dostarczony przez producentów objęte są licencją LGPL, co pozwala autorom na rozpowszechniane swoich prac pod dowolną licencją, bez ograniczeń. Wszystkie wersje środowiska Processing znajdują się na stronie http://processing.org.

Instalacja środowiska

Dla każdego systemu operacyjnego wystarczy pobrać i uruchomić środowisko programistyczne wybierając odpowiednią zakładkę na stronie oprogramowania Processing:

https://processing.org/download/?processing

Wersja środowiska omawiana w materiale to 4.2

Po pobraniu pliku z rozszerzeniem .zip, wypakuj go w wybranym przez siebie miejscu. Następnie otwórz folder i kliknij dwukrotnie ikonę pliku processing.exe.

R1AWmA2eg0qDq
Plik processing.exe w pobranym folderze
Źródło: GroMar Sp. z o.o., licencja: CC BY 3.0.

Po wykonaniu powyższych czynności powinno ukazać się następujące okienko, przeanalizuj jego poszczególne elementy:

R1NQli8kdTSrd
Ilustracja interaktywna opisująca poszczególne elementy środowiska Processing. Na samej górze znajduje się pasek narzędzi, jego elementy od lewej to: File, Edit, Sketch, Debug, Tools, Help. Poniżej paska narzędzi znajdują się przyciski, po lewej stronie okna od lewego przycisku: Uruchom, Zatrzymaj. Po prawej stronie okna od lewej strony: Debugowanie, zmiana trybu pracy. Poniżej przycisków znajduje się edytor tekstowy, zajmuje on znaczną część ilustracji. Poniżej edytora tekstowego znajduje się okno konsoli oraz okno błędów.
Poszczególne elementy środowiska Processing
Źródło: GroMar Sp. z o.o., licencja: CC BY 3.0.

Programowanie w Processing

Twórcy środowiska Processing zalecają, by swoje projekty przechowywać wewnątrz folderu nazwanego przez nich szkicownikiem (ang. sketchbook). Dzięki temu projekty będą dostępne w łatwy sposób z menu File->Sketchbook. Folder ten jest ważny jednak przede wszystkim z innego powodu. To wewnątrz niego musi się znajdować folder z zewnętrznymi bibliotekami, z których chcemy korzystać (instalacja zewnętrznych bibliotek omówiona jest poniżej). Można jednak samodzielnie wybrać inny folder, korzystając z opcji z menu File->Preferences. Pierwszą rzeczą, jaką należy ustawić w oknie Preferences, jest położenie wybranego folderu szkicownika. Powinien on być wybrany tak, aby był do niego łatwy dostęp przy instalowaniu dodatkowych bibliotek. Drugą ważną opcją jest maksymalna dostępna pamięć. W sytuacji, gdy operujemy na dużej ilości plików (zwłaszcza graficznych, wideo czy audio) możemy mieć do czynienia z wyjątkiem java.lang.OutOfMemoryError, którego można uniknąć poprzez zwiększenie maksymalnej pamięć dla środowiska Processing (co jest analogiczne do zwiększania ilości pamięci dla maszyny wirtualnej Javy, bo przecież Processing powstał jako opakowanie właśnie na Javę, a obecnie rozwinął się do obsługi Android SDK oraz JavaScript). Środowisko Processing daje nam możliwość zwiększenia maksymalnej dostępnej pamięci, w tym celu należy wybrać kolejno File, Preferences oraz zaznaczyć pozycję Increase maximum available memory to..., wpisać nową wartość i zatwierdzić zmiany. Pozostałe opcje nie są już tak istotne i mogą być dowolnie konfigurowane.

Przykłady wykorzystania języka Processing

Sztuka

Prostota składni języka Processing, pozwoliła wielu osobom, które nie miały doświadczenia programistycznego w realizacji projektów bez konieczności zatrudniania specjalistów z branży IT. To czysto akademickie rozwiązanie umożliwiło wielu badaczom opracować prototypy i sprawdzić ich działanie w środowisku o bardzo dużych możliwościach graficznych i interakcyjnych bez ponoszenia znacznych nakładów finansowych. W internecie można znaleźć dużo przykładów zastosowania tej technologii przez różne grupy zawodowe. Wystarczy wspomnieć o projekcie, który wzbudził spore zainteresowanie świata sztuki. Artyści Daniel Franke (czyt. Daniel Franke) i Cedric Kiefer (czyt. Cedrik Kiefe) opracowali pomysł wirtualnej ruchomej rzeźby z piasku. Rzeźba powstała na podstawie ruchu tancerki, sczytanego przez kontroler Kinect. Animacja została zrealizowana na podstawie analizy w czasie rzeczywistym właśnie w Processing.

R6ISlZSmt2W3W
Projekt „Unnamed soundsculpture”
Źródło: Daniel Frank, Cedric Kiefer, licencja: CC BY 3.0.

Wizualizacja danych

Naukowcy ze znanego niemieckiego instytutu Max Planck, zwizualizowali za pomocą Processing dane około 94,000 publikacji z ostatnich dziesięciu lat zgromadzonych w portalu „SciVerse Scopus”. Zaprojektowana i zaimplementowana dynamiczna sieć pozwoliła na zwizualizowanie połączeń pomiędzy instytucjami naukowymi.

 Sieć ta pozwoliła na stworzenie interaktywnego środowiska prezentującego aktywność naukową i współpracę instytutu z innymi jednostkami na całym świecie.

RLUg8t8gOuRwI
Wystawa - Max Planck Science Gallery
Źródło: Max Planck Science Gallery, licencja: CC BY 3.0.

Analiza fleksyjna

Stephan Thiel (czyt. Stefan Tiel)  z uniwersytetu w Adelajdzie zrealizował projekt polegający na nowoczesnym sposobie interpretacji dzieł Shakespeare. Użycie Processing pozwoliło na zliczenie słów i znalezienie istniejących relacji i powiązań pomiędzy dziełami autora.

Rzsf5KKDgHYPo
Fleksyjna analiza dzieł Szekspira wykonana w Processing przez Stephana Thiela z uniwersytetu w Adelajdzie
Źródło: Stephana Thiela, licencja: CC BY 3.0.

Przedstawione przykłady miały za zadanie zilustrować szerokie zastosowanie technologii którą poznacie podczas najbliższych lekcji. Zdobyta wiedza pozwoli Wam zrealizować ciekawe a przede wszystkim kreatywne pomysły.

Typy danych

Zmienna jest to miejsce w pamięci, w którym możemy przechowywać dane. W zależności od rodzaju danych zmienna zajmować będzie odpowiedni rozmiar pamięci. Do najczęściej stosowanych typów danych możemy zaliczyć liczby całkowite, liczby rzeczywiste, znaki (np. litery, cyfry) oraz wartości logiczne.

R1cTxrvBVut78
Tabela zawierająca przykładowe typy danych wykorzystywane w środowisku Processing
Źródło: Piotr Napieralski, licencja: CC BY 3.0.

Można określić początkową wartość zmiennej już przy jej deklaracji, można też zrobić to później, za pomocą operatora przypisania:
nazwa_zmiennej = nowa_wartość_dla_zmiennej;.
Operator = służy do przypisywania nowej wartości zmiennej. Wartość jaką przechowuje zmienna, możesz zmieniać wielokrotnie w trakcie działania aplikacji. 
Kolejną rzeczą, jest nazewnictwo zmiennych. Nazwy zmiennych nie mogą zawierać polskich znaków, znaków specjalnych (z wyjątkiem _ i $) i nie mogą zaczynać się od cyfry.

Instrukcje sterujące

Dobrą praktyką jest pisanie czytelnego oraz łatwego do zrozumienia kodu, używając struktur sterujących takich jak pętle oraz instrukcje warunkowe (m. in. if...else) do sekwencyjnego wykonywania odpowiednich instrukcji.

Processing dostarcza standardowe możliwości, które dostępne są w każdym języku programowania takie jak :

  • komentarze:

To, co następuje po dwóch ukośnikach to tzw. komentarz. Processing tego nie czyta, bo są to tylko informacje dla programistów. Komentarz taki obejmuje wszystko, co znajduje się za znakiem podwójnego ukośnika do końca linii, lub między znakami
/* ... */

Linia 1. prawy ukośnik prawy ukośnik komentarz. Linia 3. prawy ukośnik asterysk. Linia 4. wszystko. Linia 5. pomiędzy tymi znakami. Linia 6. jest komentarzem. Linia 7. asterysk prawy ukośnik.
  • pętle: for, while,

Pętle forwhile będą powtarzać ciąg instrukcji (iteracja) tak długo, jak długo zdefiniowane warunki będą prawdziwe. Pętla for jest pętlą licznikową, natomiast pętla while jest pętlą warunkową. Przeanalizuj przykłady umieszczone poniżej.

Ważne!

Instrukcje złożone składają się z ciągu pojedynczych instrukcji, które należy w pewien sposób od siebie oddzielić, dlatego każdą pojedynczą instrukcję należy zakończyć średnikiem. Pojedyncze instrukcje grupujemy w złożone za pomocą nawiasów klamrowych. W ogólności instrukcje złożone zajmują wiele wierszy, choć w prostych przypadkach cała instrukcja złożona może się mieścić w jednym wierszu.

Linia 1. for otwórz nawias okrągły int i znak równości 40 średnik i otwórz nawias ostrokątny 80 średnik i znak równości i plus 5 zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. line otwórz nawias okrągły 30 przecinek i przecinek 80 przecinek i zamknij nawias okrągły średnik. Linia 3. zamknij nawias klamrowy. Linia 5. prawy ukośnik asterysk. Linia 6. Metoda line otwórz nawias okrągły x1 przecinek y1 przecinek x2 przecinek y2 zamknij nawias okrągły rysuje linię. Linia 7. od punktu otwórz nawias okrągły x1 przecinek y1 zamknij nawias okrągły do punktu otwórz nawias okrągły x2 przecinek y2 zamknij nawias okrągły kropka. Linia 8. asterysk prawy ukośnik.
RNJL2SIOC06g4
Efekt kodu - linie
Źródło: GroMar Sp. z o.o., licencja: CC BY 3.0.

Taki sam efekt możemy osiągnąć używając pętli while:

Linia 1. int i znak równości 40 średnik. Linia 2. while otwórz nawias okrągły i otwórz nawias ostrokątny 80 zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. line otwórz nawias okrągły 30 przecinek i przecinek 80 przecinek i zamknij nawias okrągły średnik. Linia 4. i znak równości i plus 5 średnik. Linia 5. zamknij nawias klamrowy.
  • instrukcje warunkowe: if, if. . .else,

Podstawowym rodzajem instrukcji warunkowej spotykanej w większości języków programowania jest if. Instrukcja ta pozwala na wykonanie określonego bloku kodu w przypadku spełnienia określonego warunku. Jeśli warunek nie jest spełniony zostanie wykonany blok alternatywny. Pomiędzy różnymi językami programowania występują w tej instrukcji nieznaczne różnice składniowe. W Processing instrukcja ta wygląda następująco:

Linia 1. if otwórz nawias okrągły warunek zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. Ciąg instrukcji wykonywany jeśli warunek jest spełniony. Linia 3. zamknij nawias klamrowy. Linia 4. else otwórz nawias klamrowy. Linia 5. Ciąg instrukcji wykonywany jeśli warunek nie jest spełniony. Linia 6. zamknij nawias klamrowy.
  • instrukcję wyboru: switch,

Linia 1. int warunek znak równości 0 średnik. Linia 2. switch otwórz nawias okrągły warunek zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. case 0 dwukropek. Linia 4. print otwórz nawias okrągły cudzysłów Wykonam się przecinek jeżeli warunek znak równości znak równości 0 cudzysłów zamknij nawias okrągły średnik. Linia 5. break średnik. Linia 6. case 1 dwukropek. Linia 7. print otwórz nawias okrągły cudzysłów Wykonam się przecinek jeżeli warunek znak równości znak równości 1 cudzysłów zamknij nawias okrągły średnik. Linia 8. break średnik. Linia 9. default dwukropek. Linia 10. print otwórz nawias okrągły cudzysłów Wykonam się przecinek jeżeli warunek nie przyjmuje żadnej z powyższych wartości cudzysłów zamknij nawias okrągły średnik. Linia 11. break średnik. Linia 12. zamknij nawias klamrowy.

Podobnie jak if...else, jest to instrukcja warunkowa, tzw instrukcja wielokrotnego wyboru. W przypadku niej możemy podejmować decyzje na podstawie wartości jednej zmiennej. Najczęściej wykorzystywana jest ona do obsługi zdarzeń (np. sterowanie za pomocą klawiatury). W zależności od wartości parametru uruchamiana jest odpowiednia akcja.

  • operatory

W poniższej tabeli znajdują się najważniejsze operatory pozwalające wykonywać obliczenia oraz porównywać zmienne ze sobą.

Polecenie 1

Przeanalizuj i przetestuj poniższy kod.

Linia 1. prawy ukośnik prawy ukośnik komentarz. Linia 2. prawy ukośnik asterysk. Linia 3. wszystko. Linia 4. pomiędzy tymi znakami. Linia 5. jest komentarzem. Linia 6. asterysk prawy ukośnik. Linia 8. size otwórz nawias okrągły 600 przecinek 600 zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Ustawienie wymiarów okna na 600 pikseli w poziomie i w pionie. Linia 9. scale otwórz nawias okrągły 5 zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Zwiększenie skali rysowanych obiektów o 500 procent. Linia 11. prawy ukośnik prawy ukośnik Pętla for. Linia 12. for otwórz nawias okrągły int i znak równości 40 średnik i otwórz nawias ostrokątny 80 średnik i znak równości i plus 5 zamknij nawias okrągły otwórz nawias klamrowy. Linia 13. line otwórz nawias okrągły 30 przecinek i przecinek 80 przecinek i zamknij nawias okrągły średnik. Linia 14. zamknij nawias klamrowy. Linia 16. prawy ukośnik asterysk. Linia 17. Metoda line otwórz nawias okrągły x1 przecinek y1 przecinek x2 przecinek y2 zamknij nawias okrągły rysuje linię. Linia 18. od punktu otwórz nawias okrągły x1 przecinek y1 zamknij nawias okrągły do punktu otwórz nawias okrągły x2 przecinek y2 zamknij nawias okrągły kropka. Linia 19. asterysk prawy ukośnik. Linia 21. prawy ukośnik prawy ukośnik Pętla while. Linia 22. prawy ukośnik asterysk. Linia 23. var i znak równości 40 średnik. Linia 24. while otwórz nawias okrągły i otwórz nawias ostrokątny 80 zamknij nawias okrągły otwórz nawias klamrowy. Linia 25. line otwórz nawias okrągły 30 przecinek i przecinek 80 przecinek i zamknij nawias okrągły średnik. Linia 26. i znak równości i plus 5 średnik. Linia 27. zamknij nawias klamrowy. Linia 28. asterysk prawy ukośnik. Linia 30. prawy ukośnik prawy ukośnik Instrukcja warunkowa if kropka kropka kropka else. Linia 31. prawy ukośnik asterysk. Linia 32. int warunek podkreślnik if znak równości 0 średnik. Linia 33. if otwórz nawias okrągły warunek podkreślnik if znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 34. print otwórz nawias okrągły cudzysłów Ciąg instrukcji wykonywany jeśli warunek jest spełniony cudzysłów zamknij nawias okrągły średnik. Linia 35. zamknij nawias klamrowy. Linia 36. else otwórz nawias klamrowy. Linia 37. print otwórz nawias okrągły cudzysłów Ciąg instrukcji wykonywany jeśli warunek nie jest spełniony cudzysłów zamknij nawias okrągły średnik. Linia 38. zamknij nawias klamrowy. Linia 39. asterysk prawy ukośnik. Linia 41. prawy ukośnik prawy ukośnik Instrukcja wyboru switch. Linia 42. prawy ukośnik asterysk. Linia 43. int warunek podkreślnik switch znak równości 0 średnik. Linia 44. switch otwórz nawias okrągły warunek podkreślnik switch zamknij nawias okrągły otwórz nawias klamrowy. Linia 45. case 0 dwukropek. Linia 46. print otwórz nawias okrągły cudzysłów Wykonam się przecinek jeżeli warunek znak równości znak równości 0 cudzysłów zamknij nawias okrągły średnik. Linia 47. break średnik. Linia 48. case 1 dwukropek. Linia 49. print otwórz nawias okrągły cudzysłów Wykonam się przecinek jeżeli warunek znak równości znak równości 1 cudzysłów zamknij nawias okrągły średnik. Linia 50. break średnik. Linia 51. default dwukropek. Linia 52. print otwórz nawias okrągły cudzysłów Wykonam się przecinek jeżeli warunek nie przyjmuje żadnej z powyższych wartości cudzysłów zamknij nawias okrągły średnik. Linia 53. break średnik. Linia 54. zamknij nawias klamrowy. Linia 55. asterysk prawy ukośnik.

Wynikiem kodu z pętli for oraz pętli while jest osiem poziomych linii, natomiast wynikiem kodu z instrukcji warunkowej if...else oraz instrukcji wyboru switch jest fragment tekstu wypisywany w konsoli środowiska.

Kształty

Ważne!

Układ współrzędnych w Processing wygląda inaczej niż ten wykorzystywany w matematyce, tutaj punkt (0,0) znajduje się w lewym górnym rogu okna programu. Kształty w Processing składają się z punktów. Każdy punkt posiada współrzędne:

  • x – współrzędna pozioma, odległość (w pikselach) od lewej krawędzi okna.

  • y – współrzędna pionowa, odległość (w pikselach) od górnej krawędzi okna.

R1XXg0n00GB2c
Processing - Układ współrzędnych
Źródło: dostępny w internecie: https://processing.org/tutorials/coordinatesystemandshapes, licencja: CC BY 3.0.

Najprostsze figury geometryczne w Processing możemy otrzymać za pomocą funkcji:

R1FdZHYqBOKR0
Figury geometryczne oraz opisujące je funkcje w środowisku Processing
Źródło: Piotr Napieralski, licencja: CC BY 3.0.
Polecenie 2

Przeanalizuj i przetestuj poniższy kod.

Linia 1. prawy ukośnik asterysk. Linia 2. Parametry kształtów w Processing. Linia 4. Podstaw wartości pod odpowiednie zmienne przecinek. Linia 5. odkomentuj interesujące cię funkcje i przetestuj ich działanie kropka. Linia 6. asterysk prawy ukośnik. Linia 7. size otwórz nawias okrągły 500 przecinek 500 zamknij nawias okrągły średnik. Linia 10. prawy ukośnik prawy ukośnik Punkty. Linia 11. int x1 znak równości 100 średnik. Linia 12. int y1 znak równości 100 średnik. Linia 13. int x2 znak równości 400 średnik. Linia 14. int y2 znak równości 400 średnik. Linia 15. int x3 średnik. Linia 16. int y3 średnik. Linia 17. int x4 średnik. Linia 18. int y4 średnik. Linia 20. prawy ukośnik prawy ukośnik Szerokość i wysokość. Linia 21. int w średnik. Linia 22. int h średnik. Linia 24. prawy ukośnik prawy ukośnik Punkty kontrolne otwórz nawias okrągły Bezier zamknij nawias okrągły. Linia 25. int cx1 średnik. Linia 26. int cy1 średnik. Linia 27. int cx2 średnik. Linia 28. int cy2 średnik. Linia 30. prawy ukośnik prawy ukośnik point otwórz nawias okrągły x1 przecinek y1 zamknij nawias okrągły średnik. Linia 32. line otwórz nawias okrągły x1 przecinek y1 przecinek x2 przecinek y2 zamknij nawias okrągły średnik. Linia 33. prawy ukośnik asterysk. Linia 34. otwórz nawias okrągły x1 przecinek y1 zamknij nawias okrągły minus punkt początkowy linii przecinek. Linia 35. otwórz nawias okrągły x2 przecinek y2 zamknij nawias okrągły minus punkt końcowy linii. Linia 36. asterysk prawy ukośnik. Linia 38. prawy ukośnik prawy ukośnik triangle otwórz nawias okrągły x1 przecinek y1 przecinek x2 przecinek y2 przecinek x3 przecinek y3 zamknij nawias okrągły średnik. Linia 39. prawy ukośnik asterysk. Linia 40. otwórz nawias okrągły x1 przecinek y1 zamknij nawias okrągły minus pierwszy wierzchołek trójkąta przecinek. Linia 41. otwórz nawias okrągły x2 przecinek y2 zamknij nawias okrągły minus drugi wierzchołek trójkąta przecinek. Linia 42. otwórz nawias okrągły x3 przecinek y3 zamknij nawias okrągły minus trzeci wierzchołek trójkąta. Linia 43. asterysk prawy ukośnik. Linia 45. prawy ukośnik prawy ukośnik quad otwórz nawias okrągły x1 przecinek y1 przecinek x2 przecinek y2 przecinek x3 przecinek y3 przecinek x4 przecinek y4 zamknij nawias okrągły średnik. Linia 46. prawy ukośnik asterysk. Linia 47. otwórz nawias okrągły x1 przecinek y1 zamknij nawias okrągły minus pierwszy wierzchołek czworokąta przecinek. Linia 48. otwórz nawias okrągły x2 przecinek y2 zamknij nawias okrągły minus drugi wierzchołek czworokąta przecinek. Linia 49. otwórz nawias okrągły x3 przecinek y3 zamknij nawias okrągły minus trzeci wierzchołek czworokąta przecinek. Linia 50. otwórz nawias okrągły x4 przecinek y4 zamknij nawias okrągły minus czwarty wierzchołek czworokąta. Linia 51. asterysk prawy ukośnik. Linia 53. prawy ukośnik prawy ukośnik rect otwórz nawias okrągły x1 przecinek y1 przecinek w przecinek h zamknij nawias okrągły średnik. Linia 54. prawy ukośnik asterysk. Linia 55. otwórz nawias okrągły x1 przecinek y1 zamknij nawias okrągły minus lewy górny wierzchołek prostokąta. Linia 56. w minus szerokość prostokąta. Linia 57. h minus wysokość prostokąta. Linia 58. asterysk prawy ukośnik. Linia 60. prawy ukośnik prawy ukośnik ellipse otwórz nawias okrągły x1 przecinek y1 przecinek w przecinek h zamknij nawias okrągły średnik. Linia 61. prawy ukośnik asterysk. Linia 62. otwórz nawias okrągły x1 przecinek y1 zamknij nawias okrągły minus punkt środkowy elipsy. Linia 63. w minus szerokość elipsy. Linia 64. h minus wysokość elipsy. Linia 65. asterysk prawy ukośnik. Linia 67. prawy ukośnik prawy ukośnik bezier otwórz nawias okrągły x1 przecinek y1 przecinek cx1 przecinek cy1 przecinek cx2 przecinek cy2 przecinek x2 przecinek y2 zamknij nawias okrągły średnik. Linia 68. prawy ukośnik asterysk. Linia 69. otwórz nawias okrągły x1 przecinek y1 zamknij nawias okrągły minus pierwszy punkt zaczepienia. Linia 70. otwórz nawias okrągły cx1 przecinek cy1 zamknij nawias okrągły minus pierwszy punkt kontrolny. Linia 71. otwórz nawias okrągły cx2 przecinek cy2 zamknij nawias okrągły minus drugi punkt kontrolny. Linia 72. otwórz nawias okrągły x2 przecinek y2 zamknij nawias okrągły minus drugi punkt zaczepienia. Linia 73. asterysk prawy ukośnik.

Kolor

Wartości jakie przyjmuje każda z funkcji odpowiedzialna za generowanie koloru to np.: background( R, G, B); Gdzie R – jest wartością z przedziału od (0‑255) dla koloru czerwonego G – jest wartością z przedziału od (0‑255) dla koloru niebieskiego B – jest wartością z przedziału od (0‑255) dla koloru zielonego

R14QrvXztb0FB
Funkcje generowania kolorów RGB
Źródło: Piotr Napieralski, licencja: CC BY 3.0.

Oprócz wartości RGB stosowana jest też czwarta wartość – „alpha – A”, określająca przezroczystość koloru. Każda z funkcji odpowiedzialna za kolor może przyjmować więc wartości (R, G, B, A);

Metoda Setup

Processing posiada kilka predefiniowanych metod, które określają strukturę programu i odpowiadają za najważniejsze dla każdego projektu części. Pierwszą taką metodą jest funkcja setup:

Linia 1. void setup otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy zamknij nawias klamrowy.

Jest to metoda wejściowa dla naszego programu i wewnątrz niej definiujemy wszelkie ustawienia programu (takie jak rozmiar okna, silnik renderujący itp.), inicjalizujemy obiekty klas i zmienne. Po skompilowaniu programu otrzymamy okno aplikacji o domyślnym rozmiarze 100 na 100 pikseli. Uruchomić program można na trzy sposoby:

  • poprzez pierwszą od lewej ikonkę na górnym pasku (ikona „play”),

  • poprzez menu Sketch->Run,

  • poprzez skrót klawiaturowy Ctrl+R.

Można również samemu ustawić rozmiar okna poprzez następujące wywołanie wewnątrz funkcji setup:

Linia 1. size otwórz nawias okrągły 700 przecinek 700 zamknij nawias okrągły średnik.

Jeśli nie określimy silnika renderującego, domyślnie zostanie ustawiony silnik JAVA2D, który pozwala na operacje dwuwymiarowe. Jest on dokładny, lecz nieco wolniejszy niż silnik P2D. Dostępne opcje silników to:

  • P2D (Processing 2D) – silnik dwuwymiarowy wykorzystujący możliwości kart graficznych wspierających OpenGL.

  • P3D (Processing 3D) – silnik trójwymiarowy wykorzystujący możliwości kart graficznych wspierających OpenGL.

  • FX2D (JavaFX 2D) – silnik dwuwymiarowy, używający JavaFX (dla niektórych aplikacji może być szybszy).

  • PDF – silnik pozwalający zapisać grafikę dwuwymiarową bezpośrednio do pliku PDF, zamiast wyświetlać ją na ekranie. Co więcej, elementy wektorowe zostaną zapisane również jako wektorowe, co umożliwia późniejszą manipulację nimi w programach typu Adobe Ilustrator. Przydatny, gdy potrzebujemy wysokiej jakości grafiki do druku czy edycji.

  • SVG – silnik dwuwymiarowy, który zapisuje obraz wynikowy prosto do pliku SVG.

W starszych wersjach środowiska dostępny jest również:

  • OPENGL – silnik trójwymiarowy, do którego potrzebny jest sprzęt, który wspiera OpenGL, wykorzystuje bibliotekę JOGL (Java for OpenGL) i pozwala na rendering trójwymiarowy na stronach www.

  • P2D oraz P3D – były to sprzętowe implementacje nie wykorzystujące silnika OpenGL.

Aby korzystać z możliwości oraz zapisu do PDF, należy zaimportować moduł PDF export, informacja jak to zrobić znajduje się w dalszej części materiału. Rodzaj silnika określa się poprzez podanie trzeciego parametru metody size np.

Linia 1. size otwórz nawias okrągły 400 przecinek 200 przecinek P3D zamknij nawias okrągły średnik. Linia 3. prawy ukośnik prawy ukośnik lub dwukropek. Linia 5. size otwórz nawias okrągły 400 przecinek 200 przecinek PDF przecinek cudzysłów nazwa lewy ukośnik podkreślnik pliku kropka pdf cudzysłów zamknij nawias okrągły średnik.

Powyższy kod jest wszystkim, czego potrzeba, by uruchomić okno dla OPENGL.

Metoda draw

Drugą istotną funkcją jest funkcja draw:

Linia 1. void draw otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy zamknij nawias klamrowy.

Jest ona wywoływana cyklicznie w każdej klatce działania programu, zatem w niej należy umieścić kod odpowiedzialny za rysowanie i wszelkie operacje, które powinny odbywać się co klatkę. Można prześledzić to na przykładzie. Należy dodać dwie zmienne typu całkowitego do kodu programu, które będą przechowywać położenie rysowanego obiektu:

Linia 1. int posx znak równości 0 przecinek posy znak równości 0 średnik.

Linię tę trzeba umieścić poza omawianymi wcześniej metodami. Teraz w metodzie draw() można dodać rysowanie kwadratu i zwiększenie położenia jego wyrysowania:

Linia 1. posx znak równości posy plus plus średnik. Linia 2. rect otwórz nawias okrągły posx przecinek posy przecinek 50 przecinek 50 zamknij nawias okrągły średnik. Linia 4. prawy ukośnik prawy ukośnik Operator plus plus oznacza tutaj inkrementację przecinek czyli zwiększanie wartości o jeden kropka.

Całość powinna wyglądać następująco:

Linia 1. int posx znak równości 0 przecinek posy znak równości 0 średnik. Linia 3. void setup otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 4. size otwórz nawias okrągły 400 przecinek 200 zamknij nawias okrągły średnik. Linia 5. zamknij nawias klamrowy. Linia 7. void draw otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 8. posx znak równości posy plus plus średnik. Linia 9. rect otwórz nawias okrągły posx przecinek posy przecinek 50 przecinek 50 zamknij nawias okrągły średnik. Linia 10. zamknij nawias klamrowy.

Aby wyrysować tylko jedną klatkę lub zatrzymać animację należy skorzystać z metody noLoop(). Jeśli umieści się ją wewnątrz metody setup, program wywoła metodę draw() tylko raz:

Linia 1. void setup otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. size otwórz nawias okrągły 400 przecinek 200 zamknij nawias okrągły średnik. Linia 3. noLoop otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 4. zamknij nawias klamrowy.

Funkcją o działaniu odwrotnym do noLoop() jest funkcja loop(), która jest domyślnie wywoływana przy starcie programu, (jeśli nie zadeklaruje się inaczej). Jeśli do kodu zostanie dopisane wywołanie funkcji loop() na końcu metody draw(), to otrzymany efekt będzie taki, jakby w ogóle nie dodano wywołania pary loop()noLoop(). Aby powrócić do widoku animacji należy usunąć oba wpisy (loop() oraz noLoop()).
W powyższym przykładzie kwadrat rysowany jest od lewego górnego narożnika, jednak można to zmienić, przez dodanie odpowiedniego ustawienia w metodzie setup(), dla wbudowanych funkcji rysujących kształty, czy ma on być rysowny od narożnika, czy względem środka. Dla metody rect() wygląda to następująco:

Linia 1. rectMode otwórz nawias okrągły CENTER zamknij nawias okrągły średnik.

By powrócić do domyślnego ustawienia, należy skorzystać z metody:

Linia 1. rectMode otwórz nawias okrągły CORNER zamknij nawias okrągły średnik.

Analogiczne metody istnieją dla pozostałych metod rysujących – jest to omówione w dokumentacji programu Processing.
Kolor obrysu i wypełnienia zostały ustawione na wartości domyślne. Zmienić je można przy pomocy następujących metod:

Linia 1. fill otwórz nawias okrągły 0 zamknij nawias okrągły średnik. Linia 2. stroke otwórz nawias okrągły 255 zamknij nawias okrągły średnik.

W powyższym przykładzie kolor wypełnienia ustawiony jest na czarny, a kolor obrysu na biały. Można także użyć innego koloru, ale zostanie to omówione później. Jeśli powyższe metody zostaną umieszczone w metodzie setup(), będą dotyczyły wszystkich rysowanych obiektów tak długo, póki nie zostaną zmienione. Można je także umieścić wewnątrz funkcji draw(). Wtedy dotyczyć będą obiektów narysowanych po ich wywołaniu. Dlatego można określić Processing jako maszynę stanową – raz ustawiony stan jest używany globalnie, aż do jego zmiany. Jeżeli chce się korzystać jedynie z wypełnienia lub tylko z obrysu, należy skorzystać z jednej z poniższych metod:

Linia 1. noStroke otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 2. noFill otwórz nawias okrągły zamknij nawias okrągły średnik.

Wypełnienie i/lub obrys będą wyłączone do ponownego wywołania metody ustawiającej ich kolor (czyli fill() lub stroke()).

Polecenie 3

Przeanalizuj i przetestuj poniższy kod.

Linia 1. int x średnik. Linia 2. int r średnik. Linia 3. int krok średnik. Linia 5. void setup otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 6. size otwórz nawias okrągły 500 przecinek 500 zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Rozmiar okna ustawiony na 500x500 pikseli. Linia 7. frameRate otwórz nawias okrągły 24 zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Zmiana wyświetlania liczby klatek na sekundę. Linia 8. r znak równości 100 średnik prawy ukośnik prawy ukośnik Promień kuli. Linia 9. krok znak równości 5 średnik prawy ukośnik prawy ukośnik Krok o ile porusza się kula na jedną klatkę. Linia 10. x znak równości width prawy ukośnik 2 średnik prawy ukośnik prawy ukośnik Pozycja startowa na osi X kuli. Linia 11. fill otwórz nawias okrągły 0 przecinek 0 przecinek 0 zamknij nawias okrągły średnik. Linia 12. background otwórz nawias okrągły 255 przecinek 255 przecinek 255 zamknij nawias okrągły średnik. Linia 13. zamknij nawias klamrowy. Linia 15. void draw otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 16. if otwórz nawias okrągły x zamknij nawias ostrokątny znak równości width minus r prawy ukośnik 2 kreska pionowa kreska pionowa x otwórz nawias ostrokątny znak równości r prawy ukośnik 2 zamknij nawias okrągły otwórz nawias klamrowy. Linia 17. krok asterysk znak równości minus 1 średnik prawy ukośnik prawy ukośnik Przy kolizji następuje zmiana znaku zmiennej krok. Linia 18. zamknij nawias klamrowy. Linia 19. background otwórz nawias okrągły 255 przecinek 255 przecinek 255 zamknij nawias okrągły średnik. Linia 20. ellipse otwórz nawias okrągły x przecinek 200 przecinek r przecinek r zamknij nawias okrągły średnik. Linia 21. x plus znak równości krok średnik. Linia 22. zamknij nawias klamrowy.

Metoda exit

Ostatnią główną metodą (lecz nie ostatnią dostępną), jest funkcja wyjścia. W niej należy określić wszystkie czynności konieczne do wykonania przed zamknięciem programu. Metoda ta nazywa się exit(). W metodzie tej można wyświetlić komunikat podczas zamykania programu:

Linia 1. void exit otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. println otwórz nawias okrągły cudzysłów Koniec programu cudzysłów zamknij nawias okrągły średnik. Linia 3. zamknij nawias klamrowy.

Po uruchomieniu programu komunikat ten jest wyświetlany, ale program nie zostanie zamknięty. Należy samemu obsłużyć zamknięcie okna aplikacji, przez dopisanie na końcu programu, instrukcji:

Linia 1. super kropka exit otwórz nawias okrągły zamknij nawias okrągły średnik.

Spowoduje to wywołanie domyślnej obsługi metody exit(). Metody tej można również użyć w dowolnym miejscu kodu np. w reakcji na działanie użytkownika. Jej wywołanie spowoduje zamknięcie aplikacji. Dla testów można dopisać jej wywołanie np. na końcu metody draw(), która teraz powinna wyglądać następująco:

Linia 1. void draw otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. background otwórz nawias okrągły 100 zamknij nawias okrągły średnik. Linia 3. posx znak równości posy plus plus średnik. Linia 4. rect otwórz nawias okrągły posx przecinek posy przecinek 50 przecinek 50 zamknij nawias okrągły średnik. Linia 5. exit otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 6. zamknij nawias klamrowy.

Aby zapoznać się z efektem działania programu, należy jednak usunąć tę linijkę, gdyż w przypadku jej pozostawienia aplikacja momentalnie zakończy swoje działanie po uruchomieniu.

Własne funkcje i błędy kompilacji

W celu poprawienia czytelności kodu można rysowanie kwadratu przenieść do osobnej funkcji, i jej wywołanie umieścić w metodzie draw():

Linia 1. void draw otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. background otwórz nawias okrągły 100 zamknij nawias okrągły średnik. Linia 3. posx znak równości posy plus plus średnik. Linia 4. rysujKwadrat otwórz nawias okrągły posx przecinek posy zamknij nawias okrągły średnik. Linia 5. zamknij nawias klamrowy. Linia 7. void rysujKwadrat otwórz nawias okrągły int podkreślnik x przecinek int podkreślnik y zamknij nawias okrągły otwórz nawias klamrowy. Linia 8. rect otwórz nawias okrągły podkreślnik x przecinek podkreślnik y przecinek 50 przecinek 50 zamknij nawias okrągły średnik. Linia 9. zamknij nawias klamrowy.

Należy pamiętać, by plik z kodem źródłowym programu znajdował się w folderze o tej samej nazwie co nazwa pliku (czyli plik „test.pde” powinien znajdować się w folderze „test”) - inaczej otrzyma się błąd. Jeśli chodzi o błędy kompilacji w środowisku Processing, warto wspomnieć o jednej, nie do końca oczywistej, właściwości tego środowiska. By to zobrazować, należy wygenerować celowy błąd, np. poprzez wywołanie nieistniejącej funkcji. Na dole okna pojawia się wtedy treść powstałego błędu oraz dodatkowo numer linii, w której on się pojawił.

RaMNP4qzm4p6j
Informacja o błędzie - Processing
Źródło: GroMar Sp. z o.o., licencja: CC BY 3.0.

Należy jednak uważać, bowiem w tym miejscu standardowo pojawia się numer bieżącej linii, w programie. Po kliknięciu gdziekolwiek na kod, zniknie zaznaczenie linii błędu i jej numer. Żeby się dowiedzieć o którą linię chodziło, należy ponownie uruchomić program.

Tryby pracy

Od wersji 2.0 środowisko Processing.org oferuje kilka trybów pracy (a nowe są cały czas tworzone i dodawane). Są to m. in.:

  • Standard – podstawowy i domyślny tryb dostępny w Processing'u. Pozwala tworzyć i eksportować aplikacje desktop'owe jednocześnie na różne platformy (Windows, Mac OS, Linux). Umożliwia także zapis projektu jako aplet w środowisku java uruchamiany w przeglądarce (wraz ze wsparciem dla 3D), jednak to rozwiązanie nie jest już rozwijane (zamiast tego zaleca się wykorzystanie trybu JavaScript). Tryb ten zalecany jest jako domyślny podczas nauki i pisania pierwszych programów w środowisku Processing.org.

  • Android – zaprezentowany po raz pierwszy w wersji 1.5 środowiska Processing.org, był pierwszym dostępnym, poza standardowym, trybem. Umożliwia tworzenie i uruchamianie projektów na urządzeniach z systemem Android. Począwszy od wersji 2.0 środowiska, wspierane są tylko wersje wyższe niż Android 2.3.3 (Gingerbread, API 10). Zanim napisze się aplikację, należy podłączyć urządzenie wykorzystując kabel USB, następnie w środowisku rozwijamy zakładkę Android, z rozwijanej listy Devices wybieramy nasze urządzenie. Teraz można uruchomić kod w języku Processing na urządzeniu z systemem Android. Dokumentację Processing dla Android znajdziesz pod linkiem: https://android.processing.org/

  • p5.js – pozwala tworzyć aplikacje uruchamiane bezpośrednio z przeglądarki. Jest to biblioteka JavaScript do kreatywnego kodowania, dostarcza narzędzia, które upraszczają proces tworzenia interaktywnych wizualizacji z kodem w przeglądarce internetowej.  To rozwiązanie zastępuje aplety znane z wcześniejszych wersji środowiska. Dokumentacja znajduje się pod linkiem: https://p5js.org/

  • Python - rozszerzenie do Processing, umożliwiające pisanie programów Processing w języku programowania Python. Dokumentacja znajduje się pod linkiem: https://py.processing.org/

Tryb można zmienić poprzez menu rozwijane w prawym górnym obszarze okna programu.

R1OPxy3ZcwJdp
Zmiana trybu pracy - Processing
Źródło: GroMar Sp. z o.o., licencja: CC BY 3.0.

Samo środowisko nie ulega znacznej zmianie przy zmianie trybu pracy, lecz należy mieć na uwadze w jakim trybie obecnie pracujemy, gdyż ma to wpływ na to jak powinniśmy pisać kod.

Działanie trybów przeanalizujemy na przykładzie napisanym w różnych trybach pracy. Przykładowy kod stworzy kilka kolorowych kół rysowanych na środku okna, promień koła początkowo ma wartość równą szerokości okna, następnie zmniejsza się, aż osiągnie wartość 0. W kodzie mamy zmienną kroku, która mówi o ile zmniejszany jest promień koła przy każdej iteracji.

Standard

Domyślny tryb pracy w środowisku Processing.

Szkicownik:

Linia 1. int promien średnik. Linia 2. int krok średnik. Linia 4. void setup otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. size otwórz nawias okrągły 500 przecinek 500 zamknij nawias okrągły średnik. Linia 6. background otwórz nawias okrągły 0 przecinek 0 przecinek 0 zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Tło koloru czarnego. Linia 7. krok znak równości 10 średnik prawy ukośnik prawy ukośnik Krok o jaki zmniejszamy promień. Linia 8. promien znak równości width średnik prawy ukośnik prawy ukośnik Promień koła. Linia 9. noLoop otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 10. zamknij nawias klamrowy. Linia 12. void draw otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 13. while otwórz nawias okrągły promien zamknij nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 14. fill otwórz nawias okrągły random otwórz nawias okrągły 256 zamknij nawias okrągły przecinek random otwórz nawias okrągły 256 zamknij nawias okrągły przecinek random otwórz nawias okrągły 256 zamknij nawias okrągły zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Losowy wybór koloru przecinek funkcja random otwórz nawias okrągły 256 zamknij nawias okrągły zwraca liczbę z zakresu od 0 do 255 kropka. Linia 15. ellipse otwórz nawias okrągły width prawy ukośnik 2 przecinek width prawy ukośnik 2 przecinek promien przecinek promien zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Koło rysowane na środku okna z zadanym promieniem kropka. Linia 16. promien minus znak równości krok średnik prawy ukośnik prawy ukośnik Zmniejszenie wartości promienia o stały krok kropka. Linia 17. zamknij nawias klamrowy. Linia 18. zamknij nawias klamrowy.

Wynik kodu:

Rk5kHMNT1H3Di
Tryb pracy Standard - wynik przykładowego kodu
Źródło: GroMar Sp. z o.o., licencja: CC BY 3.0.

p5.js

Kod piszemy w języku JavaScript, struktura kodu dalej jest intuicyjna. Należy zauważyć, że chcąc zdefiniować rozmiar naszego „okna”, trzeba skorzystać z metody createCanvas(), jej dwa parametry definiują kolejno szerokość oraz wysokość naszego „okna” w przeglądarce. Należy zwrócić uwagę, że nie powinno się używać width, przed wywołaniem createCanvas(). Przy pracy w trybie p5.js oprócz szkicownika mamy do czynienia jeszcze z plikiem index.html, który jest stroną zawierającą skrypt tworzonego szkicownika. W większości przypadków ten plik powinien pozostać bez zmian.

Szkicownik:

Linia 1. let krok średnik prawy ukośnik prawy ukośnik Krok o jaki zmniejszamy promień. Linia 2. let promien średnik prawy ukośnik prawy ukośnik Promień koła. Linia 4. function setup otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. createCanvas otwórz nawias okrągły 500 przecinek 500 zamknij nawias okrągły średnik. Linia 6. krok znak równości 10 średnik. Linia 7. promien znak równości width średnik. Linia 8. background otwórz nawias okrągły 0 przecinek 0 przecinek 0 zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Tło koloru czarnego. Linia 9. noLoop otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 10. zamknij nawias klamrowy. Linia 13. function draw otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 14. while otwórz nawias okrągły promien zamknij nawias ostrokątny 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 15. fill otwórz nawias okrągły random otwórz nawias okrągły 256 zamknij nawias okrągły przecinek random otwórz nawias okrągły 256 zamknij nawias okrągły przecinek random otwórz nawias okrągły 256 zamknij nawias okrągły zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Losowy wybór koloru przecinek funkcja random otwórz nawias okrągły 256 zamknij nawias okrągły zwraca liczbę z zakresu od 0 do 255 kropka. Linia 16. ellipse otwórz nawias okrągły width prawy ukośnik 2 przecinek width prawy ukośnik 2 przecinek promien przecinek promien zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Koło rysowane na środku okna z zadanym promieniem kropka. Linia 17. promien minus znak równości krok średnik prawy ukośnik prawy ukośnik Zmniejszenie wartości promienia o stały krok kropka. Linia 18. zamknij nawias klamrowy. Linia 19. zamknij nawias klamrowy.

Plik index.html:

R116Pot8xEE3u
Plik index.html
Źródło: GroMar Sp. z o.o., licencja: CC BY 3.0.

Wynik kodu:

RasqVVei8YQ1h
Tryby pracy p5.js - wynik przykładowego kodu
Źródło: GroMar Sp. z o.o., licencja: CC BY 3.0.

Python

Kod piszemy w języku Python, struktura dalej pozostaje intuicyjna. Istotne jest, aby nadać zmiennym pewną wartość na początku, w tym przykładzie zmienna promien początkowo ma wartość 0, gdyż nie można do niej przypisać width w tym momencie ( size() nie zostało jeszcze wywołane ). Aby odwołać się do zmiennej lub zmienić jej wartość należy wykorzystać słowo kluczowe global.

Szkicownik:

Linia 1. krok znak równości 10 kratka Krok o jaki zmniejszamy promień. Linia 2. promien znak równości 0 kratka Promień koła. Linia 4. def setup otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 5. size otwórz nawias okrągły 500 przecinek 500 zamknij nawias okrągły. Linia 6. global promien. Linia 7. promien znak równości width. Linia 8. background otwórz nawias okrągły 0 przecinek 0 przecinek 0 zamknij nawias okrągły kratka Tło koloru czarnego. Linia 9. noLoop otwórz nawias okrągły zamknij nawias okrągły. Linia 12. def draw otwórz nawias okrągły zamknij nawias okrągły dwukropek. Linia 13. global krok. Linia 14. global promien. Linia 15. while otwórz nawias okrągły promien zamknij nawias ostrokątny 0 zamknij nawias okrągły dwukropek. Linia 16. fill otwórz nawias okrągły random otwórz nawias okrągły 256 zamknij nawias okrągły przecinek random otwórz nawias okrągły 256 zamknij nawias okrągły przecinek random otwórz nawias okrągły 256 zamknij nawias okrągły zamknij nawias okrągły kratka Losowy wybór koloru przecinek funkcja random otwórz nawias okrągły 256 zamknij nawias okrągły zwraca liczbę z zakresu od 0 do 255 kropka. Linia 17. ellipse otwórz nawias okrągły width prawy ukośnik 2 przecinek width prawy ukośnik 2 przecinek promien przecinek promien zamknij nawias okrągły kratka Koło rysowane na środku okna z zadanym promieniem kropka. Linia 18. promien minus znak równości krok kratka Zmniejszenie wartości promienia o stały krok kropka.
RoMNoIY8ONHQD
Tryb pracy Python - wynik przykładowego kodu
Źródło: GroMar Sp. z o.o., licencja: CC BY 3.0.

Instalacja zewnętrznych bibliotek

Gdy w API Processing'u nie można znaleźć potrzebnej metody czy klasy, warto poszukać dodatkowych bibliotek. Biblioteki takie znajdują się na stronie środowiska - http://processing.org/reference/libraries/ , a także na wielu innych stronach. Samo środowisko zawiera już kilka przydatnych bibliotek jak np. Video, Network czy PDF Export. Jedyne co trzeba zrobić, by zainstalować pobraną bibliotekę, to przekopiować wszystkie pliki (zachowując strukturę folderów stworzoną przez autora biblioteki) do odpowiedniego folderu. Od wersji 1.0 i wyższej, wszelkie biblioteki potrzebne do wykonania projektu umieszcza się w podfolderze „libraries” w folderze „szkicownika” (czyli jako podfolder folderu sketchbook, którego lokalizacja została ustalona wcześniej podczas konfiguracji). By dodać bibliotekę do projektu, wystarczy, że wykonasz jeden z poniższych kroków:

  • skorzystaj z menu Sketch->Import Library wybierając żądaną bibliotekę,

  • wpisz na początku programu słowo „import” i po spacji nazwę biblioteki wraz z pakietem, w którym się znajduje.

Niezależnie od wybranego sposobu, otrzymuje się identyczny efekt. Przykładowo, jeśli chcemy zaimportować bibliotekę do obsługi wideo, na początku pliku należy wpisać:

Linia 1. import processing kropka video kropka lewy ukośnik asterysk średnik.

co pozwoli na korzystanie z klas i metod tej biblioteki.

RKxKZQoCG5vyG
Pasek zadań - Processing
Źródło: GroMar Sp. z o.o., licencja: CC BY 3.0.
RU1bV8Zgs7KAj
Widok dostępnych bibliotek - Processing
Źródło: GroMar Sp. z o.o., licencja: CC BY 3.0.

Obsługa klawiatury

Za obsługę klawiatury odpowiada kolejna główna metoda, a mianowicie:

Linia 1. void keyPressed otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy zamknij nawias klamrowy.

Ustawienie wewnątrz niej obsługi klawiatury zapewnia, że będzie ona wykonywana w każdej klatce. Można jednak pominąć tę metodę i umieścić obsługę w każdej innej metodzie (np. draw()), gdyż nie zawiera ona żadnych parametrów. Zdarzenie klawiatury nie jest przekazywane do metody, a zachowywane w zmiennych globalnych, które zostaną omówione w dalszej części. Ta metoda gwarantuje jednak wywołanie w każdej klatce i estetykę kodu. Zamiast niej można sprawdzać flagę naciśnięcia klawisza o tej samej nazwie co metoda (czyli keyPressed()), w następujący sposób:

Linia 1. if otwórz nawias okrągły keyPressed zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. prawy ukośnik prawy ukośnik tutaj właściwa obsługa klawiatury. Linia 3. zamknij nawias klamrowy.

Zaleca się jednak korzystanie z metody keyPressed(). Aby sprawdzić, który klawisz został wciśnięty, należy użyć zmiennej globalnej key:

Linia 1. switch otwórz nawias okrągły key zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. case apostrof a apostrof dwukropek bgColor znak równości 0 średnik break średnik. Linia 3. case apostrof s apostrof dwukropek bgColor znak równości 100 średnik break średnik. Linia 4. case apostrof d apostrof dwukropek bgColor znak równości 200 średnik break średnik. Linia 5. zamknij nawias klamrowy.

Można dodać także zmienną bgColor, która będzie odpowiadać za zmianę koloru tła i przekazać ją jako parametr do funkcji background w metodzie rysującej. Dzięki temu, po naciśnięciu klawisza „a” tło zmieni się na czarne, po naciśnięciu klawisza „s” na ciemnoszare, a naciśnięcie klawisza „d” zmieni je na jasnoszare. Co jednak zrobić, gdy jest to klawisz specjalny, jak np. strzałka czy enter? Należy wówczas skorzystać z kolejnej zmiennej globalnej – keyCode. Zawiera ona kod ASCII klawisza, który został wciśnięty. Aby więc dopisać obsługę zatrzymania i wznowienia animacji przy pomocy strzałek na klawiaturze należy napisać kod:

Linia 1. if otwórz nawias okrągły key znak równości znak równości CODED zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. switch otwórz nawias okrągły keyCode zamknij nawias okrągły otwórz nawias klamrowy. Linia 3. case UP dwukropek loop otwórz nawias okrągły zamknij nawias okrągły średnik break średnik. Linia 4. case DOWN dwukropek noLoop otwórz nawias okrągły zamknij nawias okrągły średnik break średnik. Linia 5. zamknij nawias klamrowy. Linia 6. zamknij nawias klamrowy.

Powyższy przykład zawiera pewne stałe zdefiniowane w języku Processing. Łącząc oba przypadki poprzez dodanie słowa kluczowego „else” przed obsługą zwykłych klawiszy, otrzymamy kompletną obsługę klawiatury.

Polecenie 4

Przeanalizuj i przetestuj poniższy kod.

Linia 1. prawy ukośnik prawy ukośnik Kod pionka chodzącego po szachownicy przecinek sterowanie strzałkami. Linia 3. int x średnik prawy ukośnik prawy ukośnik Pozycje pionka. Linia 4. int y średnik. Linia 6. void setup otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 7. size otwórz nawias okrągły 800 przecinek 800 zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Rozmiar okna. Linia 8. x znak równości 25 średnik. Linia 9. y znak równości 25 średnik. Linia 10. zamknij nawias klamrowy. Linia 12. void draw otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 13. background otwórz nawias okrągły 255 przecinek 255 przecinek 255 zamknij nawias okrągły średnik. Linia 14. prawy ukośnik prawy ukośnik Rysowanie szachownicy. Linia 15. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny width średnik i znak równości i plus 50 zamknij nawias okrągły otwórz nawias klamrowy. Linia 16. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny height średnik j znak równości j plus 50 zamknij nawias okrągły otwórz nawias klamrowy. Linia 17. if otwórz nawias okrągły otwórz nawias okrągły i prawy ukośnik 50 plus j prawy ukośnik 50 zamknij nawias okrągły procent 2 znak równości znak równości 0 zamknij nawias okrągły otwórz nawias klamrowy. Linia 18. fill otwórz nawias okrągły 0 przecinek 0 przecinek 0 zamknij nawias okrągły średnik. Linia 19. zamknij nawias klamrowy. Linia 20. else otwórz nawias klamrowy. Linia 21. fill otwórz nawias okrągły 255 przecinek 255 przecinek 255 zamknij nawias okrągły średnik. Linia 22. zamknij nawias klamrowy. Linia 23. rect otwórz nawias okrągły i przecinek j przecinek 50 przecinek 50 zamknij nawias okrągły średnik. Linia 24. zamknij nawias klamrowy. Linia 25. zamknij nawias klamrowy. Linia 26. prawy ukośnik prawy ukośnik Rysowanie pionka. Linia 27. fill otwórz nawias okrągły 255 przecinek 0 przecinek 0 zamknij nawias okrągły średnik. Linia 28. ellipse otwórz nawias okrągły x przecinek y przecinek 40 przecinek 40 zamknij nawias okrągły średnik. Linia 29. zamknij nawias klamrowy. Linia 31. void keyPressed otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 32. prawy ukośnik prawy ukośnik Obsługa wciskania klawiszy przecinek w tym przypadku strzałek. Linia 33. if otwórz nawias okrągły key znak równości znak równości CODED zamknij nawias okrągły otwórz nawias klamrowy. Linia 34. switch otwórz nawias okrągły keyCode zamknij nawias okrągły otwórz nawias klamrowy. Linia 35. case LEFT dwukropek x minus znak równości 50 średnik break średnik. Linia 36. case RIGHT dwukropek x plus znak równości 50 średnik break średnik. Linia 37. case UP dwukropek y minus znak równości 50 średnik break średnik. Linia 38. case DOWN dwukropek y plus znak równości 50 średnik break średnik. Linia 39. zamknij nawias klamrowy. Linia 40. zamknij nawias klamrowy. Linia 41. zamknij nawias klamrowy.

Obsługa myszy

Obsługa myszy, tak jak w przypadku klawiatury, możliwa jest na dwa sposoby. Najczęściej wykorzystuje się zmienne globalne (dostępne w każdym miejscu programu) przechowujące położenie kursora myszy: mouseX oraz mouseY. Po zakomentowaniu wywołania utworzonej poprzednio funkcji rysującej kwadrat, można napisać wywołanie rysowania z położeniem kursora myszy jako pozycją tworzonego kwadratu. Dodając do tego poznaną wcześniej metodę, by rysować kwadrat od środka, otrzyma się efekt podążania kwadratu za kursorem myszy (kursor w środku obiektu). Fragment kodu za to odpowiedzialny powinien wglądać następująco:

Linia 1. prawy ukośnik prawy ukośnik rysujKwadrat otwórz nawias okrągły posx przecinek posy zamknij nawias okrągły średnik. Linia 2. rectMode otwórz nawias okrągły CENTER zamknij nawias okrągły średnik. Linia 3. rect otwórz nawias okrągły mouseX przecinek mouseY przecinek 50 przecinek 50 zamknij nawias okrągły średnik.

Główną metodą, odpowiadającą za obsługę kliknięcia myszy jest mousePressed() bez żadnych parametrów. Jeśli umieści się ją w programie i przeniesie do niej napisane przed chwilą dwie linie rysujące kwadrat, to otrzyma się białe tło i „mignięcie” kwadratu przy kliknięciu przycisku myszy. Dlaczego tak się dzieje? Co należy zmienić w kodzie, by rysowany kwadrat pozostawał widoczny? Trzeba zakomentować (lub usunąć) pierwszą linię w metodzie draw(), czyli wypełnienie tła kolorem. Alternatywnie można ją przenieść do metody setup, dzięki czemu będzie wywołana tylko raz z zadanym kolorem jako parametr. Teraz rysowany na kliknięcie kwadrat powinien pozostawać na obrazie. Dodatkowo można sprawdzić, który przycisk został wciśnięty. Do tego celu służy kolejna globalna zmienna - mouseButton(). Najlepiej zobrazuje to poniższy przykład:

Linia 1. switch otwórz nawias okrągły mouseButton zamknij nawias okrągły otwórz nawias klamrowy. Linia 2. case LEFT dwukropek println otwórz nawias okrągły cudzysłów Wciśnięto LEWY przycisk cudzysłów zamknij nawias okrągły średnik break średnik. Linia 3. case RIGHT dwukropek println otwórz nawias okrągły cudzysłów Wciśnięto PRAWY przycisk cudzysłów zamknij nawias okrągły średnik break średnik. Linia 4. case CENTER dwukropek println otwórz nawias okrągły cudzysłów Wciśnięto ŚRODKOWY przycisk cudzysłów zamknij nawias okrągły średnik break średnik. Linia 5. zamknij nawias klamrowy.

Inne przydatne podczas obsługi myszy metody to:

  • mouseClicked() - dla obsługi kliknięcia (w przeciwieństwie do naciśnięcia jest to złożenie dwóch akcji – wciśnięcia i puszczenia przycisku myszy),

  • mouseDragged() - dla obsługi przeciągania,

  • mouseMoved() - dla obsługi ruchu myszą (bez wciśnięcia przycisku myszy),

  • mouseReleased() - odwrotne niż mousePressed() - puszczenie przycisku myszy.

Polecenie 5

Przeanalizuj i przetestuj poniższy kod.

Linia 1. prawy ukośnik prawy ukośnik Kod ustawiający kolor tła przy wciskaniu przycisku myszy. Linia 3. int r średnik prawy ukośnik prawy ukośnik Składowe koloru tła. Linia 4. int g średnik. Linia 5. int b średnik. Linia 7. int rect podkreślnik r średnik prawy ukośnik prawy ukośnik Składowe koloru kwadratu w lewym górnym rogu okna. Linia 8. int rect podkreślnik g średnik. Linia 9. int rect podkreślnik b średnik. Linia 11. void setup otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 12. size otwórz nawias okrągły 765 przecinek 765 zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Rozmiar okna. Linia 13. r znak równości 255 średnik. Linia 14. g znak równości 255 średnik. Linia 15. b znak równości 255 średnik. Linia 16. rect podkreślnik r znak równości 255 średnik. Linia 17. rect podkreślnik g znak równości 255 średnik. Linia 18. rect podkreślnik b znak równości 255 średnik. Linia 19. zamknij nawias klamrowy. Linia 21. void draw otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 22. background otwórz nawias okrągły r przecinek g przecinek b zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Aktualizowanie zmiennych na podstawie nowych wartości. Linia 23. fill otwórz nawias okrągły rect podkreślnik r przecinek rect podkreślnik g przecinek rect podkreślnik b zamknij nawias okrągły średnik. Linia 24. rect otwórz nawias okrągły 0 przecinek 0 przecinek 50 przecinek 50 zamknij nawias okrągły średnik. Linia 25. zamknij nawias klamrowy. Linia 27. void mousePressed otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 28. prawy ukośnik prawy ukośnik Kliknięcie myszą powoduje ustawienie koloru z kwadratu na tło. Linia 29. r znak równości mouseX prawy ukośnik 3 średnik. Linia 30. g znak równości mouseY prawy ukośnik 3 średnik. Linia 31. b znak równości r minus g średnik. Linia 32. zamknij nawias klamrowy. Linia 34. void mouseMoved otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 35. prawy ukośnik prawy ukośnik Poruszając myszą zmieniamy kolor kwadratu. Linia 36. rect podkreślnik r znak równości mouseX prawy ukośnik 3 średnik. Linia 37. rect podkreślnik g znak równości mouseY prawy ukośnik 3 średnik. Linia 38. rect podkreślnik b znak równości r minus g średnik. Linia 39. zamknij nawias klamrowy. Linia 41. void mouseReleased otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 42. prawy ukośnik prawy ukośnik Po puszczeniu przycisku myszy w konsoli wyświetlamy wartości. Linia 43. print otwórz nawias okrągły cudzysłów R dwukropek cudzysłów plus r plus cudzysłów G dwukropek cudzysłów plus g plus cudzysłów B dwukropek cudzysłów plus b plus cudzysłów lewy ukośnik n cudzysłów zamknij nawias okrągły średnik. Linia 44. zamknij nawias klamrowy.

Operowanie na plikach wektorowych

Polecenie 6

Przeanalizuj i przetestuj poniższy kod.

Linia 1. size otwórz nawias okrągły 400 przecinek 400 zamknij nawias okrągły średnik. Linia 2. rectMode otwórz nawias okrągły CENTER zamknij nawias okrągły średnik. Linia 3. pushMatrix otwórz nawias okrągły zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Zapisanie początkowego układu współrzędnych. Linia 5. prawy ukośnik prawy ukośnik Przeskalowanie układu współrzędnych. Linia 6. prawy ukośnik prawy ukośnik Wzdłuż osi X o 200 procent. Linia 7. prawy ukośnik prawy ukośnik scale otwórz nawias okrągły 2 przecinek 1 zamknij nawias okrągły średnik. Linia 10. prawy ukośnik prawy ukośnik Rysowanie prostokąta na dwa sposoby. Linia 11. prawy ukośnik prawy ukośnik W punkcie otwórz nawias okrągły 100 przecinek 200 zamknij nawias okrągły. Linia 12. rect otwórz nawias okrągły 100 przecinek 200 przecinek 50 przecinek 50 zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Pierwszy. Linia 13. prawy ukośnik prawy ukośnik translate otwórz nawias okrągły 100 przecinek 200 zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Drugi. Linia 14. prawy ukośnik prawy ukośnik rect otwórz nawias okrągły 0 przecinek 0 przecinek 50 przecinek 50 zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Drugi. Linia 17. prawy ukośnik prawy ukośnik Rysowanie prostokąta w otwórz nawias okrągły 100 przecinek 200 zamknij nawias okrągły. Linia 18. prawy ukośnik prawy ukośnik Obrócony o 45 stopni na dwa sposoby. Linia 19. prawy ukośnik asterysk. Linia 20. popMatrix otwórz nawias okrągły zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Przywrócenie początkowego układu współrzędnych. Linia 21. translate otwórz nawias okrągły 100 przecinek 200 zamknij nawias okrągły średnik. Linia 22. rotate otwórz nawias okrągły PI prawy ukośnik 4 zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Pierwszy. Linia 23. prawy ukośnik prawy ukośnik rotate otwórz nawias okrągły radians otwórz nawias okrągły 45 zamknij nawias okrągły zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Drugi. Linia 24. rect otwórz nawias okrągły 0 przecinek 0 przecinek 50 przecinek 50 zamknij nawias okrągły średnik. Linia 25. asterysk prawy ukośnik.

Linijka 10‑14

Transformacje w języku Processing działają w taki sposób, że przekształcany jest cały obecny układ współrzędnych. Zatem można narysować przykładowo prostokąt w punkcie (100, 200) na dwa sposoby.

Pierwszy przypadek jest oczywisty, natomiast w drugim najpierw przenosi się cały układ do zadanego punktu, a następnie rysuje obiekt.

Linijka 17‑25

Aby narysować kwadrat również w punkcie (100, 200), ale obrócony o 45 stopni, trzeba skorzystać ze złożenia przekształceń – translacji oraz obrotu. Jako argument metoda rotate() przyjmuje kąt, którego wartość podajemy w radianach. Jeśli kąt obrotu określony jest w stopniach, to należy skorzystać z metody radians(), konwertującej stopnie na radiany.

Linijka 5‑7

Trzecią przydatną transformacją jest skalowanie, czyli operacją zmiany proporcji wymiarów względem początku układu współrzędnych – metoda scale(), której przekazuje się procentowe wartości o ile chcemy przeskalować wzdłuż osi X oraz Y.

Operowanie na obrazach rastrowych.

W dalszej części potrzebny będzie obrazek, możesz wykorzystać własny obrazek lub pobrać przykładowy poniżej.

R13zpn1OUBtIq

Załącznik zawiera zdjęcie małej kaczki, potrzebnej do dalszej części materiału.

Obrazek małej kaczki
Źródło: GroMar Sp. z o.o., licencja: CC BY 3.0.
Plik JPG o rozmiarze 172.98 KB w języku polskim

Aby pracować na poziomie pikseli obrazu, należy wykonać kilka kroków, a mianowicie:
załadować piksele, dokonać zmian na nich, zaktualizować piksele na obrazie. Ten proces pokazany jest na przykładzie funkcji zmieniającej wyświetlany obraz na negatyw.

Polecenie 7

Przeanalizuj i przetestuj poniższy kod.

Linia 1. prawy ukośnik asterysk. Linia 2. Odwrócenie koloru poprzez odjęcie od maksymalnej wartości otwórz nawias okrągły 255 zamknij nawias okrągły. Linia 3. obecnej wartości koloru w danym pikselu przecinek a następnie ustawienie. Linia 4. nowego koloru piksela kropka. Linia 5. asterysk prawy ukośnik. Linia 7. PImage img średnik. Linia 9. void setup otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 10. size otwórz nawias okrągły 500 przecinek 500 zamknij nawias okrągły średnik. Linia 11. img znak równości loadImage otwórz nawias okrągły cudzysłów duck kropka jpg cudzysłów zamknij nawias okrągły średnik. Linia 12. noLoop otwórz nawias okrągły zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Chcemy wyświetlić obrazek tylko raz. Linia 13. zamknij nawias klamrowy. Linia 15. void draw otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 16. image otwórz nawias okrągły img przecinek 0 przecinek 0 przecinek width przecinek height zamknij nawias okrągły średnik. Linia 17. prawy ukośnik prawy ukośnik invertColors otwórz nawias okrągły zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Odkomentuj przecinek aby przetestować działanie. Linia 18. zamknij nawias klamrowy. Linia 20. void invertColors otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 21. loadPixels otwórz nawias okrągły zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Pobranie pikseli obecnego obrazu. Linia 22. for otwórz nawias okrągły int x znak równości 0 średnik x otwórz nawias ostrokątny width średnik x plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 23. for otwórz nawias okrągły int y znak równości 0 średnik y otwórz nawias ostrokątny height średnik y plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 24. float R znak równości 255 minus red otwórz nawias okrągły pixels otwórz nawias kwadratowy x asterysk width plus y zamknij nawias kwadratowy zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Nowy kolor czerwony. Linia 25. float G znak równości 255 minus green otwórz nawias okrągły pixels otwórz nawias kwadratowy x asterysk width plus y zamknij nawias kwadratowy zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Nowy kolor zielony. Linia 26. float B znak równości 255 minus blue otwórz nawias okrągły pixels otwórz nawias kwadratowy x asterysk width plus y zamknij nawias kwadratowy zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Nowy kolor niebieski. Linia 27. pixels otwórz nawias kwadratowy x asterysk width plus y zamknij nawias kwadratowy znak równości color otwórz nawias okrągły R przecinek G przecinek B zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Piksel złożony z wyliczonych składowych. Linia 28. zamknij nawias klamrowy. Linia 29. zamknij nawias klamrowy. Linia 30. updatePixels otwórz nawias okrągły zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Wyświetlenie nowej tablicy pixels. Linia 31. zamknij nawias klamrowy.

Linijka 7

Będziemy pracować na pikselach wczytanych obrazów. Należy w tym celu utworzyć zmienna globalną, która będzie przechowywała wczytany obraz. Typ PImage to typ danej obrazu.

Linijka 11

Wczytujemy przykładowy obraz do zmiennej o nazwie img. Można użyć dowolnego obrazu (obsługiwane typy plików to .gif, .jpg, .tga, .png). Przy tak podanej ścieżce musi się on znajdować w folderze projektu (tam gdzie plik .pde).

Linijka 16

W ten sposób wskazany obrazek zostanie wyrysowany począwszy od punktu (0, 0). Oprócz położenia, jako kolejne dwa parametry można przekazać do metody image() rozmiar, do jakiego należy przeskalować obrazek, w naszym przypadku jest to szerokość i wysokość okna.

Linijka 20‑31

Metoda loadPixels() służy do załadowania pikseli obrazu (w tym przypadku obrazek z małą kaczką) do tablicy pixels, którą później wykorzystuje się do przeprowadzenia zmian. Jest to tablica jednowymiarowa, a więc można zastosować następującą pętlę:

Jednak częściej trzeba poruszać się po obrazie w dwóch wymiarach. Wymaga to indeksowania tablicy jednowymiarowej tak, jakby była dwuwymiarową.

Polecenie 8

Przeanalizuj i przetestuj poniższy kod.

Linia 1. int otwórz nawias kwadratowy zamknij nawias kwadratowy tablica1 znak równości otwórz nawias klamrowy 1 przecinek 2 przecinek 3 przecinek 4 przecinek 5 przecinek 6 przecinek 7 przecinek 8 przecinek 9 zamknij nawias klamrowy średnik. Linia 2. int otwórz nawias kwadratowy zamknij nawias kwadratowy otwórz nawias kwadratowy zamknij nawias kwadratowy tablica2 znak równości otwórz nawias klamrowy otwórz nawias klamrowy 1 przecinek 2 przecinek 3 zamknij nawias klamrowy przecinek. Linia 3. otwórz nawias klamrowy 4 przecinek 5 przecinek 6 zamknij nawias klamrowy przecinek. Linia 4. otwórz nawias klamrowy 7 przecinek 8 przecinek 9 zamknij nawias klamrowy zamknij nawias klamrowy średnik. Linia 6. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny 3 średnik i plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 7. for otwórz nawias okrągły int j znak równości 0 średnik j otwórz nawias ostrokątny 3 średnik j plus plus zamknij nawias okrągły otwórz nawias klamrowy. Linia 8. print otwórz nawias okrągły cudzysłów Tablica dwuwymiarowa dwukropek cudzysłów przecinek tablica2 otwórz nawias kwadratowy i zamknij nawias kwadratowy otwórz nawias kwadratowy j zamknij nawias kwadratowy przecinek cudzysłów lewy ukośnik n cudzysłów zamknij nawias okrągły średnik. Linia 9. print otwórz nawias okrągły cudzysłów Tablica jednowymiarowa dwukropek cudzysłów przecinek tablica1 otwórz nawias kwadratowy i asterysk 3 plus j zamknij nawias kwadratowy przecinek cudzysłów lewy ukośnik n cudzysłów zamknij nawias okrągły średnik. Linia 10. prawy ukośnik prawy ukośnik Mnożymy i asterysk 3 przecinek ponieważ tablica2 ma wymiary 3 na 3. Linia 11. print otwórz nawias okrągły cudzysłów lewy ukośnik n cudzysłów zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik lewy ukośnik n oznacza znak nowego wiersza. Linia 12. zamknij nawias klamrowy. Linia 13. zamknij nawias klamrowy.
RwKqhkoqHGiHx
Wynik przykładowego kodu - indeksowanie tablicy jednowymiarowej jak tablicy dwuwymiarowej
Źródło: GroMar Sp. z o.o., licencja: CC BY 3.0.

Globalne właściwości width oraz height odnoszą się do wymiarów obrazu (są identyczne z wartością ustawioną poprzez size()). Metody red, green oraz blue pozwalają pobrać odpowiednie składowe koloru, by je zmodyfikować. Po dokonaniu zmian (odwróceniu koloru), można zapisać kolor piksela przy wykorzystaniu metody color() z parametrami, odpowiednio – składową czerwoną, zieloną i niebieską koloru. Ostatnim krokiem jest zaktualizowanie pikseli wyświetlanych na ekranie – updatePixels(). By uniknąć nieprzyjemnych efektów zmiany piskeli na obrazie podczas jego wyświetlania, należy je zmodyfikować w osobnym buforze (tablica pixels), po czym zamienić te tablice.

Dodatkowe informacje na temat metody image() można znaleźć w dokumentacji
http://processing.org/reference/image_.html

Wczytywanie i zapis plików

Aby zapisać utworzony plik obrazu stosuje się instrukcję:

Linia 1. saveFrame otwórz nawias okrągły cudzysłów output kropka png cudzysłów zamknij nawias okrągły średnik.

Zapisanie więcej niż jednego obrazu (jednej klatki) lub serii klatek, można wykonać poprzez odpowiednią konstrukcję nazwy pliku wyjściowego:

Linia 1. saveFrame otwórz nawias okrągły cudzysłów output minus kratka kratka kratka kropka png cudzysłów zamknij nawias okrągły średnik.

Spowoduje to zapis każdej klatki do pliku z odpowiednią nazwą tj. output-001.png, output-002.png itd. Jednak przed uruchomieniem powyższego przykładu należy dodać w metodzie setup() jeszcze ustawienie ilości klatek na sekundę:

R156M6RI1OQzd

Załącznik zawiera plik tekstowy, jego treść brzmi: przykładowe linie pliku rozdzielone dwukropkami. W pliku słowa są rozdzielone dwukropkiem.

Przykładowy plik tekstowy - plik.txt
Źródło: GroMar Sp. z o.o., licencja: CC BY 3.0.
Plik TXT o rozmiarze 48.00 B w języku polskim

Umieść pobrany plik tekstowy w folderze projektu.

Polecenie 9

Przeanalizuj i przetestuj poniższy kod.

Linia 1. String otwórz nawias kwadratowy zamknij nawias kwadratowy linie średnik. Linia 3. void setup otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 4. prawy ukośnik prawy ukośnik Wczytanie zawartośc poprzez podanie ścieżki pliku. Linia 5. linie znak równości loadStrings otwórz nawias okrągły cudzysłów plik kropka txt cudzysłów zamknij nawias okrągły średnik. Linia 7. prawy ukośnik prawy ukośnik Wczytanie zawartości poprzez wybór pliku. Linia 8. prawy ukośnik prawy ukośnik Drugi parametr to nazwa funkcji przecinek która się wykona po wybraniu pliku. Linia 9. prawy ukośnik prawy ukośnik selectInput otwórz nawias okrągły cudzysłów Wybierz plik cudzysłów przecinek cudzysłów wybierz podkreślnik plik cudzysłów zamknij nawias okrągły średnik. Linia 10. zamknij nawias klamrowy. Linia 12. void draw otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 13. if otwórz nawias okrągły linie wykrzyknik znak równości null zamknij nawias okrągły otwórz nawias klamrowy. Linia 14. prawy ukośnik prawy ukośnik Wyświetlamy zawartość raz przecinek ale sprawdzamy czy plik został wybrany. Linia 15. noLoop otwórz nawias okrągły zamknij nawias okrągły średnik. Linia 16. String otwórz nawias kwadratowy zamknij nawias kwadratowy daneLinii znak równości splitTokens otwórz nawias okrągły linie otwórz nawias kwadratowy 0 zamknij nawias kwadratowy przecinek cudzysłów dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 17. print otwórz nawias okrągły cudzysłów Zawartość pliku w tablicy daneLinii otwórz nawias okrągły indeks dwukropek zawartość zamknij nawias okrągły dwukropek cudzysłów plus cudzysłów lewy ukośnik n cudzysłów zamknij nawias okrągły średnik. Linia 18. for otwórz nawias okrągły int i znak równości 0 średnik i otwórz nawias ostrokątny daneLinii kropka length średnik i znak równości i plus 1 zamknij nawias okrągły otwórz nawias klamrowy. Linia 19. print otwórz nawias okrągły i plus cudzysłów dwukropek cudzysłów plus daneLinii otwórz nawias kwadratowy i zamknij nawias kwadratowy plus cudzysłów lewy ukośnik n cudzysłów zamknij nawias okrągły średnik. Linia 20. zamknij nawias klamrowy. Linia 22. prawy ukośnik prawy ukośnik Zapis do pliku otwórz nawias okrągły domyślnie jeden element na jedną linijkę pliku zamknij nawias okrągły. Linia 23. saveStrings otwórz nawias okrągły cudzysłów nowy podkreślnik plik kropka txt cudzysłów przecinek daneLinii zamknij nawias okrągły średnik. Linia 24. zamknij nawias klamrowy. Linia 25. zamknij nawias klamrowy. Linia 27. void wybierz podkreślnik plik otwórz nawias okrągły File wybrany podkreślnik plik zamknij nawias okrągły otwórz nawias klamrowy. Linia 28. if otwórz nawias okrągły wybrany podkreślnik plik znak równości znak równości null zamknij nawias okrągły otwórz nawias klamrowy. Linia 29. print otwórz nawias okrągły cudzysłów Okno zostało zamknięte lub użytkownik anulował wybór kropka cudzysłów zamknij nawias okrągły średnik. Linia 30. super kropka exit otwórz nawias okrągły zamknij nawias okrągły średnik prawy ukośnik prawy ukośnik Zakończenie działania programu. Linia 31. zamknij nawias klamrowy else otwórz nawias klamrowy. Linia 32. print otwórz nawias okrągły cudzysłów Użytkownik wybrał dwukropek cudzysłów plus wybrany podkreślnik plik kropka getAbsolutePath otwórz nawias okrągły zamknij nawias okrągły plus cudzysłów lewy ukośnik n cudzysłów zamknij nawias okrągły średnik. Linia 33. linie znak równości loadStrings otwórz nawias okrągły wybrany podkreślnik plik kropka getName otwórz nawias okrągły zamknij nawias okrągły zamknij nawias okrągły średnik. Linia 34. zamknij nawias klamrowy. Linia 35. zamknij nawias klamrowy.

Linijka 4‑5

W metodzie setup() wczytujemy zawartość tekstową pliku do wcześniej przygotowanej zmiennej poprzez podanie ścieżki do pliku.

Linijka 7‑9

W metodzie setup() wczytujemy zawartość tekstową pliku do wcześniej przygotowanej zmiennej poprzez wybór pliku. Zostaje otworzone okno dialogowe do wyboru pliku, następnie należy sprawdzić, czy plik został wybrany, czy naciśnięto przycisk „anuluj” lub pojawił się inny błąd, co spowodowało, że zmienna jest pusta. Wtedy można wyświetlić stosowny komunikat lub zakończyć działanie programu. Jeśli nie ma błędu, można zacząć pracę z zawartością pliku. W powyższym kodzie tego sprawdzenia dokonuje funkcja wybierz_plik(File wybrany_plik). Wczytywać dane można z wielu innych formatów plików oraz źródeł – wystarczy zajrzeć do dokumentacji lub przejrzeć dodatkowe biblioteki. Często wykorzystywany jest format XML.

Linijka 27‑35

Zanim wybierzemy plik, należy zdefiniować funkcję, która będzie obsługiwać ewentualne błędy przy wczytywaniu oraz będzie decydować jak plik zostanie wykorzystany. W powyższym przykładzie, jeśli wystąpi błąd, kończone jest działanie programu. Ścieżkę w postaci tekstu otrzymujemy wywołując wybrany_plik.getAbsolutePath(), natomiast sam plik wczytujemy podobnie jak w pierwszym sposobie, tutaj dostajemy nazwę pliku wywołując wybrany_plik.getName().

Ważne!

Wybierany plik również musi znajdować się w folderze projektu.

Linijka 13‑15

Zanim wykona się kolejne akcje, należy sprawdzić czy zmienna linie nie jest pusta, jeśli jest oznacza to, że plik nie został jeszcze wczytany. Po przypisaniu wartości zmiennej linie nie ma potrzeby, aby funkcja draw() wykonywała się w nieskończoność. Zastosujemy tu omawianą wcześniej metodę noLoop().

Linijka 16

Kolejne linie pliku zostaną wczytane jako osobne elementy tablicy typu String. Załóżmy, że każda linia zawiera dane oddzielone od siebie pewnym charakterystycznym znakiem, np. „:”. By uzyskać dostęp do poszczególnych treści (czyli rozdzielić linię na fragmenty oddzielone dwukropkami) można się posłużyć metodą splitTokens() podając jako parametr ciąg znaków do podziału oraz znak (lub znaki, bo możemy podać ich kilka naraz) podziału.

Linijka 17‑20

Wyświetlona zostanie zawartość tablicy daneLinii, wraz z odpowiadającymi im indeksami.

Linijka 22‑23

Najpierw należy podać nazwę pliku, który zostanie utworzony (jeśli taki plik już istnieje, zostanie nadpisany), natomiast daneLinii to tablica (tablica String[]), w której każdy element to kolejna linia pliku, który zapisujemy.

Processing1
Processing

Processing a właściwie Processing.org to język programowania oraz środowisko programistyczne powstałe w 2001 roku. Jego celem było umożliwienie artystom i twórcom sztuki wizualnej szybkiego prototypowania oraz tworzenia prac w łatwy i sprawny sposób nawet bez wcześniejszej znajomości jakiegokolwiek języka programowania. Processing to tak naprawdę „opakowanie” języka Java, a zwłaszcza metod dotyczących wyświetlania, tworzenia i modyfikowania grafiki dwu- jak i trójwymiarowej. Z założenia ma minimalizować nakład pracy programistycznej, tak by twórca mógł skupić się na aspekcie wizualnym i funkcjonalnym swojej pracy, nie natomiast na elementach technicznych. Obecnie język ten jest dosyć dobrze rozwinięty i świetnie udokumentowany, dzięki czemu coraz więcej osób sięga po niego tworząc projekty komercyjne oraz artystyczne.

Podsumowanie

Doskonalenie umiejętności programowania wymaga więcej niż tylko przyswajanie wiedzy teoretycznej. Chociaż dokumentacje oraz poradniki są świetnym źródłem informacji i wiedzy, kluczem do osiągnięcia prawdziwej biegłości jest praktyka poprzez tworzenie własnych projektów. Pamiętaj, że proces tworzenia projektów może być czasami wyzwaniem. Mogą pojawić się problemy, które wymagają rozwiązania i błędy, które należy naprawić. Niezależnie od tych trudności, nie zniechęcaj się. Każdego dnia, spędzonego na praktyce, stajesz się lepszym programistą. Przykładowo możesz zacząć od stworzenia przewodnika multimedialnego, zawierającego obrazy, video oraz ścieżką dźwiękową. Więcej informacji znajdziesz w materiale realizującym wykonanie przewodnika po największych miastach w PolsceP24LI5oHPprzewodnika po największych miastach w Polsce.

W poniższym notesie zapisuj notatki lub ważne informacje dotyczące tego materiału.

R1KidIQD0xWj5
Notes
Notes
Źródło: GroMar Sp. z o.o., licencja: CC BY 3.0.
IDE - ang. Integrated Development Environment1
IDE - ang. Integrated Development Environment

Zintegrowane środowisko programistyczne (ang. Integrated Development Environment, IDE) jest to środowisko służące do tworzenia oprogramowania. Zintegrowane środowisko programistyczne udostępnia złożoną funkcjonalność obejmującą edycję i kompilowanie kodu źródłowego. Dodatkowo dzięki IDE można w prosty sposób tworzyć elementy programu takie jak okna, ikony czy obsługę zdarzeń systemowych.
Processing rozwijany jest jako projekt Open Source. IDE objęte jest licencją LGPL, dzięki czemu wytworzone oprogramowanie z użyciem tego IDE może być dystrybułowane bez ograniczeń licencyjnych.

licencja_GNU_GPL