Chcesz użyć eliptycznego A
polecenia rc . Na nieszczęście dla ciebie wymaga to podania współrzędnych kartezjańskich (x, y) punktów początkowych i końcowych zamiast współrzędnych biegunowych (promień, kąt), które masz, więc musisz wykonać matematykę. Oto funkcja JavaScript, która powinna działać (choć jej nie testowałem) i mam nadzieję, że jest dość oczywista:
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];
}
Które kąty odpowiadają pozycjom zegara zależą od układu współrzędnych; po prostu zamień i / lub neguj warunki sin / cos, jeśli to konieczne.
Polecenie łuku ma następujące parametry:
rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y
Dla twojego pierwszego przykładu:
rx
= ry
= 25 i x-axis-rotation
= 0, ponieważ chcesz koła, a nie elipsy. Możesz obliczyć zarówno współrzędne początkowe (które powinieneś M
przeoczyć), jak i końcowe (x, y), korzystając z powyższej funkcji, dając odpowiednio (200, 175) i około (182.322, 217.678). Biorąc pod uwagę dotychczasowe ograniczenia, można narysować cztery łuki, więc dwie flagi wybierają jedną z nich. Zgaduję, że prawdopodobnie chcesz narysować mały łuk (znaczenie large-arc-flag
= 0), w kierunku malejącego kąta (znaczenie sweep-flag
= 0). W sumie ścieżka SVG to:
M 200 175 A 25 25 0 0 0 182.322 217.678
W drugim przykładzie (zakładając, że masz na myśli pójście w tym samym kierunku, a tym samym duży łuk), ścieżka SVG to:
M 200 175 A 25 25 0 1 0 217.678 217.678
Znowu ich nie testowałem.
(edytuj 2016-06-01) Jeśli, podobnie jak @clocksmith, zastanawiasz się, dlaczego wybrali ten interfejs API, zapoznaj się z uwagami dotyczącymi implementacji . Opisują dwie możliwe parametryzacje łuku, „parametryzację punktu końcowego” (tę, którą wybrali) i „parametryzację środkową” (która jest podobna do tego, z której korzysta pytanie). W opisie „parametryzacji punktu końcowego” mówią:
Jedną z zalet parametryzacji punktu końcowego jest to, że pozwala ona na spójną składnię ścieżki, w której wszystkie polecenia ścieżki kończą się na współrzędnych nowego „bieżącego punktu”.
Zasadniczo jest to efekt uboczny, w którym łuki są traktowane jako część większej ścieżki, a nie jako oddzielny obiekt. Podejrzewam, że jeśli twój renderer SVG jest niekompletny, może po prostu pominąć komponenty ścieżki, których nie potrafi renderować, o ile wie, ile argumentów bierze. A może umożliwia równoległe renderowanie różnych fragmentów ścieżki z wieloma komponentami. A może zrobili to, aby upewnić się, że błędy zaokrąglania nie narastają wzdłuż złożonej ścieżki.
Uwagi dotyczące implementacji są również przydatne w przypadku pierwotnego pytania, ponieważ mają więcej pseudokodu matematycznego do konwersji między dwiema parametryzacjami (czego nie zdawałem sobie sprawy, kiedy pierwszy raz napisałem tę odpowiedź).
arcSweep
zmienna faktycznie kontrolujelarge-arc-flag
parametr svg A. W powyższym kodzie wartośćsweep-flag
parametru jest zawsze równa zero.arcSweep
należy prawdopodobnie zmienić nazwę na coś takiegolongArc
.