Ви хочете використати еліптичну 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.
Команда дуги має такі параметри:
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
Знову ж таки, я цього не перевіряв.
(редагувати 2016-06-01) Якщо ви, як @clocksmith, вам цікаво, чому вони обрали цей API, ознайомтеся з примітками до реалізації . Вони описують дві можливі параметризації дуги: "параметризацію кінцевих точок" (ту, яку вони обрали) та "центральну параметризацію" (це як те, що використовується у запитанні). В описі "параметризації кінцевої точки" вони кажуть:
Однією з переваг параметризації кінцевих точок є те, що вона допускає послідовний синтаксис шляху, в якому всі команди контуру закінчуються в координатах нової "поточної точки".
Таким чином, це побічний ефект дуг, що розглядається як частина більшого шляху, а не їх окремий об'єкт. Я вважаю, що якщо ваш SVG-рендер не завершений, він може просто пропустити будь-які компоненти контуру, він не знає, як відобразити, доки він знає, скільки аргументів вони беруть. А може, це дозволяє паралельне відображення різних фрагментів шляху з багатьма компонентами. Або, можливо, вони зробили це, щоб переконатися, що помилки округлення не накопичувались по довжині складного шляху.
Примітки щодо реалізації також корисні для початкового запитання, оскільки вони мають більше математичного псевдокоду для перетворення між двома параметрами (що я не усвідомлював, коли вперше написав цю відповідь).
arcSweep
змінна насправді керує параметромlarge-arc-flag
svg A. У наведеному вище коді значення дляsweep-flag
параметра завжди дорівнює нулю.arcSweep
певно, слід перейменувати на щось подібнеlongArc
.