JavaScript. Подробное руководство, 6-е издание, стр. 362
<b>snowflake(c,1,145,115,125); // Снежинка первого уровня - шестиконечная звезда</b><b>snowflake(c,2,285,115,125); // и так далее.</b><b>snowflake(c,3,425.115.125);</b><b>snowflake(c,4,565,115,125); // Снежинка четвертого уровня выглядит как снежинка!</b><b>c.stroke(); // Нарисовать этот очень сложный контур</b>21.4.5. Рисование и заливка кривых
Контур - это последовательность фрагментов контура, а фрагмент контура - это последовательность точек, соединенных линиями. В контурах, которые определялись в разделе 21.4.1, эти точки соединялись прямыми линиями, но это не обязательно должно быть так. Объект
<b>CanvasRenderingContext2D</b><b>агс()</b>Этот метод добавляет во фрагмент контура дугу. Он соединяет текущую точку с началом дуги прямой линией и затем соединяет начало дуги с концом дуги сегментом окружности, при этом конечная точка дуги становится новой текущей точкой. Дуга определяется шестью параметрами: координаты X и Y центра окружности, радиус окружности, угол начала и конца дуги и направление (по часовой стрелке или против часовой стрелки) рисования дуги между этими двумя углами.
<b>агсТо()</b>Этот метод так же рисует прямую линию и круговую дугу, как и метод
<b>агс(),</b><b>агсТо()</b><b>bezierCurveTo()</b>Этот метод добавит во фрагмент контура новую точку Р и соединит ее с текущей точкой кубической кривой Безье. Форма кривой определяется двумя «контрольными точками» С1 и С2. В начале кривой (в текущей точке) рисование начинается в направлении точки С1. В свой конец (в точке Р) кривая приходит в направлении из точки С2. Между этими точками кривая плавно изгибается. Точка Р становится новой текущей точкой для фрагмента контура.
<b>quadraticCurveTo()</b>Этот метод похож на метод
<b>bezierCurveTo(),</b>С помощью этих методов можно рисовать контуры, подобные тем, что изображены на рис. 21.9.

В примере 21.7 представлен программный код, с помощью которого было создано изображение на рис. 21.9. Методы, используемые в этом примере, являются одними из самых сложных в прикладном интерфейсе объекта Canvas. Полное описание методов и их аргументов приводится в справочном разделе книги.
Пример 21.7. Добавление кривых в контур
<b>// Вспомогательная функция для преобразования градусов в радианы</b><b>function rads(x) { return Math.PI*x/180; }</b><b>// Нарисовать окружность. Используйте масштабирование и вращение, если требуется</b><b>// получить эллипс. Здесь не используется текущая точка, поэтому окружность рисуется</b><b>// без прямой линии, соединяющей текущую точку с началом окружности,</b><b>с.beginPath();</b><b>с.агс(75,100,50, // Центр в точке (75,100), радиус 50</b><b> 0,rads(360),false); // По часовой стрелке от 0 до 360 градусов</b><b>// Нарисовать сектор. Углы откладываются по часовой стрелке от положительной оси х.</b><b>// Обратите внимание, что метод агс() добавляет линию от текущей точки к началу дуги.</b><b>c.moveTo(200, 100); // Перейти в центр окружности</b><b>с.агс(200, 100, 50, // Центр окружности и радиус</b><b> rads(-60), rads(0), // Начальный угол -60 градусов, конечный 0 градусов</b><b> false); // false означает по часовой стрелке</b><b>с.closePath(); // Добавить прямую линю к центру окружности</b><b>// Тот же сектор, в противоположном направлении </b><b>c.moveTo(325, 100);</b><b>с.агс(325, 100, 50, rads(-60), rads(0), true); // Против часовой стрелки </b><b>c.closePath();</b><b>// Использовать агсТо() для закругления углов. Здесь рисуется квадрат с верхним левым</b><b>// углом в точке (400,50), с закруглениями углов дугами с разными радиусами.</b><b>c.moveTo(450, 50); // Середина верхней стороны,</b><b>с.агсТо(500,50,500,150,30); // Насть верхней стороны и правый верхний угол,</b><b>с.агсТо(500,150,400,150,20); // Добавить правую сторону и правый нижний угол,</b><b>с.агсТо(400,150,400,50,10); // Добавить нижнюю сторону и левый нижний угол,</b><b>с.агсТо(400,50,500,50,0); // Добавить левую сторону и левый верхний угол,</b>