Вы хотите использовать эллиптическую A
команду rc . К сожалению для вас, это требует, чтобы вы указали декартовы координаты (x, y) начальной и конечной точек, а не полярные координаты (радиус, угол), которые у вас есть, поэтому вам нужно выполнить некоторые математические вычисления. Вот функция JavaScript, которая должна работать (хотя я ее не тестировал) и которая, я надеюсь, довольно понятна:
function polarToCartesian(centerX, centerY, radius, angleInDegrees) {
var angleInRadians = angleInDegrees * Math.PI / 180.0;
var x = centerX + radius * Math.cos(angleInRadians);
var y = centerY + radius * Math.sin(angleInRadians);
return [x,y];
}
Какие углы соответствуют каким позициям часов будет зависеть от системы координат; просто меняйте местами и / или отменяйте условия sin / cos по мере необходимости.
Команда arc имеет следующие параметры:
rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y
Для вашего первого примера:
rx
= ry
= 25 и x-axis-rotation
= 0, так как вы хотите круг, а не эллипс. Вы можете вычислить как начальные координаты (которые вы должны M
добавить), так и конечные координаты (x, y), используя функции выше, получая (200, 175) и около (182.322, 217.678), соответственно. Учитывая эти ограничения, на самом деле существует четыре дуги, которые можно нарисовать, поэтому два флага выбирают одну из них. Я предполагаю, что вы, вероятно, хотите нарисовать небольшую дугу (значение large-arc-flag
= 0) в направлении уменьшения угла (значение sweep-flag
= 0). Все вместе, путь SVG это:
M 200 175 A 25 25 0 0 0 182.322 217.678
Для второго примера (при условии, что вы имеете в виду идти в одном направлении и, следовательно, по большой дуге), путь SVG:
M 200 175 A 25 25 0 1 0 217.678 217.678
Опять же, я не проверял это.
(edit 2016-06-01) Если вам, как и @clocksmith, интересно, почему они выбрали этот API, взгляните на замечания по реализации . Они описывают две возможные параметризации дуги, «параметризацию конечной точки» (ту, которую они выбрали) и «параметризацию центра» (что похоже на то, что использует вопрос). В описании «параметризации конечной точки» они говорят:
Одним из преимуществ параметризации конечной точки является то, что она допускает согласованный синтаксис пути, в котором все команды пути заканчиваются в координатах новой «текущей точки».
Таким образом, в основном это побочный эффект дуг, рассматриваемых как часть большего пути, а не как их отдельный объект. Я предполагаю, что если ваш рендерер SVG неполон, он может просто пропустить любые компоненты пути, которые он не знает, как отобразить, если он знает, сколько аргументов они принимают. Или, возможно, он позволяет выполнять параллельный рендеринг различных фрагментов пути со многими компонентами. Или, возможно, они сделали это, чтобы избежать ошибок округления по всей длине сложного пути.
Замечания по реализации также полезны для исходного вопроса, так как они имеют больше математического псевдокода для преобразования между двумя параметризациями (что я не осознавал, когда впервые написал этот ответ).
arcSweep
переменная фактически управляет параметромlarge-arc-flag
svg A. В приведенном выше коде значениеsweep-flag
параметра всегда равно нулю.arcSweep
вероятно, следует переименовать в нечто подобноеlongArc
.