Anda ingin menggunakan perintah rc elipsA
. Sayangnya untuk Anda, ini mengharuskan Anda untuk menentukan koordinat Cartesian (x, y) dari titik awal dan akhir daripada koordinat kutub (jari-jari, sudut) yang Anda miliki, sehingga Anda harus melakukan perhitungan. Inilah fungsi JavaScript yang harus berfungsi (meskipun saya belum mengujinya), dan yang saya harap cukup jelas:
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];
}
Sudut mana yang sesuai dengan posisi jam mana yang akan bergantung pada sistem koordinat; hanya menukar dan / atau meniadakan persyaratan dosa / cos yang diperlukan.
Perintah arc memiliki parameter ini:
rx, ry, x-axis-rotation, large-arc-flag, sweep-flag, x, y
Untuk contoh pertama Anda:
rx
= ry
= 25 dan x-axis-rotation
= 0, karena Anda ingin lingkaran dan bukan elips. Anda dapat menghitung koordinat awal (yang harus Anda M
hindari) dan mengakhiri koordinat (x, y) menggunakan fungsi di atas, menghasilkan (200, 175) dan sekitar (182.322, 217.678), masing-masing. Mengingat kendala-kendala ini sejauh ini, sebenarnya ada empat busur yang bisa ditarik, sehingga dua bendera memilih salah satunya. Saya kira Anda mungkin ingin menggambar busur kecil (artinya large-arc-flag
= 0), ke arah sudut yang menurun (artinya sweep-flag
= 0). Secara keseluruhan, jalur SVG adalah:
M 200 175 A 25 25 0 0 0 182.322 217.678
Untuk contoh kedua (dengan asumsi maksud Anda pergi ke arah yang sama, dan dengan demikian busur besar), jalur SVG adalah:
M 200 175 A 25 25 0 1 0 217.678 217.678
Sekali lagi, saya belum menguji ini.
(edit 2016-06-01) Jika, seperti @clocksmith, Anda bertanya-tanya mengapa mereka memilih API ini, lihatlah catatan implementasi . Mereka menggambarkan dua kemungkinan parameterisasi busur, "parameterisasi titik akhir" (yang mereka pilih), dan "parameterisasi tengah" (yang seperti apa yang digunakan pertanyaan). Dalam deskripsi "parameterisasi titik akhir" kata mereka:
Salah satu keuntungan dari parameterisasi titik akhir adalah bahwa hal itu memungkinkan sintaks jalur yang konsisten di mana semua perintah jalur berakhir dengan koordinat "titik saat ini" yang baru.
Jadi pada dasarnya itu adalah efek samping dari busur yang dianggap sebagai bagian dari jalur yang lebih besar daripada objek mereka sendiri yang terpisah. Saya kira bahwa jika renderer SVG Anda tidak lengkap, ia bisa melompati komponen path apa pun yang tidak direndernya, asalkan tahu berapa banyak argumen yang mereka ambil. Atau mungkin memungkinkan render paralel potongan yang berbeda dari jalan dengan banyak komponen. Atau mungkin mereka melakukannya untuk memastikan kesalahan pembulatan tidak menumpuk di sepanjang jalan yang rumit.
Catatan implementasi juga berguna untuk pertanyaan awal, karena mereka memiliki lebih banyak pseudocode matematis untuk mengkonversi antara dua parameterisasi (yang saya tidak sadari ketika saya pertama kali menulis jawaban ini).
arcSweep
variabel sebenarnya mengendalikanlarge-arc-flag
parameter svg A. Dalam kode di atas, nilai untuksweep-flag
parameter selalu nol.arcSweep
mungkin harus diubah namanya menjadi sesuatu sepertilongArc
.