Programowanie w JAVA Lab. 5 - Wątki. 1. Wykorzystując metodę Monte Carlo narysować wykres funkcji oraz obliczyć całkę: 7 x ) xy, 8,8

Podobne dokumenty
Programowanie w Javie 1 Wykład i Ćwiczenia 3 Programowanie obiektowe w Javie cd. Płock, 16 października 2013 r.

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub

Technologie i usługi internetowe cz. 2

Języki i metody programowania Java Lab2 podejście obiektowe

Java Podstawy. Michał Bereta

Projektowanie obiektowe. Roman Simiński Wzorce projektowe Wybrane wzorce strukturalne

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

Języki i metody programowania Java. Wykład 2 (część 2)

Podstawy Języka Java

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Język JAVA podstawy. wykład 2, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Kurs programowania. Wykład 6. Wojciech Macyna. 7 kwietnia 2016

Klasy i obiekty cz II

Spis treści. 1 Aplet. 2 Od aplikacji do apletu. 1 Aplet 1. 2 Od aplikacji do apletu 1. 3 Budowa apletu 3. 4 Cykl życia apletu 4

Aplikacje RMI

STWORZENIE PRZYKŁADOWEJ

Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Laboratorium z informatyki sem.iii/ćw. 4 Wydział Transportu PW /19

Dokumentacja do API Javy.

TEMAT : KLASY DZIEDZICZENIE

Programowanie obiektowe

PWŚG Ćwiczenia 13. Ukończoną pracę należy przesłać na adres lub

Interfejsy w Java. Przetwarzanie równoległe. Wątki.

Rysowanie punktów na powierzchni graficznej

Programowanie obiektowe

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

KLASY, INTERFEJSY, ITP

Programowanie obiektowe

Przypomnienie o klasach i obiektach

INSTRUKCJA DO ĆWICZENIA 13. Animacja wielowątkowa w aplikacjach JME. Gra logistyczna.

PROJEKTOWANIE ABSTRAKCYJNEJ KLASY FIGURA PRZECHOWUJĄCEJ WSPÓLNE CECHY OBIEKTÓW GRAFICZNYCH

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Wykład 4: Klasy i Metody

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Programowanie obiektowe

Podstawy i języki programowania

Zajęcia nr 15 JavaScript wprowadzenie do JavaScript

Aplikacje RMI Lab4

Klasy abstrakcyjne, interfejsy i polimorfizm

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Multimedia JAVA. Historia

Programowanie obiektowe

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

using System;... using System.Threading;

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Programowanie i projektowanie obiektowe

Aplikacje w środowisku Java

Programowanie obiektowe

JavaFX. Zaawansowane technologie Javy 2019

Współbieżność w środowisku Java

dziedziczenie - po nazwie klasy wystąpią słowa: extends nazwa_superklasy

Podstawy Programowania Obiektowego

Ćwiczenia 9 - Swing - część 1

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Swing Application Framework czyli tam i z powrotem. Copyright Piotr Kochański & Erudis,

Materiał pomocniczy do kursu Podstawy programowania Autor: Grzegorz Góralski ggoralski.com

KRYPTOGRAFIA I OCHRONA DANYCH PROJEKT

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Programowanie obiektowe i zdarzeniowe

Podstawy tworzenia aplikacji z wykorzystaniem języka Java ME ćwiczenia 1

Java EE produkcja oprogramowania

Dziedziczenie. dr Jarosław Skaruz

Programowanie zdarzeniowe

Programowanie obiektowe

Aplikacje w środowisku Java

Systemy wirtualnej rzeczywistości. Komponenty i serwisy

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

STWORZENIE MOBILNEJ APLIKACJI,

Podstawy tworzenia aplikacji z wykorzystaniem języka Java ME ćwiczenia 2

Java - wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

LIVE Gra w życie. LIVE w JavaScript krok po kroku. ANIMACJA Rozpoczynamy od podstawowego schematu stosowanego w animacji

Podstawy programowania obiektowego

Programowanie i projektowanie obiektowe

II Tworzenie klasy Prostokąt dziedziczącej z klasy wątku

- Narzędzie Windows Forms. - Przykładowe aplikacje. Wyższa Metody Szkoła programowania Techniczno Ekonomiczna 1 w Świdnicy

Wykład 8: Obsługa Wyjątków

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Podstawy programowania obiektowego

Systemy Rozproszone - Ćwiczenie 6

Lab 9 Podstawy Programowania

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

Wykład 7: Pakiety i Interfejsy

Informatyka II. Laboratorium.

Wywoływanie metod zdalnych

Język Java część 2 (przykładowa aplikacja)

Programowanie obiektowe

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1

Laboratorium 03: Podstawowe konstrukcje w języku Java [2h]

Zaawansowane aplikacje WWW - laboratorium

Języki i metody programowania Java Lab1 Zofia Kruczkiewicz

Enkapsulacja, dziedziczenie, polimorfizm

INSTRUKCJA DO ĆWICZENIA 5

SWING c.d. przydatne narzędzia: JFileChooser, JOptionPane. drag'n drop, menu kontekstowe.

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

1. Język JAVA. 1. Pierwszy program. 2. Kalkulator. 3. Klasy. 4. Dziedziczenie

Transkrypt:

Programowanie w JAVA Lab. 5 - Wątki 1. Wykorzystując metodę Monte Carlo narysować wykres funkcji oraz obliczyć całkę: 33 y 3 2 2 x x 3 y 7 x 3 33 7) 2 2 f x, y 1 x 3 1 x 2 1 y 7 x 3 3 33 2 112 y 3 7 x 0.5 x x 1 x 0.75 x 0.75 x 0.5 9 8 x y 3 x 0.75 y 1 x x 0.75 0.75 x x 0.5 0.5 6 10 x 1 6 10 2.25 y 1.5 0.5 x 4 x 1 2 y 0.5 x 0.5 x 7 x 1 14 Dla następujących założeń: xy, 8,8 f ( x, y) Wykres narysować na elemencie Canvas w sposób nieblokujący (w osobnym wątku). Zbiór punktów należących do funkcji zaznaczyć kolorem żółtym, pozostałe punkty kolorem ciemnoniebieskim. Dla ułatwienia udostępniam klasę Equation.java której metoda boolean calc(double x, double y) zwraca wartość PRAWDA/FAŁSZ w zależności od tego czy punkt <x,y> spełnia równanie f(x,y)czy nie. 2. Podstawowa funkcjonalność: a. Możliwość prowadzenia obliczeń w sposób asynchroniczny z możliwością ich zastopowania w dowolnym czasie (patrz przykład 3.2). Wizualizacja wykresu na elemencie Canvas poprzez zaznaczanie pojedynczych pikseli na określony kolor b. Prezentowanie postępu obliczeń na komponencie ProgressBar c. Formatka z możliwością określenia ilości punktów do symulacji i wyświetleniem wyniku całkowanie oraz przyciskami START, STOP

3. Wskazówki 3.1 Rysowanie w JavaFX może zostać zaimplementowane obiektowo (gdzie pojedyncze kształty to obiekty Java) lub rastrowo poprzez rysowanie na płótnie (Canvas). Na tych zajęciach skupimy się na drugim aspekcie. public class Controller { private Canvas canvas; GraphicsContext gc = canvas.getgraphicscontext2d(); drawshapes(gc); private void drawshapes(graphicscontext gc) { gc.setfill(color.blueviolet); gc.fillrect(gc.getcanvas().getlayoutx(), gc.getcanvas().getlayouty(), gc.getcanvas().getwidth(), gc.getcanvas().getheight()); Gdzie canvas zbindowany jest z kontrolką Canvas a handlerunbtnaction przypisany jest do metody onaction przycisku. Pamiętaj, że w punkt <0,0> na Canvasie zdefiniowany jest w lewym, górnym rogu co nie odpowiada typowemu układowi współrzędnych kartezjańskich gdzie punkt <0,0> zdefiniowany jest w lewym dolnym rogu - oznacza to, ze rysując wykres zdefiniowany w kartezjańskim układzie współrzędnych konieczna jest dodatkowa translacja punktu przed narysowaniem. Do rysowania pojedynczych pikseli lepiej jest rysować na obiekcie obraz (BufferedImage) a następnie wyświetlać go na płótnie. BufferedImage bi = new BufferedImage(600, 400, BufferedImage.TYPE_INT_RGB); bi.setrgb(x, y, Color.YELLOW.getRGB()); gc.drawimage(swingfxutils.tofximage(bi, null), 0,0 ); gdzie: x, y położenie punktu width, height wielkość obrazu Uwaga! Korzystanie z metody drawimage w pętli może być bardzo obciążające. Pamiętaj, że nie musisz odrysować obrazka na płótnie po każdym umieszczeniu piksela. Możesz to robić co jakiś czas if(i % 1000 == 0) gc.drawimage(swingfxutils.tofximage(bi, null), 0,0 );

3.2 Asynchroniczność w JavaFX. Wątek to pewna klasa której metoda call uruchamiana jest w tle nie blokując tym samym wykonywania wątku (zadań) aplikacji. Zalecanym podejściem do wielowątkowości w JavaFX to użycie klasy Task AsyncTask.java import javafx.concurrent.task; public class AsyncTask extends Task { @Override protected Object call() throws Exception { while(true){ System.out.println("."); if(iscancelled()) break; return null; Controller.java public class Controller { private DrawerTask task; task = new DrawerTask(); new Thread(task).start(); // inne polecenia wykonywane w głównym wątku private void handlestopbtnaction(){ task.cancel(); Aby przekazać do wątku dane należy użyć konstruktora. Zwróć uwagę, że Task zawraca obiekt typu Object oznacza to w praktyce że Task może zwracać dowolny typ obiektu (można go również sparametryzować jako szablon). Aby pobrać z wątku (Task) dane po jego zakończeniu należy dodać do niego zdarzenie OnSucceeded, np. Controller.java private Canvas canvas; private DrawerTask task; GraphicsContext gc = canvas.getgraphicscontext2d(); task = new DrawerTask(gc);

task.setonsucceeded(new EventHandler<WorkerStateEvent>() { @Override public void handle(workerstateevent event) { int var = (int) task.getvalue(); ); new Thread(task).start(); O szczegółach obsługi wątków można przeczytać w http://docs.oracle.com/javafx/2/threads/jfxpub-threads.htm 3.3 Obsługa ProgressBar w wątku Chcąc raportować postęp operacji w wątku (np. numer iteracji) do GUI, należy powiązać kontrolkę ProgressBar z wątkiem: private ProgressBar progressbar; progressbar.progressproperty().bind(task.progressproperty()); gdzie task jest zainicjowanym obiektem klasy dziedziczącej po Task, a następnie uaktualnić postęp w obrębie metody call() wątku poprzez uruchomienie: updateprogress(i, max); gdzie i aktualna wartość postępu, max maksymalna wartość jaką może przyjąć i 3.4 Losowa liczba rzeczywista z zakresu <MIN, MAX>: Random random = new Random(); double x = MIN + (MAX - MIN) * random.nextdouble(); Aby Random działał poprawnie należy korzystać z tego samego obiektu do generowania kolejnych liczb obiekt powinien być tworzony tylko raz! 3.5 Skalowanie wartości x z zakresu <A,B> do zakresu <C,D> x' = ((D-C) * (x-a) / (B-A) + C)

3.6 Monte Carlo Ideą metody Monte Carlo jest losowe próbkowanie przestrzeni w poszukiwaniu rozwiązania problemu. Metodę tę można utożsamiać ze strzałem na oślep i sprawdzeniem czy trafiło się w tarczę czy nie. W omawianym przypadku, jeśli wylosowana para liczb typu double X,Y spełnia wymóg f(x,y) 0 (tzn wartość funkcji w punkcie x,y jest mniejsza od zera) oznacza to, że punkt leży w zakresie zdefiniowanym przez funkcję f. Losując n (pewną dużą ilość) punktów istnieje pewna szansa (prawodpodobieństwo), że część tych punktów (oznaczmy ją przez k) trafi w obszar funkcji, zatem pole pod krzywą wynosi: P f k P n, gdzie P jest powierzchnią przestrzeni rozwiązania (czyli np. polem kwadratu 16x16 w którym poszukiwane było rozwiązanie). W omawianym przykładzie n na poziomie 10 mln powinno być wystarczającą liczbą punktów aby policzyć całkę (czyli pole pod wykresem funkcji). Więcej informacji o metodzie wraz z przykładami: https://pl.wikipedia.org/wiki/metoda_monte_carlo Możliwość zdobycia dodatkowych punktów (do 1 punktu ekstra w zależności od poprawności) Zwróć uwagę, że klasa odpowiedzialna za asynchroniczne obliczenia w tle (DrawerTask) jest ściśle powiązana z obiektem GraphicsContext płótna po którym następuje rysowanie. Tego typu ścisłą zależność można usunąć pozwalając klasie DrawerTask raportować dowolnemu słuchaczowi o znalezionych punktach. Taka architektura pozwoliłaby na zaimplementowanie rysowania po stronie kontrolera i ominąć bezpośrednie przekazywanie GraphicsContext czyniąc klasę DrawerTask niezależną od widoku. Jednym ze sposobów ominięcia problemu ścisłych zależności jest implementacja własnego zdarzenia (event). Zaimplementuj własne zdarzenie na znalezienie nowego punktu i obsłuż go w kontrolerze. Zmodyfikuj program tak, by klasa DrawerTask nie miała bezpośredniego dostępu do GraphicsContext obiektu Canvas zamiast tego powinno zostać uruchomione zdarzenie które będzie niosło informację o lokalizacji punktu oraz czy należy on do wykresu czy nie. https://www.codeproject.com/articles/677591/defining-custom-source-event-listener-in- Java 4. Wysyłanie zadania. Obowiązuje wcześniej ustalony schemat nazewnictwa plików! https://cloud.kisim.eu.org/index.php/s/b01tix2sfiva16u