Короткий вопрос: используя путь SVG, мы можем нарисовать 99,99% круга, и он появляется, но если он равен 99,999999999% круга, то круг не будет отображаться. Как это можно исправить?
Следующий путь SVG может нарисовать 99,99% круга: (попробуйте это на http://jsfiddle.net/DFhUF/1381/ и посмотрите, видите ли вы 4 дуги или только 2 дуги, но обратите внимание, что если это IE, это отображается в VML, а не в SVG, но имеет похожую проблему)
M 100 100 a 50 50 0 1 0 0.00001 0
Но когда это 99,999999999% от круга, то вообще ничего не покажется?
M 100 100 a 50 50 0 1 0 0.00000001 0
И то же самое со 100% круга (это все еще дуга, не так ли, просто очень полная дуга)
M 100 100 a 50 50 0 1 0 0 0
Как это можно исправить? Причина в том, что я использую функцию, чтобы нарисовать процент дуги, и если мне нужно «особый случай», дуга 99,9999% или 100%, чтобы использовать функцию круга, это было бы глупо.
Опять же, тестовый пример для jsfiddle с использованием RaphaelJS находится по адресу http://jsfiddle.net/DFhUF/1381/
(и если это VML в IE 8, даже второй круг не будет показан ... вы должны изменить его на 0.01)
Обновить:
Это потому, что я выставляю дугу для оценки в нашей системе, поэтому 3,3 балла получают 1/3 круга. 0,5 получает полукруга, а 9,9 балла - 99% круга. Но что, если в нашей системе есть 9,99 баллов? Должен ли я проверить, находится ли он близко к 99,999% круга, и использовать arc
функцию или circle
функцию соответственно? Тогда как насчет 9.987? Какой использовать? Смешно знать, какие оценки будут отображаться в «слишком полный круг» и переключаться на функцию круга, а когда это «определенный 99,9%» от круга или 9,9997, тогда использовать функцию дуги ,
Ответы:
То же самое для дуги XAML. Просто закройте дугу 99,99%,
Z
и вы получите круг!источник
z
в конце и все готово. Возможно, вам придется удалить нули, например, в последней версии Chrome, которую мне пришлось написать,0.0001
чтобы она работала. Если вы ищете, куда поместить строку пути, посмотрите на Пути в MDN .Я знаю, что в игре немного поздно, но я вспомнил этот вопрос, когда он был новым, и у меня была похожая дилемма, и я случайно нашел «правильное» решение, если кто-то все еще ищет его:
Другими словами, это:
может быть достигнуто как путь с этим:
Хитрость заключается в том, чтобы иметь две дуги, вторая поднимая там, где остановилась первая, и используя отрицательный диаметр, чтобы вернуться к исходной начальной точке дуги.
Причина, по которой это не может быть выполнено в виде полного круга в одной дуге (и я просто размышляю), заключается в том, что вы сказали бы ему нарисовать дугу из себя (скажем, 150 150) в себя (150 150), которую он отображает. как "о, я уже там, дуга не нужна!"
Преимущества предлагаемого мной решения:
Ничего из этого не имеет значения, если они просто позволят текстовым путям принимать формы. Но я думаю, что они избегают этого решения, поскольку элементы формы, такие как круг, технически не имеют начальной точки.
Демонстрация jsfiddle: http://jsfiddle.net/crazytonyi/mNt2g/
Обновить:
Если вы используете путь для
textPath
ссылки и хотите, чтобы текст отображался по внешнему краю дуги, вы должны использовать точно такой же метод, но измените флаг развертки с 0 на 1, чтобы он обрабатывал внешнюю часть путь как поверхность, а не изнутри (представьте,1,0
что кто-то сидит в центре и рисует вокруг себя круг,1,1
а кто-то идет вокруг центра на расстоянии радиуса и тащит мел рядом с собой, если это поможет). Вот код, как указано выше, но с изменением:источник
В отношении решения Энтони, вот функция для получения пути:
источник
Совершенно другой подход:
Вместо того, чтобы возиться с путями, чтобы указать дугу в svg, вы также можете взять элемент круга и указать штрих-черту в псевдокоде:
Его простота является основным преимуществом по сравнению с методом с несколькими дугами (например, при написании сценариев вы подключаете только одно значение и готово для любой длины дуги)
Дуга начинается в крайней правой точке и может быть смещена с помощью поворота.
Примечание: в Firefox есть странная ошибка, когда повороты на 90 градусов и более игнорируются. Итак, чтобы начать дугу сверху, используйте:
источник
stroke-dasharray="0 10cm 5cm 1000cm"
его помощью можно избежать трансформацииAdobe Illustrator использует кривые Безье, такие как SVG, а для кругов создает четыре точки. Вы можете создать круг с помощью двух команд эллиптической дуги ... но тогда для круга в SVG я бы использовал
<circle />
:)источник
circle
, пожалуйста, см. Обновление в вопросе вместо этого.arc
для создания полного круга, используя левую дугу и правую дугу? Таким образом, дуга не может нарисовать полный круг ... для этогоarc
нужны два путиЭто хорошая идея, чтобы использовать две команды дуги, чтобы нарисовать полный круг.
обычно я использую эллипс или элемент круга, чтобы нарисовать полный круг.
источник
Опираясь на ответы Энтони и Антона, я включил возможность вращать сгенерированный круг, не влияя на его внешний вид. Это полезно, если вы используете путь для анимации и вам нужно контролировать, где она начинается.
источник
Для таких как я, которые искали атрибуты эллипса для преобразования пути:
источник
Написано как функция, это выглядит так:
источник
<circle>
вы должны изменить направление на восток, юг, запад, север:"M" + cx + "," + cy + "m" + (r) + ",0" + "a" + r + "," + r + " 0 1,1 " + (-r * 2) + ",0" + "a" + r + "," + r + " 0 1,1 " + (r * 2) + ",0"
Преимущество заключается в том, чтоstroke-dashoffset
и вstartOffset
настоящее время работает таким же образом.Эти ответы слишком сложны.
Более простой способ сделать это без создания двух дуг или преобразования в разные системы координат.
Это предполагает, что ваша область холста имеет ширину
w
и высотуh
.Просто используйте флаг "длинная дуга", чтобы заполнить полный флаг. Затем сделайте дуги на 99,9999% полным кругом. Визуально это то же самое. Избегайте флага развертки, просто начав круг в крайней правой точке круга (один радиус прямо горизонтально от центра).
источник
Другим способом было бы использовать две кубические кривые Безье. Это для пользователей iOS, использующих pocketSVG, который не распознает параметр svg arc.
C x1 y1, x2 y2, xy (или c dx1 dy1, dx2 dy2, dx dy)
Последний набор координат здесь (x, y) - это то место, где должна заканчиваться линия. Два других являются контрольными точками. (x1, y1) является контрольной точкой для начала вашей кривой, и (x2, y2) для конечной точки вашей кривой.
источник
я сделал jsfiddle, чтобы сделать это здесь:
ссылка на сайт
все, что вам нужно сделать, это изменить ввод в console.log и получить результат в консоли
источник