Учитывая окружность в центре (200 200), радиус 25, как мне нарисовать дугу от 270 градусов до 135 градусов и ту, которая идет от 270 до 45 градусов?
0 градусов означает, что он находится справа от оси x (справа) (что означает, что это 3 часа), 270 градусов означает, что это 12 часов, а 90 означает, что это 6 часов.
В более общем смысле, что такое путь для дуги для части круга с
x, y, r, d1, d2, direction
смысл
center (x,y), radius r, degree_start, degree_end, direction
arcSweep
переменная фактически управляет параметромlarge-arc-flag
svg A. В приведенном выше коде значениеsweep-flag
параметра всегда равно нулю.arcSweep
вероятно, следует переименовать в нечто подобноеlongArc
.endAngle - 0.0001
если нет, полная дуга не будет отрисована.Вы хотите использовать эллиптическую
A
команду rc . К сожалению для вас, это требует, чтобы вы указали декартовы координаты (x, y) начальной и конечной точек, а не полярные координаты (радиус, угол), которые у вас есть, поэтому вам нужно выполнить некоторые математические вычисления. Вот функция JavaScript, которая должна работать (хотя я ее не тестировал) и которая, я надеюсь, довольно понятна:Какие углы соответствуют каким позициям часов будет зависеть от системы координат; просто меняйте местами и / или отменяйте условия sin / cos по мере необходимости.
Команда arc имеет следующие параметры:
Для вашего первого примера:
rx
=ry
= 25 иx-axis-rotation
= 0, так как вы хотите круг, а не эллипс. Вы можете вычислить как начальные координаты (которые вы должныM
добавить), так и конечные координаты (x, y), используя функции выше, получая (200, 175) и около (182.322, 217.678), соответственно. Учитывая эти ограничения, на самом деле существует четыре дуги, которые можно нарисовать, поэтому два флага выбирают одну из них. Я предполагаю, что вы, вероятно, хотите нарисовать небольшую дугу (значениеlarge-arc-flag
= 0) в направлении уменьшения угла (значениеsweep-flag
= 0). Все вместе, путь SVG это:Для второго примера (при условии, что вы имеете в виду идти в одном направлении и, следовательно, по большой дуге), путь SVG:
Опять же, я не проверял это.
(edit 2016-06-01) Если вам, как и @clocksmith, интересно, почему они выбрали этот API, взгляните на замечания по реализации . Они описывают две возможные параметризации дуги, «параметризацию конечной точки» (ту, которую они выбрали) и «параметризацию центра» (что похоже на то, что использует вопрос). В описании «параметризации конечной точки» они говорят:
Таким образом, в основном это побочный эффект дуг, рассматриваемых как часть большего пути, а не как их отдельный объект. Я предполагаю, что если ваш рендерер SVG неполон, он может просто пропустить любые компоненты пути, которые он не знает, как отобразить, если он знает, сколько аргументов они принимают. Или, возможно, он позволяет выполнять параллельный рендеринг различных фрагментов пути со многими компонентами. Или, возможно, они сделали это, чтобы избежать ошибок округления по всей длине сложного пути.
Замечания по реализации также полезны для исходного вопроса, так как они имеют больше математического псевдокода для преобразования между двумя параметризациями (что я не осознавал, когда впервые написал этот ответ).
источник
large-arc-flag
нужно переключать с 0 на 1, может привести к некоторой ошибке.Я немного изменил ответ opsb и сделал в поддержку заливки для сектора круга. http://codepen.io/anon/pen/AkoGx
JS
HTML
источник
centerX
,centerY
например , до 100.viewBox="0 0 500 500"
Это старый вопрос, но я нашел код полезный и спас меня три минуты мышления :) Так что я добавляю небольшое расширение к @opsb «s ответа .
Если вы хотите преобразовать эту дугу в срез (чтобы обеспечить заполнение), мы можем немного изменить код:
и там вы идете!
источник
Ответы @ opsb точные, но центральная точка не точна, более того, как заметил @Jithin, если угол равен 360, то вообще ничего не рисуется.
@Jithin исправил проблему 360, но если вы выбрали менее 360 градусов, вы получите линию, закрывающую петлю дуги, которая не требуется.
Я исправил это и добавил анимацию в код ниже:
источник
Я хотел прокомментировать ответ @Ahtenus, в частности, комментарий Рэя Хулхи, в котором говорилось, что кодовая ручка не показывает никакой дуги, но моя репутация недостаточно высока.
Причина, по которой этот код не работает, состоит в том, что его HTML-код неисправен с шириной обводки, равной нулю.
Я исправил это и добавил второй пример здесь: http://codepen.io/AnotherLinuxUser/pen/QEJmkN .
HTML:
Соответствующий CSS:
Javascript:
источник
Изображение и немного Python
Просто чтобы лучше уточнить и предложить другое решение. Команда
Arc
[A
] использует текущую позицию в качестве отправной точки, поэтомуMoveto
сначала вы должны использовать команду [M].Тогда параметры
Arc
следующие:Если мы определим, например, следующий файл SVG:
Вы установите начальную точку с
M
конечной точкой с параметрамиxf
иyf
изA
.Мы ищем круги, поэтому мы устанавливаем
rx
равныеry
этим, в основном теперь мы попытаемся найти все окружности радиуса,rx
которые пересекают начальную и конечную точки.Вы можете получить более подробное объяснение в этом посте, который я написал.
источник
Примечание для тех, кто ищет ответы (кем я тоже был) - если использование дуги не является обязательным , гораздо более простым решением для рисования круга является использование
stroke-dasharray
SVG<circle>
.Разделите массив штрихов на два элемента и масштабируйте их диапазон до нужного угла. Начальный угол можно отрегулировать с помощью
stroke-dashoffset
.Ни одного косинуса в поле зрения.
Полный пример с объяснениями: https://codepen.io/mjurczyk/pen/wvBKOvP
источник
Оригинальная функция polarToCartesian от wdebeaum верна:
Изменение начальной и конечной точек с помощью:
Это сбивает с толку (для меня), потому что это поменяет флаг развертки. С помощью:
with sweep-flag = "0" рисует "нормальные" дуги против часовой стрелки, которые, я думаю, более прямолинейны. См. Https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths.
источник
Небольшая модификация ответа @ opsb. С помощью этого метода мы не можем нарисовать полный круг. т.е. если мы дадим (0, 360), он вообще ничего не будет рисовать. Так что небольшое исправление сделано, чтобы это исправить. Это может быть полезно для отображения оценок, которые иногда достигают 100%.
источник
Версия ES6:
источник
const d = `M ${start.x} ${start.y} A ${radius} ${radius} 0 ${largeArc} 0 ${end.x} ${end.y}`
Компонент ReactJS на основе выбранного ответа:
источник
Вы можете использовать код JSFiddle, который я сделал для ответа выше:
https://jsfiddle.net/tyw6nfee/
все, что вам нужно сделать, это изменить код console.log последней строки и задать для него собственный параметр:
источник