W artykule tym przyjrzymy się podstawom generowania takiej grafiki za pomocą Canvas i javascriptowych metod. Narysujemy sobie kilka podstawowych kształtów i omówimy jak to wszystko mniej więcej działa.
Element Canvas
Pierwszym krokiem zawsze będzie utworzenie pustego obiektu typu Canvas, co zrobimy następująco:
- <canvas id="myCanvas" width="400" height="300"></canvas>
Przy okazji dodamy sobie do niego obramowanie:
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <title>Canvas</title>
- <style>
- #myCanvas {
- border: 1px solid #000;
- }
- </style>
- </script>
- </head>
- <body>
- <canvas id="myCanvas" width="400" height="300"></canvas>
- </body>
- </html>
Wygenerowało nam to pusty obiekt Canvas, który następnie obsłużyć musimy za pomocą JavaScriptu. Do naszego Canvasa odwołamy się w JS za pomocą identyfikatora #myCanvas.
- <script>
- // przypisujemy element Canvas do zmiennej canvas
- var canvas = document.getElementById('myCanvas');
- </script>
Kolejnym krokiem jest utworzenie specjalnego obiektu służącego do rysowania w przestrzeni 2D, robimy to następująco:
- <script>
- // przypisujemy element Canvas do zmiennej canvas
- var canvas = document.getElementById('myCanvas');
- // Tworzymy obiekt słuzący do generowania grafiki w 2D i przypisujemy go do context
- var context = canvas.getContext("2d");
- </script>
Warto nadmienić, iż za pomocą getContext() możemy także utworzyć obiekt służący do operacji w przestrzeni 3D (za pomocą WebGL).
My jednak pozostańmy przy 2D. W tym momencie mamy już gotowy do generowania grafiki element Canvas, pora coś narysować. Wszystkie operacje związane z rysowaniem wykonywać będziemy za pomocą metod obiektu context. Zacznijmy od czegoś prostego, np. od wygenerowania wypełnionego prostokąta.
Rysujemy wypełniony prostokąt - fillRect()
Do rysowania wypełnionego prostokąta służy metoda:
- fillRect(x, y, width, height);
gdzie:
- x - współrzędna X od której rysujemy
- y - współrzędna Y od której rysujemy
- width - szerokość prostokąta
- height - wysokość prostokąta
Warto pamiętać, iż współrzędne liczymy od początku elementu Canvas na stronie, a nie od początku samej strony.
Liczymy je oczywiscie od lewego, górnego rogu.
Narysujmy ten prostokąt:
- <script>
- // przypisujemy element Canvas do zmiennej canvas
- var canvas = document.getElementById('myCanvas');
- // Tworzymy obiekt słuzący do generowania grafiki w 2D i przypisujemy go do context
- var context = canvas.getContext("2d");
- // Rysujemy prostokąt
- context.fillRect(5, 5, 120, 100);
- </script>
Domyślnie wypełni się on kolorem czarnym:
My jednak nie chcemy, aby był czarny i kolor chcemy sobie zdefiniować sami, np. czerwony.
Kolor definiujemy we własności fillStyle:
- fillStyle = wartość_koloru;
gdzie wartość koloru możemy podać tak jak w stylu CSS, możemy też podać tutaj gradient, lub deseń.
Na początek podajmy zwykły kolor, niech to będzie czerwony, czyli:
- fillStyle = '#ff0000';
Pamiętajmy, że wartość koloru wypełnienia definiujemy przez wygenerowaniem obiektu, nasz kod wyglądać więc będzie tak:
- <script>
- // przypisujemy element Canvas do zmiennej canvas
- var canvas = document.getElementById('myCanvas');
- // Tworzymy obiekt słuzący do generowania grafiki w 2D i przypisujemy go do context
- var context = canvas.getContext("2d");
- // definiujemy kolor wypełnienia (czerwony)
- context.fillStyle = '#ff0000';
- // Rysujemy prostokąt
- context.fillRect(5, 5, 120, 100);
- </script>
Co w efekcie da nam piękny czerwony prostokąt:
Jak teraz dodać obramowanie do naszego prostokąta?
W standardowy sposób się nie da. Aby stworzyć obrys, czyli obramowanie użyć musimy metody:
- stroke();
Kolor obrysu definiujemy we własności:
- strokeStyle = wartość_koloru;
Jego grubość w pikselach natomiast za pomocą:
- lineWidth = wartość w px;
Metoda stroke() rysuje obrys na zdefiniowanej wcześniej ścieżce.
W naszym przypadku ścieżką tą będzie nasz prostokąt, ale tym razem nie wypełniony, gdyż metoda:
- fillRect()
zamyka ścieżkę wypełniając prostokąt, więc nie możemy jej użyć do narysowania obrysu.
Zamiast tego skorzystamy ze zwykłej metody:
- rect();
która generuje jedynie ścieżkę prostokąta, ale nie wypełnia go kolorem.
Zrobimy to więc następująco:
- <script>
- // przypisujemy element Canvas do zmiennej canvas
- var canvas = document.getElementById('myCanvas');
- // Tworzymy obiekt słuzący do generowania grafiki w 2D i przypisujemy go do context
- var context = canvas.getContext("2d");
- // definiujemy kolor wypełnienia (czerwony)
- context.fillStyle = '#ff0000';
- // definiujemy grubość obramowania (6px)
- context.lineWidth = '6';
- // definiujemy kolor obramowania (czarny)
- context.strokeStyle = '#000000';
- // Tworzymy ścieżkę w postaci prostokąta
- context.rect(5, 5, 120, 100);
- // Rysujemy obrys ścieżki:
- context.stroke();
- </script>
Jak widzimy, działa:
Mamy obrys, ale zniknęło nam wypełnienie.
Aby teraz wypełnić stworzoną ścieżkę kolorem używamy metody:
- fill();
Wypełnia ona ścieżkę kolorem zdefiniowanym wsześniej we własności fillStyle.
Dodajmy więc do naszego kodu wypełnienie:
- <script>
- // przypisujemy element Canvas do zmiennej canvas
- var canvas = document.getElementById('myCanvas');
- // Tworzymy obiekt słuzący do generowania grafiki w 2D i przypisujemy go do context
- var context = canvas.getContext("2d");
- // definiujemy kolor wypełnienia (czerwony)
- context.fillStyle = '#ff0000';
- // definiujemy grubość obramowania (6px)
- context.lineWidth = '16';
- // definiujemy kolor obramowania (czarny)
- context.strokeStyle = '#000000';
- // Tworzymy ścieżkę w postaci prostokąta
- context.rect(5, 5, 120, 100);
- // Wypełniamy ścieżkę kolorem:
- context.fill();
- // Rysujemy obrys ścieżki:
- context.stroke();
- </script>
Wynik:
Zrobiliśmy tak dlatego, gdyż w odwrotnej kolejności wypełnienie przykryłoby nam obrys - obiekty są generowane warstwowo w kolejności takiej w jakiej występują w kodzie.
Wskaźnik i rysowanie linii - moveTo()
Javascript podczas generowania grafiki w elemencie Canvas korzysta z czegoś w rodzaju wirtualnego wskaźnika, który jest ustawiany na danej pozycji. Można to porównać do ołówka i rysowania na kartce. Gdy coś rysujemy, ołówek jest takim wskaźnikiem i rysując coś na kartce przesuwamy po niej ołówek tworząc tym samym rysunek. W Javascript działa to tak samo, tyle tylko, że nie widzimy tego "ołówka", ale możemy określić za to dokładnie jego współrzędne. Na takiej zasadzie między innymi rysujemy linię. Procedura jest następująca: określamy punkt startowy naszego "ołówka", czyli współrzędną w elemencie Canvas oraz punkt końcowy. Javascript następnie przeciągnie nasz "ołówek" od punktu początkowego do punktu końcowego, tworząc tym samym linię.Punkt początkowy ustawiamy za pomocą metody:
- moveTo(x, y);
gdzie x i y to współrzędne w jakich ustawiamy wskaźnik.
Punkt końcowy do którego ma się po linii prostej przesunąć wskaźnik określamy za pomocą:
- lineTo(x, y);
gdzie x i y to współrzędne do jakich przesuwamy wskaźnik.
Po stworzeniu takiej ścieżki całość oczywiście potraktujemy metodą, która stworzy nam tam obrys, czyli stroke(). Inaczej nie zobaczylibyśmy efektu takiego działania.
Narysujmy więc sobie linię prowadzącą od początku obiektu Canvas (0,0) do jego końca (400, 300).
Nasz kod wyglądać będzie tak:
- <script>
- // przypisujemy element Canvas do zmiennej canvas
- var canvas = document.getElementById('myCanvas');
- // Tworzymy obiekt słuzący do generowania grafiki w 2D i przypisujemy go do context
- var context = canvas.getContext("2d");
- // definiujemy grubość obramowania (6px)
- context.lineWidth = '16';
- // definiujemy kolor obramowania (czarny)
- context.strokeStyle = '#000000';
- // ustawiamy punkt początkowy
- context.moveTo(0, 0);
- // ustawiamy punkt końcowy
- context.lineTo(400, 300);
- // rysujemy obrys
- context.stroke();
- </script>
A efekt jego działania tak:
Rysowanie okręgu - arc()
Aby narysować okrąg musimy użyć metody:
- arc(x, y, r, angle_start, angle_stop);
gdzie:
- x i y - współrzędne środka okręgu
- r - promień okręgu
- angle_start - kąt początkowy w radianach
- angle_stop - kąt końcowy w radianach
Zauważmy, że kąty podajemy w radianach, a nie w stopniach, czyli w formie PI * liczba.
Przedstawia to poniższy obrazek:
źródło: w3schools
gdzie:
- środek - arc(100, 75, 50, 0*Math.PI, 1.5*Math.PI)
- kąt początkowy - arc(100, 75, 50, 0, 1.5*Math.PI)
- kąt końcowy - arc(100, 75, 50, 0*Math.PI, 1.5*Math.PI)
Narysujmy sobie okrąg w całości, gdzie kątem początkowym będzie 0, a kątem końcowym 2PI.
- <script>
- // przypisujemy element Canvas do zmiennej canvas
- var canvas = document.getElementById('myCanvas');
- // Tworzymy obiekt słuzący do generowania grafiki w 2D i przypisujemy go do context
- var context = canvas.getContext("2d");
- // definiujemy grubość obramowania (6px)
- context.lineWidth = '6';
- // definiujemy kolor obramowania (czarny)
- context.strokeStyle = '#000000';
- // rysujemy ścieżkę okręgu
- context.beginPath();
- context.arc(200, 150, 50, 0, 2*Math.PI);
- // rysujemy obrys
- context.stroke();
- </script>
Wynik takiego działania:
Zauważmy, że wykorzystaliśmy tutaj metodę o nazwie:
- beginPath();
Metoda ta rozpoczyna rysowanie nowej ścieżki i zamyka poprzednią o ile wcześniej była taka stworzona.
Ścieżkę możemy też zamknąć za pomocą:
- closePath();
I to tyle tytułem wprowadzenia do elementu Canvas.
W następnych artykułach zobaczymy jak tworzyć tekst, operować na obrazkach, dokonywać transformacji i wiele innych ciekawych rzeczy.
Brak komentarzy:
Prześlij komentarz
Masz sugestię? Znalazłeś błąd? Napisz komentarz! :)