HTML5: основы клиентской разработки

Рисование фигур

Разбить на страницы
Показывать лекцию целиком
В рамках текущей и последующих практик мы будем работать в рамках, созданных на прошлом занятии html, css и js файлов.

Целью данного практического занятия является формирование базовых навыков рисования простых фигур на холсте.

Задание. Нарисовать следующие фигуры:

  • Рисование путей (рис 25.1) Задания к выполнению часть 1
  • Дуги (рис 25.2) Задания к выполнению часть 2
  • Кривые Безье (рис 25.3) Задания к выполнению часть 2
  • Комплексное задание (рис 25.4) Задание к выполнению часть 4
  • Ход работы

    В рамках практики мы опишем ход выполнения только одного задания в частях 1 – 3. Остальные задания необходимо выполнить самостоятельно.

    С теорией рисования фигур можно ознакомиться в лекции №18 настоящего курса.

    Рисование путей

    Рассмотрим задание а).

    Обозначим стороны треугольников следующим образом:

    (рис 25.5) Требуемое изображение

    Каждый треугольник может быть нарисован последовательным вызовом трех методов lineTo.

    Шаг 1

    Создадим путь для отрисовки первого треугольника:

    function draw(){
      var canvas = document.getElementById('lesson6');
      var ctx = canvas.getContext('2d');
      ctx.beginPath();
      ctx.moveTo(20,20); // задаем начальную точку для "пера"
      ctx.lineTo(20, 120); // сторона А
      ctx.lineTo(120,120); // сторона B
      ctx.lineTo(20,20); // сторона С
      ctx.stroke(); // рисуем незаполненную фигуру
    

    Отрисовка первого треугольника закончена:

    (рис 25.6) Результат на шаге 1

    Шаг 2

    Создание залитого треугольника отличается от предыдущего шага незначительно, а именно, вызовом метода fill, вместо stroke. Добавим соответствующий код в функцию draw:

    function draw(){
      var canvas = document.getElementById('lesson6');
      var ctx = canvas.getContext('2d');
      ctx.beginPath();
      ctx.moveTo(20,20); // задаем начальную точку для "пера"
      ctx.lineTo(20, 120); // сторона А
      ctx.lineTo(120,120); // сторона B
      ctx.lineTo(20,20); // сторона С
      ctx.stroke(); // рисуем незаполненную фигуру
      
      ctx.beginPath();
      ctx.moveTo(40,20); // задаем начальную точку для отрисовки второго треугольника
      ctx.lineTo(140, 20); // сторона D
      ctx.lineTo(140,120); // сторона E
      ctx.lineTo(40,20); // сторона F
      ctx.fill(); // рисуем залитую цветом фигуру
    

    На этом выполнение текущего задания можно считать законченным:

    (рис 25.7) Результат выполнения задания а) части 1

    Рисование дуг

    Эксперименты с размещением дуг с различными заполнениями и углами, мы оставим на самостоятельное рассмотрение. Упомянем только, что необязательно вручную задавать координаты для дуг, разумнее будет использовать циклы.

    Рассмотрим подробнее задание б). Можно выделить всего четыре дуги, которые необходимо нарисовать:

    (рис 25.8) Требуемое изображение

    Основная сложность этого задания в переносе "пера" в начальные позиции для рисования, поэтому обратите внимание на координаты, указанные в методах moveTo и arc:

    function draw(){
      var canvas = document.getElementById('lesson6');
      var ctx = canvas.getContext('2d');
      ctx.beginPath();
      ctx.moveTo(65,65); // начальная позиция для рисование
      ctx.arc(60,65,5,0,Math.PI*2,true); // дуга А
      ctx.moveTo(95,65); // перенос "пера" в позицию для отрисовки дуги B
      ctx.arc(90,65,5,0,Math.PI*2,true); // дуга B
      ctx.moveTo(110,75); // перенос "пера" для отрисовки дуги C
      ctx.arc(75,75,35,0,Math.PI,false); // дуга C
      ctx.moveTo(125,75); // перенос "пера" для отрисовки дуги D
      ctx.arc(75,75,50,0,Math.PI*2,true); // дуга D
      ctx.stroke(); // отрисовка незаполненной фигуры
    

    Результат вызова метода draw:

    (рис 25.9) Результат выполнения задания б) части 2

    Кривые Безьe

    Оставим задание б) на самостоятельное выполнение. Отметим только, что для отрисовки каждой "половинки сердца" используется три кривые (метод bezierCurveTo).

    Рассмотрим задание а). Всего нам понадобится шесть кривых для выполнения задания:

    (рис 25.10) Требуемое изображение

    Если рисовать кривые последовательно от A к F, то понадобится только один вызов функции moveTo для задания начальных координат для первой кривой (A). Как и в предыдущем примере нужно уделить внимание задаваемым координатам для кривых:

    function draw(){
      var canvas = document.getElementById('lesson6');
      var ctx = canvas.getContext('2d');
      ctx.beginPath();
      ctx.moveTo(75,25); // задание начальных координат
      ctx.quadraticCurveTo(25,25,25,62.5); // кривая А
      ctx.quadraticCurveTo(25,100,50,100); // кривая B
      ctx.quadraticCurveTo(50,120,30,125); // кривая C
      ctx.quadraticCurveTo(60,120,65,100); // кривая D
      ctx.quadraticCurveTo(125,100,125,62.5); // кривая E
      ctx.quadraticCurveTo(125,25,75,25); // кривая F
      ctx.stroke(); // отрисовка незаполненной фигуры
    

    В результате получим следующее изображение:

    (рис 25.11) Результат выполнения задания а) части 3

    Нами рассмотрены все необходимые функции, оставшиеся задания необходимо выполнить самотоятельно.

    Страницы:
    В рамках текущей и последующих практик мы будем работать в рамках, созданных на прошлом занятии html, css и js файлов.

    Целью данного практического занятия является формирование базовых навыков рисования простых фигур на холсте.

    Задание. Нарисовать следующие фигуры:

  • Рисование путей (рис 25.1) Задания к выполнению часть 1
  • Дуги (рис 25.2) Задания к выполнению часть 2
  • Кривые Безье (рис 25.3) Задания к выполнению часть 2
  • Комплексное задание (рис 25.4) Задание к выполнению часть 4
  • Ход работы

    В рамках практики мы опишем ход выполнения только одного задания в частях 1 – 3. Остальные задания необходимо выполнить самостоятельно.

    С теорией рисования фигур можно ознакомиться в лекции №18 настоящего курса.

    Рисование путей

    Рассмотрим задание а).

    Обозначим стороны треугольников следующим образом:

    (рис 25.5) Требуемое изображение

    Каждый треугольник может быть нарисован последовательным вызовом трех методов lineTo.

    Шаг 1

    Создадим путь для отрисовки первого треугольника:

    function draw(){
      var canvas = document.getElementById('lesson6');
      var ctx = canvas.getContext('2d');
      ctx.beginPath();
      ctx.moveTo(20,20); // задаем начальную точку для "пера"
      ctx.lineTo(20, 120); // сторона А
      ctx.lineTo(120,120); // сторона B
      ctx.lineTo(20,20); // сторона С
      ctx.stroke(); // рисуем незаполненную фигуру
    

    Отрисовка первого треугольника закончена:

    (рис 25.6) Результат на шаге 1

    Шаг 2

    Создание залитого треугольника отличается от предыдущего шага незначительно, а именно, вызовом метода fill, вместо stroke. Добавим соответствующий код в функцию draw:

    function draw(){
      var canvas = document.getElementById('lesson6');
      var ctx = canvas.getContext('2d');
      ctx.beginPath();
      ctx.moveTo(20,20); // задаем начальную точку для "пера"
      ctx.lineTo(20, 120); // сторона А
      ctx.lineTo(120,120); // сторона B
      ctx.lineTo(20,20); // сторона С
      ctx.stroke(); // рисуем незаполненную фигуру
      
      ctx.beginPath();
      ctx.moveTo(40,20); // задаем начальную точку для отрисовки второго треугольника
      ctx.lineTo(140, 20); // сторона D
      ctx.lineTo(140,120); // сторона E
      ctx.lineTo(40,20); // сторона F
      ctx.fill(); // рисуем залитую цветом фигуру
    

    На этом выполнение текущего задания можно считать законченным:

    (рис 25.7) Результат выполнения задания а) части 1

    Рисование дуг

    Эксперименты с размещением дуг с различными заполнениями и углами, мы оставим на самостоятельное рассмотрение. Упомянем только, что необязательно вручную задавать координаты для дуг, разумнее будет использовать циклы.

    Рассмотрим подробнее задание б). Можно выделить всего четыре дуги, которые необходимо нарисовать:

    (рис 25.8) Требуемое изображение

    Основная сложность этого задания в переносе "пера" в начальные позиции для рисования, поэтому обратите внимание на координаты, указанные в методах moveTo и arc:

    function draw(){
      var canvas = document.getElementById('lesson6');
      var ctx = canvas.getContext('2d');
      ctx.beginPath();
      ctx.moveTo(65,65); // начальная позиция для рисование
      ctx.arc(60,65,5,0,Math.PI*2,true); // дуга А
      ctx.moveTo(95,65); // перенос "пера" в позицию для отрисовки дуги B
      ctx.arc(90,65,5,0,Math.PI*2,true); // дуга B
      ctx.moveTo(110,75); // перенос "пера" для отрисовки дуги C
      ctx.arc(75,75,35,0,Math.PI,false); // дуга C
      ctx.moveTo(125,75); // перенос "пера" для отрисовки дуги D
      ctx.arc(75,75,50,0,Math.PI*2,true); // дуга D
      ctx.stroke(); // отрисовка незаполненной фигуры
    

    Результат вызова метода draw:

    (рис 25.9) Результат выполнения задания б) части 2

    Кривые Безьe

    Оставим задание б) на самостоятельное выполнение. Отметим только, что для отрисовки каждой "половинки сердца" используется три кривые (метод bezierCurveTo).

    Рассмотрим задание а). Всего нам понадобится шесть кривых для выполнения задания:

    (рис 25.10) Требуемое изображение

    Если рисовать кривые последовательно от A к F, то понадобится только один вызов функции moveTo для задания начальных координат для первой кривой (A). Как и в предыдущем примере нужно уделить внимание задаваемым координатам для кривых:

    function draw(){
      var canvas = document.getElementById('lesson6');
      var ctx = canvas.getContext('2d');
      ctx.beginPath();
      ctx.moveTo(75,25); // задание начальных координат
      ctx.quadraticCurveTo(25,25,25,62.5); // кривая А
      ctx.quadraticCurveTo(25,100,50,100); // кривая B
      ctx.quadraticCurveTo(50,120,30,125); // кривая C
      ctx.quadraticCurveTo(60,120,65,100); // кривая D
      ctx.quadraticCurveTo(125,100,125,62.5); // кривая E
      ctx.quadraticCurveTo(125,25,75,25); // кривая F
      ctx.stroke(); // отрисовка незаполненной фигуры
    

    В результате получим следующее изображение:

    (рис 25.11) Результат выполнения задания а) части 3

    Нами рассмотрены все необходимые функции, оставшиеся задания необходимо выполнить самотоятельно.

    Вернуться к учебному плану