Biorąc pod uwagę okrąg wyśrodkowany na (200,200), promień 25, jak narysować łuk od 270 stopni do 135 stopni i taki, który przechodzi od 270 do 45 stopni?
0 stopni oznacza, że jest dokładnie na osi x (po prawej stronie) (co oznacza, że jest to godzina trzecia) 270 stopni oznacza, że jest godzina 12, a 90 oznacza, że jest godzina 6
Mówiąc bardziej ogólnie, czym jest ścieżka dla łuku dla części koła
x, y, r, d1, d2, direction
znaczenie
center (x,y), radius r, degree_start, degree_end, direction
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
.endAngle - 0.0001
jeśli nie, pełny łuk nie będzie renderowany.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: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:
Dla twojego pierwszego przykładu:
rx
=ry
= 25 ix-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 (znaczenielarge-arc-flag
= 0), w kierunku malejącego kąta (znaczeniesweep-flag
= 0). W sumie ścieżka SVG to: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:
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ą:
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ź).
źródło
large-arc-flag
musi zostać przełączony z 0 na 1, może wprowadzić błąd.Lekko zmodyfikowałem odpowiedź opsb i wprowadziłem obsługę wypełnienia dla sektora koła. http://codepen.io/anon/pen/AkoGx
JS
HTML
źródło
centerX
,centerY
na przykład do 100.viewBox="0 0 500 500"
Jest to stare pytanie, ale okazało się, że kod użyteczne i zaoszczędziło mi trzy minuty myślenia :) Więc dodaję niewielką ekspansję na @opsb „s odpowiedź .
Jeśli chcesz przekonwertować ten łuk na plasterek (aby umożliwić wypełnienie), możemy nieznacznie zmodyfikować kod:
i proszę bardzo!
źródło
Odpowiedzi @ opsb są zgrabne, ale punkt środkowy nie jest dokładny, ponadto, jak zauważył @Jithin, jeśli kąt wynosi 360, to nic nie jest rysowane.
@Jithin naprawił problem 360, ale jeśli wybierzesz mniej niż 360 stopni, otrzymasz linię zamykającą pętlę łuku, co nie jest wymagane.
Naprawiłem to i dodałem animację w poniższym kodzie:
źródło
Chciałem skomentować odpowiedź @Ahtenus, szczególnie komentarz Raya Hulha, mówiąc, że codepen nie pokazuje żadnego łuku, ale moja reputacja nie jest wystarczająco wysoka.
Przyczyną tego, że codepen nie działa jest to, że jego HTML jest uszkodzony z szerokością obrysu równą zero.
Naprawiłem to i dodałem drugi przykład tutaj: http://codepen.io/AnotherLinuxUser/pen/QEJmkN .
HTML:
Odpowiedni CSS:
Javascript:
źródło
Obraz i trochę Python
Żeby lepiej wyjaśnić i zaoferować inne rozwiązanie. Komenda
Arc
[A
] użyj bieżącej pozycji jako punktu początkowego, więc musisz najpierw użyćMoveto
komendy [M].Następnie parametry
Arc
są następujące:Jeśli zdefiniujemy na przykład następujący plik svg:
Zostanie ustawiony punkt początkowy z
M
punktem kończącym się z parametramixf
iyf
zA
.Szukamy okręgów, więc ustawiliśmy się
rx
nary
robienie tego w zasadzie teraz spróbuje znaleźć cały okrąg o promieniu,rx
który przecina punkt początkowy i końcowy.Możesz napisać bardziej szczegółowe wyjaśnienie w tym poście .
źródło
Uwaga dla osób poszukujących odpowiedzi (którym również byłem) - jeśli użycie łuku nie jest obowiązkowe , o wiele prostszym rozwiązaniem do narysowania koła częściowego jest użycie
stroke-dasharray
SVG<circle>
.Podziel tablicę rozdzielczą na dwa elementy i przeskaluj ich zakres do pożądanego kąta. Kąt początkowy można regulować za pomocą
stroke-dashoffset
.Ani jednego cosinusa w zasięgu wzroku.
Pełny przykład z objaśnieniami: https://codepen.io/mjurczyk/pen/wvBKOvP
źródło
Oryginalna funkcja polarToCartesian autorstwa wdebeaum jest poprawna:
Odwracanie punktów początkowych i końcowych za pomocą:
Jest to dla mnie mylące, ponieważ spowoduje to odwrócenie flagi zamiatania. Za pomocą:
with sweep-flag = "0" rysuje "normalne" łuki przeciwnie do ruchu wskazówek zegara, co moim zdaniem jest bardziej proste. Zobacz https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths
źródło
Drobna modyfikacja odpowiedzi @ opsb. Nie możemy narysować pełnego koła za pomocą tej metody. tzn. jeśli podamy (0, 360), to nic nie narysuje. Tak więc wprowadzono niewielką modyfikację, aby to naprawić. Przydatne może być wyświetlanie wyników, które czasami osiągają 100%.
źródło
Wersja ES6:
źródło
const d = `M ${start.x} ${start.y} A ${radius} ${radius} 0 ${largeArc} 0 ${end.x} ${end.y}`
Składnik ReactJS na podstawie wybranej odpowiedzi:
źródło
możesz użyć kodu JSFiddle, który utworzyłem dla odpowiedzi powyżej:
https://jsfiddle.net/tyw6nfee/
wszystko, co musisz zrobić, to zmienić kod konsoli konsoli.log w ostatnim wierszu i nadać mu własny parametr:
źródło