SVG, Raphael.js, Рисование

Я думаю, это скорее математический вопрос или, может быть, вопрос SVG. Я хотел изменить пример кода, который нашел на сайте raphael.js. Я уже изменил его, чтобы иметь пользовательскую центральную точку. Теперь я хочу изменить его, чтобы указать, под каким углом начинается дуга. (аналогично d3.js, поэтому я могу использовать его, чтобы иметь что-то вроде гистограммы с отсутствующей серединой).

Однако я понятия не имею, с чего и как начать. Моя математика ужасна, я понятия не имею, что такое альфа и что делает переменная. Или почему x и y вычисляются именно так. Я читал спецификацию SVG снова и снова, но мне не хватает некоторых важных базовых знаний, и я не знаю.

Может ли кто-нибудь указать мне правильное направление, чтобы я мог начать понимать этот материал?

window.onload = function () {
    var r = Raphael("holder", 600, 600),
        R = 200,
        init = true,
        param = {stroke: "#fff", "stroke-width": 30};
    // Custom Attribute
    r.customAttributes.arc = function (xPos, yPos, value, total, R) {
        var alpha = 360 / total * value,
        a = (90 - alpha) * Math.PI / 180,
        x = xPos + R * Math.cos(a),
        y = yPos - R * Math.sin(a),
        var path = [["M", xPos, yPos - R], ["A", R, R, 0, +(alpha > 180), 1, x, y]];
        return {path: path};
    };
    var sec = r.path().attr(param).attr({arc: [300, 300, 3, 60, R]});
};

Запуск кода производит:

<svg height="600" version="1.1" width="600" xmlns="http://www.w3.org/2000/svg" style="overflow: hidden; position: relative;">
    <path style="" fill="none" stroke="#bfb5b5" d="M300,100A200,200,0,0,1,361.8033988749895,109.7886967409693" stroke-width="30">
</svg>

Также я понятия не имею, как параметры дуги работают вместе, чтобы рисовать то, что они рисуют.

Извиняюсь за отсутствие внимания к вопросу.

РЕДАКТИРОВАТЬ: Это основано на примере с полярными часами. http://raphaeljs.com/polar-clock.html


person guided1    schedule 03.05.2012    source источник
comment
Пожалуйста, объясните, почему за это проголосовали. Все дело в обучении. Будь то изучение кода или изучение того, как публиковать вопросы.   -  person guided1    schedule 04.05.2012
comment
можно ссылку на оригинальный пример?   -  person mihai    schedule 04.05.2012
comment
Мне кажется, хороший вопрос, +1. Это нетривиально и демонстрирует хорошую предыдущую попытку. @ guided1 - необъявленные отрицательные голоса - случайный факт жизни StackOverflow. Не беспокойтесь о них слишком сильно :)   -  person halfer    schedule 05.05.2012


Ответы (1)


Я думаю, что автор примера пытается создать настраиваемый атрибут, чтобы упростить создание дуг на основе вращения часов. В основном параметр total пользовательского атрибута представляет собой общее движение часов (60 секунд), а value (3 в вашем случае) представляет длину (в секундах) дуги, которую вы пытаетесь нарисовать. Таким образом, в основном у вас есть дуга в 3 секунды.

Теперь по математике:

  • alpha : угол (в градусах) дуги. Вы замечаете преобразование секунд в градусы: 3 секунды -> 18 градусов.

  • a : угол в радианах. В тригонометрических формулах используются радианы, а не градусы, поэтому вам необходимо это преобразование. По какой-то причине, которую я не понимаю, это дополнительный угол (90 - alpha)
    Изменить: дополнительный угол (вероятно) используется для компенсации того факта, что в тригонометрии ось Y указывает вверх, а на холсте svg — вниз.

  • x, y : конечные точки пути (дуги), который вы рисуете. Они вычисляются с использованием элементарной тригонометрии (извините, здесь вы не получите никакой помощи).

Параметры дуги svg описаны здесь: http://www.w3.org/TR/SVG/paths.html#PathDataEllipticalArcCommands

person mihai    schedule 03.05.2012
comment
Спасибо. Спасибо. Спасибо. Мне стыдно признаться, что у меня тоже отсутствует базовый триггер. Иду на khanacademy.org. - person guided1; 04.05.2012