Вы хотите использовать эллиптическую 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
ove), так и конечные координаты (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
Опять же, я не проверял их.
(редактировать 2016-06-01) Если, как и @clocksmith, вам интересно, почему они выбрали этот API, взгляните на замечания по реализации . Они описывают две возможные параметризации дуги, «параметризацию конечной точки» (ту, которую они выбрали), и «параметризацию центра» (что похоже на то, что использует вопрос). В описании «параметризации конечной точки» говорится:
Одним из преимуществ параметризации конечной точки является то, что она допускает согласованный синтаксис пути, в котором все команды пути заканчиваются в координатах новой «текущей точки».
Так что в основном это побочный эффект дуг, рассматриваемых как часть большего пути, а не как их отдельный объект. Я полагаю, что если ваш рендерер SVG неполон, он может просто пропустить любые компоненты пути, которые он не знает, как отобразить, если он знает, сколько аргументов они принимают. Или, возможно, он позволяет выполнять параллельный рендеринг различных фрагментов пути со многими компонентами. Или, может быть, они сделали это, чтобы избежать ошибок округления по всей длине сложного пути.
Замечания по реализации также полезны для исходного вопроса, поскольку в них имеется больше математического псевдокода для преобразования между двумя параметризациями (что я не осознавал, когда впервые написал этот ответ).