Kurs HTML5 – Canvas – Kształty  Udostępnij na: Facebook

Autor: Norbert Blandzi

Opublikowano: 2011-11-16

W poprzednim samouczku dowiedziałeś się, jak rozpocząć pracę z elementem <canvas> oraz jak narysować prostokąt. Ten samouczek natomiast poświęcony będzie rysowaniu kształtów.

Przed wykonaniem zadań powinieneś przeczytać samouczek:

Po wykonaniu zadań nauczysz się:

  • rysować ścieżki i linie,
  • rysować łuki,
  • rysować krzywe.

Implementacja

Efekt końcowy został przedstawiony na Rys. 1.

Rys. 1. Efekt końcowy.

Twoim zadaniem jest:

  • utworzenie czworokąta z wykorzystaniem ścieżek,
  • utworzenie łuku,
  • utworzenie krzywej kwadratowej.

Przygotowanie strony

Przygotuj podstawowy szkielet strony internetowej. Jeśli będziesz miał problem z tym zadaniem, zapoznaj się z pierwszym samouczkiem HTML i CSS: Pierwsza strona internetowa.

  1. W edytorze HTML utwórz nowy plik pod nazwą index.html i wklej do niego szkielet strony:
<!DOCTYPE html>
<html lang="pl">
    <head>
        <meta charset="utf-8">
        <title>Canvas</title>
            <script type="text/javascript">
              function draw(){
                var canvas = document.getElementById('image1');
                var context = canvas.getContext('2d');
              }
            </script>
    </head>
    <body onload="draw();">
        <canvas id="image1" width="300" height="300">
            Twoja przeglądarka nie wspiera elementu canvas!
            Pobierz Internet Explorer 9 lub nowszą wersję! 
        </canvas>
    </body>
</html>

Utworzenie czworokąta

Podczas tworzenia ścieżek i linii w Canvas, wykorzystaj następujące metody:

  • beginPath() – rozpoczyna tworzenie ścieżki,
  • closePath() – kończy tworzenie ścieżki,
  • moveTo(x,y) – ustawia punkt, od którego rozpoczniesz rysować (x,y) (domyślnie jest on ustawiony w miejscu zakończenia poprzedniego rysunku),
  • lineTo(x,y) – rysuje linie do punktu (x,y) z miejsca oznaczonego metodą moveTo() lub punktu, w którym zakończone zostało poprzednie rysowanie,
  • fill() – wypełnia ścieżkę kolorem podanym w parametrze fillStyle(). Warto zwrócić uwagę, że metoda ta sama domyka ścieżki, dlatego nie wymaga użycia metody closePath(),
  • fillStyle='kolor' – zmienia kolor wypełnienia metody, gdzie kolor może być nazwą angielską, formatem szesnastkowym lub RGB,
  • stroke() – rysuje kontur ścieżki,
  • strokeStyle='kolor' – zmienia kolor konturu ścieżki, gdzie kolor może być nazwą angielską, formatem szesnastkowym lub rgb.
  1. Ustaw kursor za wierszem, zawierającym metodę getContext() i dodaj nową linię.
  2. Wpisz:
context.beginPath();
context.moveTo(50,50);
context.lineTo(100,0);
context.lineTo(150,50);
context.lineTo(100,100);
context.lineTo(50,50);
context.fillStyle = 'green';
context.fill();
  1. Zapisz plik index.html. Otwórz go w przeglądarce i sprawdź, czy wygląda tak, jak na Rys. 2.

Rys. 2. Czworokąt w Canvas.

Rysowanie łuku

Rysowanie łuku jest równie proste jak rysowanie ścieżek, z tą różnicą, że przy rysowaniu łuków wykorzystujesz metody:

  • arc(x, y, r, kątP, kątK, kierunek) – x, y to współrzędne środka okręgu, na którym rysowany jest łuk; r to promień okręgu, kątP, kątK określają odpowiednio kąt początkowy i końcowy łuku (wartość w radianach); kierunek to wartość boolowska, określająca kierunek rysowania (false – zgodny z ruchem wskazówek zegara, true – przeciwnie).

Najlepiej widać to na Rys. 3.

Rys. 3. Właściwości łuku w canvas.

Zamiana stopni na radiany jest możliwa na pomocą następującego równania:

 

miara_w_radianach = miara_w_stopniach * (Math.PI / 180)

Math.PI to wartość liczby PI, która określona jest w bibliotece Math języka JavaScript:

  • lineWidth = size – grubość lini w pixelach.
  1. Utwórz nową linię w funkcji draw().
  2. Poniżej poprzednio dodanych poleceń wpisz:
context.beginPath();
context.arc(200,50,30,Math.PI,0,false);
context.closePath();
context.lineWidth = 10;
context.strokeStyle = "black";
context.stroke();
  1. Zapisz plik index.html. Otwórz go w przeglądarce i sprawdź czy wygląda tak, jak na Rys. 4.

Rys. 4. Łuk w Canvas.

Rysowanie krzywej kwadratowej

Rysowanie krzywej kwadratowej dostępne jest dzięki wykorzystaniu metody:

  • quadraticCurveTo(PktX, PktY, x, y) – PktX, PktY są współrzędnymi punktu, wg którego krzywa jest wyginana, a x,y są współrzędnymi punktu końcowego.

Najlepiej widać to na Rys. 5., gdzie:

  • fioletowe kółko to punkt o współrzędnych (PktX, PktY),
  • czerwone kółko to punkt o współrzędnych (x, y),
  • zielone kółko to punkt o współrzędnych ustawianych w metodzie moveTo().

Rys. 5. Krzywa kwadratowa.

  1. Utwórz nową linię w funkcji draw().
  2. Poniżej dodanych poprzednio poleceń wpisz:
context.beginPath();
context.moveTo(50,250);
context.quadraticCurveTo(100,200,180,280);
context.closePath();
context.strokeStyle = "red";
context.stroke();
  1. Zapisz plik index.html. Otwórz go w przeglądarce i sprawdź, czy wygląda tak, jak na Rys. 1.

Podsumowanie

W tym samouczku nauczyłeś się, jak narysować ścieżki i linie oraz łuki i krzywą kwadratową na elemencie <canvas>.

W kolejnym samouczku nauczysz się wykorzystywać obrazki w elemencie canvas.

Zadanie

Aby sprawdzić swoje umiejętności, spróbuj narysować prosty obrazek na elemencie canvas, taki jak na Rys. 6.

Rys. 6. Zadanie – krzywe w elemencie canvas.

Aby zobaczyć podpowiedzi i rozwiązanie zadania przełącz na widok klasyczny.

  • Wielkość Canvas: 300x300 pikseli.
  • Grubość linii – 10.
  • Buzia to okrąg (2*PI) o środku w punkcie 150, 150 i promieniu 145.
  • Usta to półokrąg (PI) o środku w punkcie 150, 150 i promieniu 100.
  • Prawe oko to okrąg (2*PI) o środku w punkcie 100, 85 i promieniu 20.
  • Lewe oko to okrąg (2*PI) o środku w punkcie 200, 85 i promieniu 20.
  • Nos to zakończony półokrąg (PI) o środku w punkcie 150, 150 i promieniu 30.
<!DOCTYPE html>
<html lang="pl">
<head>
    <meta charset="utf-8">
    <title>Canvas</title>
    <script type="text/javascript">
        function draw() {
            var canvas = document.getElementById('image');
            var context = canvas.getContext('2d');
            context.beginPath();
            context.lineWidth = 10;
            context.arc(150, 150, 145, 0, Math.PI * 2, true);
            context.moveTo(250, 150);
            context.arc(150, 150, 100, 0, Math.PI, false);
            context.moveTo(120, 85);
            context.arc(100, 85, 20, 0, Math.PI * 2, true);
            context.moveTo(220, 85);
            context.arc(200, 85, 20, 0, Math.PI * 2, true);
            context.moveTo(150, 150);
            context.arc(150, 150, 30, Math.PI, 0, true); 
            context.closePath();
            context.stroke(); }
    </script>
</head>
<body onload="draw();">
    <canvas id="image" width="300" height="300">
    </canvas>
</body>
</html>