JavaScript. Подробное руководство, 6-е издание, стр. 352

<b>      &lt;circle cx=&quot;5&quot; cy=&quot;5&quot; r=&quot;5&quot; fill=&quot;blue&quot;/&gt;</b>

<b>    &lt;/svg&gt;</b>

<b>  &lt;/body&gt;</b>

<b>&lt;/html&gt;</b>

На момент написания этих строк непосредственное встраивание SVG-изображе-ний в разметку HTML поддерживали только самые последние версии броузеров.

Так как формат SVG - это грамматика языка XML, рисование SVG-изображений заключается просто в использовании модели DOM для создания соответствующих XML-элементов. В примере 21.2 приводится реализация функции

<b>pieChart(),</b>
которая создает SVG-элементы для воспроизведения круговой диаграммы, подобной той, что показана на рис. 21.3.

JavaScript. Подробное руководство, 6-е издание - i_054.jpg

Рис. 21.3. Круговая диаграмма в формате SVG, построенная JavaScript-сценарием

Пример 21.2. Рисование круговой диаграммы средствами JavaScript и SVG

<b>/* *</b>

<b>* Создает элемент &lt;svg&gt; и рисует в нем круговую диаграмму.</b>

<b>* Аргументы:</b>

<b>* data: массив чисел для диаграммы, по одному для каждого сектора.</b>

<b>* width,height: размеры SVG-изображения в пикселах</b>

<b>* сх, су, г: координаты центра и радиус круга</b>

<b>* colors: массив цветов в формате HTML, по одному для каждого сектора</b>

<b>* labels: массив меток для легенды, по одной для каждого сектора</b>

<b>* 1х, 1у: координаты левого верхнего угла легенды диаграммы</b>

<b>* Возвращает:</b>

<b>* Элемент &lt;svg&gt;, хранящий круговую диаграмму.</b>

<b>* Вызывающая программа должна вставить возвращаемый элемент в документ.</b>

<b>*/</b>

<b>function pieChart(data, width, height, cx, су, r, colors, labels, lx, ly) {</b>

<b>  // Пространство имен XML для элементов svg </b>

<b>  var svgns = &quot;</b><a href="http://www.w3.org/2000/svg"><b>http://www.w3.org/2000/svg</b></a><b>&quot;;</b>

<b>  // Создать элемент &lt;svg&gt;, указать размеры в пикселах и координаты</b>

<b>  var chart = document.createElementNS(svgns, &quot;svg:svg&quot;);</b>

<b>  chart.setAttribute(&quot;width&quot;, width);</b>

<b>  chart.setAttribute(&quot;height&quot;, height);</b>

<b>  chart.setAttribute(&quot;viewBox&quot;, &quot;0 0 ” + width + &quot; &quot; + height);</b>

<b>  // Сложить вместе все значения, чтобы получить общую сумму всей диаграммы</b>

<b>  var total = 0;</b>

<b>  for(var і = 0; і &lt; data.length; і++) total += data[і];</b>

<b>  // Определить величину каждого сектора. Углы измеряются в радианах,</b>

<b>  var angles = []</b>

<b>  for(var і = 0; і &lt; data.length; і++) angles[i] = data[i]/total*Math.PI*2;</b>

<b>  // Цикл по всем секторам диаграммы,</b>

<b>  startangle = 0;</b>

<b>  for(var і = 0; і &lt; data.length; i++) {</b>

<b>    // Точка, где заканчивается сектор</b>

<b>    var endangle = startangle + angles[i];</b>

<b>    // Вычислить координаты точек пересечения радиусов, образующих сектор,</b>

<b>    // с окружностью. В соответствии с выбранными формулами углу 0 радиан</b>

<b>    // соответствует точка в самой верхней части окружности,</b>

<b>    // а положительные значения откладываются от нее по часовой стрелке.</b>

<b>    var х1 = сх + r * Math.sin(startangle);</b>

<b>    var y1 = су - r * Math.cos(startangle);</b>

<b>    var x2 = cx + r * Math.sin(endangle);</b>

<b>    var y2 = су - r * Math.cos(endangle);</b>

<b>    // Это флаг для углов, больших половины окружности.</b>

<b>    // Он необходим SVG-механизму рисования дуг</b>

<b>    var big = 0;</b>

<b>    if (endangle - startangle &gt; Math.PI) big = 1;</b>

<b>    // Мы описываем сектор с помощью элемента &lt;svg:path&gt;.</b>

<b>    // Обратите внимание, что он создается вызовом createElementNS()</b>

<b>    var path = document.createElementNS(svgns, &quot;path&quot;);</b>

<b>    // Эта строка хранит информацию о контуре, образующем сектор</b>

<b>    var d = &quot;М &quot; + сх + + су + // Начало в центре окружности</b>

<b>      &quot; L &quot; + х1 + &quot;,&quot; + у1 +  // Нарисовать линию к точке (х1,у1)</b>

<b>      &quot; А &quot; + r + &quot;,&quot; + r +    // Нарисовать дугу с радиусом r</b>

<b>      &quot; 0 &quot; + big + &quot; 1 &quot; +    // Информация о дуге...</b>