Любой гуру RaphaelJS знает, как нарисовать это изображение?

#raphael

#рафаэль

Вопрос:

Любой гуру Raphael JS (или любой гений, который не знает Raphael JS) знает, как просто нарисовать это?

введите описание изображения здесь

сплошной желтый цвет составляет 4,2 / 10 части круга.

Ответ №1:

Первый подход с использованием команды svg elliptical arc curve

Демо:http://jsbin.com/iwuqe3/edit

 Raphael.fn.zeroToTenArc = function (x, y, r, value) {

  var set = this.set();
  var pi = Math.PI;
  var cos = Math.cos;
  var sin = Math.sin;
  var maxValue = 10;
  var t = (pi/2) * 3; //translate
  var rad = (pi*2 * (maxValue-value)) / maxValue   t;
  var colors = ["#F79518", "#FCE6BF", "#FFF"];

  set.push(this.circle(x, y, r).attr({ fill : colors[ !value], stroke : 0 }));

  var p = [
    "M", x, y,
    "l", r * cos(t), r * sin(t),
    "A", r, r, 0,  (rad > pi   t), 1, x   r * cos(rad), y   r * sin(rad), 
    "z"
  ];

  set.push(this.path(p).attr({ fill : colors[1], stroke : 0 }));


  set.push(this.circle(x, y, r*0.7).attr({ fill : colors[2], stroke : 0 }));

  return set;
};

var canvas = Raphael("hello", 300, 300);
var arc = canvas.zeroToTenArc(150, 150, 30, 4.2);
  

.

Второй подход, использующий (много) команд lineto svg

Демо:http://jsbin.com/usotu5/edit

 Raphael.fn.zeroToTenArc = function (x, y, radius, value) {
  var angle = 0;
  var endAngle = (value*360)/10;
  var path = "";
  var clockwise = -1;
  var translate = Math.PI/2;

  while(angle <= endAngle) {

    var radians= (angle/180) * Math.PI   translate;
    var cx = x   Math.cos(radians) * radius;
    var cy = y   Math.sin(radians) * radius * clockwise;

    path  = (angle === 0) ? "M" : "L";
    path  = [cx,cy];
    angle  = 1;
  }

  return this.path(path);
};

var canvas = Raphael("hello", 200, 200);

canvas.zeroToTenArc(50, 50, 30, 10).attr({ stroke : "#FCE6BF", "stroke-width" : 12 });
canvas.zeroToTenArc(50, 50, 30, 4.2).attr({ stroke : "#F79518", "stroke-width" : 12 });
  

Комментарии:

1. как насчет текста, вы используете что-то вроде var t = paper.text(50, 50, 4.2).attr({fill: "#f00", "font-size" : "15px"}); для этого? Я не был уверен, какой использовать для установки цвета. Если я использую stroke , это фактически дало мне 2 цвета, один поверх другого. (черный поверх цвета, который я хотел).

2. Кроме того, еще одна вещь, есть два размера, один большой и один маленький, и маленький размер должен быть размером 50 x 50 div, поэтому я использовал радиус 22 и ширину обводки 6, и края выглядят несколько неровными… Я предполагаю, что это результат отсутствия сглаживания? (также потому, что это более яркий цвет по сравнению с белым фоном) Есть ли способ сделать его более плавным? Мой пример jsbin.com/usotu5/3/edit

3. я добавил ваш текст в демо. имхо, оно идеально подходит. jsbin.com/usotu5/4/edit сглаживание может быть проблемой. извините, я понятия не имею. подводные камни существуют в зависимости от вашего браузера платформы. например, chrome в Windows имеет ошибку с цветом обводки.

4. возможно, circle метод лучше справляется со сглаживанием… итак, в SVG нет способа красиво нарисовать дугу, но нужно полагаться на серию «Переместить в» и «Линия в»? (их много!)

5. вы правы. в настоящее время это своего рода быстрый и грязный взлом, поэтому я придумал новый подход, основанный на методе arc в svg. не могли бы вы, пожалуйста, проверить это? для меня это хорошо смотрится на mac / chrome. jsbin.com/iwuqe3/edit