2013-11-27 3 views
7

Мне нужна помощь, добавив маркер в этот скрипт диаграммы пончика, который я изменил, используя raphael.js. У меня есть все, что можно сделать, за исключением способа динамического создания треугольного маркера.Как добавить маркер в диаграмму пончика, созданную с помощью Raphael.js?

JSFiddle: http://jsfiddle.net/aP7MK/73/

function donutChart(total, goal, avg){ 

    var paper = Raphael("canvas", 400, 400); 
    paper.customAttributes.arc = function (xloc, yloc, value, total, R) { 
     var alpha = 360/total * value, 
      a = (90 - alpha) * Math.PI/180, 
      x = xloc + R * Math.cos(a), 
      y = yloc - R * Math.sin(a), 
      path; 
     if (total == value) { 
      path = [ 
       ["M", xloc, yloc - R], 
       ["A", R, R, 0, 1, 1, xloc - 0.01, yloc - R] 
      ]; 
     } else { 
      path = [ 
       ["M", xloc, yloc - R], 
       ["A", R, R, 0, +(alpha > 180), 1, x, y] 
      ]; 
     } 
     return { 
      path: path 
     }; 
    }; 

    var backCircle = paper.circle(100, 100, 40).attr({ 
     "stroke": "#7BC2E5", 
      "stroke-width": 14 
    }); 

    var theArc = paper.path().attr({ 
     "stroke": "#f5f5f5", 
      "stroke-width": 14, 
     arc: [100, 100, 0, 100, 40] 
    }); 


    //event fired on each animation frame 
    eve.on("raphael.anim.frame.*", onAnimate); 

    //text in the middle 
    theText = paper.text(100, 100, "0%").attr({ 
     "font-size": 18, 
      "fill": "#f5f5f5", 
      "font-weight": "bold" 
    }); 

    //the animated arc 
    theArc.rotate(0, 100, 100).animate({ 
     arc: [100, 100, ((total/goal) * 100), 100, 40] 
    }, 1900); 


    //on each animation frame we change the text in the middle 

    function onAnimate() { 
     var howMuch = theArc.attr("arc"); 
     theText.attr("text", Math.floor(howMuch[2]) + "%"); 
    } 
} 

donutChart(80, 140, 40); 

Вот то, что я в конце концов пытается создать:

Я не беспокоюсь о стилизации, нужно просто помочь с элементом маркера, который будет обозначать, где аргумент avg, передаваемый функции donutChart, лежит внутри диаграммы.

+1

Не могли бы вы использовать уаг три- = paper.path ("M100,100,130,100,100,130z"); а затем повернуть/перевести его в зависимости от того, как много или что-то еще? – Ian

+0

Эй @Ian - Извините, я должен был уточнить, что у меня нет никакого опыта создания SVG. Я нашел код выше в рамках другого вопроса SO и немного изменил его, чтобы быть более похожим на то, что я ищу, но что касается рисования и генерации путей, я не знаю, с чего начать. Вы можете попробовать обновить пример на скрипке с помощью своего предложения? – mkp

ответ

5

Как @Ian сказал, что вы можете использовать path нарисовать треугольник:

// triangle 
var tri = paper.path("M100 50 L90 40 L110 40 L100 50 Z"); 

Смотрите docs об использовании path (его команды).

Затем вам нужно повернуть/перевести (опять же, как сказал @Ian), но SVG помогает здесь обеспечивая rotate метод, который принимает не только угол поворота, но и координаты точки, чтобы повернуть вокруг (он переводит координаты для вас)

tri.rotate((howMuch[2] - prev_percent) * 3.6, 100, 100); 

Единственное, что нужно отметить, это то, что вам нужно разницу в предыдущем и текущем процентах.

Рабочая fiddle

+1

Спасибо за обновленную скрипку! Я внес несколько изменений в то, что вы настроили для дальнейшей имитации того, что мне нужно для моего конечного продукта, и задавался вопросом, знаете ли вы, как цвет в треугольнике или, возможно, добавить прямую линию в круг, подобную изображению выше. http://jsfiddle.net/RS882/3/ – mkp

+2

Это легко http://jsfiddle.net/RS882/4/. На самом деле у вас есть все части вашего кода, чтобы понять это – twil

+0

Nice! Я многое узнал о SVG, спасибо за помощь @twil! – mkp

Смежные вопросы