JavaScript. Подробное руководство, 6-е издание, стр. 357
<b>с.beginPath(); // Новый контур</b><b>c.moveTo(100, 100); // Новый фрагмент контура с начальной точкой (100,100) </b><b>c.lineTo(200, 200); // Добавить линию, соединяющую точки (100,100) и (200,200) </b><b>c.lineTo(100, 200); // Добавить линию, соединяющую точки (200,200) и (100,200)</b>Фрагмент выше просто определяет контур - он ничего не рисует. Чтобы фактически нарисовать две линии, следует вызвать метод
stroked<b>fill()</b><b>с.fill(); // Залить область треугольника</b><b>с.stroked; // Нарисовать две стороны треугольника</b>Фрагмент выше (плюс некоторый дополнительный программный код, устанавливающий толщину линий и цвет заливки) воспроизводит рисунок, изображенный на рис. 21.5.

Рис. 21.5. Простой путь, нарисованный и залитый
Обратите внимание, что фрагмент контура, определяемый выше, является «открытым». Он содержит всего две прямые линии, и его конечная точка не совпадает с начальной точкой. То есть он образует незамкнутую область. Метод
<b>fill()</b>Если бы потребовалось нарисовать все три стороны треугольника выше, можно было бы вызвать метод
<b>closePath(),</b><b>lineTo(100,100),</b><b>closePath()</b>Следует сделать еще два важных замечания, касающиеся методов
<b>stroke()</b><b>fill().</b><b>с.moveTo(300,100); // Новый фрагмент контура с начальной точкой (300,100); </b><b>с.lineТо(300,200); // Нарисовать вертикальную линию вниз до точки (300,200);</b>Если затем вызвать метод
<b>stroke(),</b>Во-вторых, обратите внимание, что методы
<b>stroke()</b><b>fill()</b><b>fill(),</b><b>stroke().</b><b>beginPath().</b>Пример 21.4 содержит определение функции рисования правильных многоугольников и демонстрирует использование методов
<b>moveTo(), lineTo()</b><b>closePath()</b><b>fill()</b><b>stroke()</b>
Пример 21.4. Рисование правильных многоугольников с помощью методов <b>moveTo(), lineTo()</b>closePath()
<b>// Определяет правильный многоугольник с п сторонами, вписанный в окружность с центром</b><b>// в точке (х,у) и радиусом r. Вершины многоугольника находятся на окружности,</b><b>// на равном удалении друг от друга. Первая вершина помещается в верхнюю точку</b><b>// окружности или со смещением на указанный угол angle. Поворот выполняется</b><b>// по часовой стрелке, если в последнем аргументе не передать значение true,</b><b>function polygon(c, n, x, y, r, angle, counterclockwise) {</b><b> angle = angle || 0;</b><b> counterclockwise = counterclockwise || false;</b><b> c.moveTo(x + r*Math.sin(angle), // Новый фрагмент контура</b><b> у - r*Math.cos(angle)); // Исп. тригонометрию для выч. координат</b><b> var delta = 2*Math.PI/n; // Угловое расстояние между вершинами</b><b> for(var і = 1; і < n; i++) { // Для каждой из оставшихся вершин</b><b> angle += counterclockwise?-delta:delta; // Скорректировать угол</b><b> c.lineTo(x + r*Math.sin(angle), // Линия к след, вершине</b><b> у - r*Math.cos(angle));</b><b> }</b><b> с.closePath(); // Соединить первую вершину с последней</b><b>} </b><b>// Создать новый контур и добавить фрагменты контура, соответствующие многоугольникам-</b><b>с.beginPath();</b><b>polygon(c, 3, 50, 70, 50); // Треугольник</b><b>polygon(c, 4, 150, 60, 50, Math.PI/4); // Квадрат</b>