Diberi lingkaran berpusat di (200.200), jari-jari 25, bagaimana cara menggambar busur dari 270 derajat ke 135 derajat dan satu yang bergerak dari 270 ke 45 derajat?
0 derajat berarti tepat di sumbu x (sisi kanan) (artinya adalah posisi jam 3 ') 270 derajat berarti posisi jam 12, dan 90 berarti posisi jam 6
Secara umum, apa yang dimaksud dengan jalur busur untuk bagian lingkaran
x, y, r, d1, d2, direction
berarti
center (x,y), radius r, degree_start, degree_end, direction
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
.endAngle - 0.0001
jika tidak, busur penuh tidak akan diberikan.Anda ingin menggunakan perintah rc elips
A
. 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: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:
Untuk contoh pertama Anda:
rx
=ry
= 25 danx-axis-rotation
= 0, karena Anda ingin lingkaran dan bukan elips. Anda dapat menghitung koordinat awal (yang harus AndaM
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 (artinyalarge-arc-flag
= 0), ke arah sudut yang menurun (artinyasweep-flag
= 0). Secara keseluruhan, jalur SVG adalah:Untuk contoh kedua (dengan asumsi maksud Anda pergi ke arah yang sama, dan dengan demikian busur besar), jalur SVG adalah:
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:
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).
sumber
large-arc-flag
harus diubah dari 0 ke 1 dapat menimbulkan bug.Saya sedikit mengubah jawaban opsb dan mengisi dukungan untuk sektor lingkaran. http://codepen.io/anon/pen/AkoGx
JS
HTML
sumber
centerX
,centerY
menjadi 100 misalnya.viewBox="0 0 500 500"
Ini adalah pertanyaan lama, tetapi saya menemukan kode yang berguna dan menyelamatkan saya tiga menit berpikir :) Jadi saya menambahkan ekspansi kecil ke jawaban @opsb .
Jika Anda ingin mengonversi busur ini menjadi slice (untuk memungkinkan diisi) kami dapat sedikit mengubah kode:
dan di sana kamu pergi!
sumber
Jawaban @ opsb rapi, tetapi titik pusatnya tidak akurat, apalagi, seperti yang dicatat oleh @Jithin, jika sudutnya 360, maka tidak ada yang ditarik sama sekali.
@Jithin memperbaiki masalah 360, tetapi jika Anda memilih kurang dari 360 derajat, maka Anda akan mendapatkan garis yang menutup loop arc, yang tidak diperlukan.
Saya memperbaikinya, dan menambahkan beberapa animasi dalam kode di bawah ini:
sumber
Saya ingin mengomentari jawaban @Ahtenus, khususnya pada komentar Ray Hulha mengatakan codepen tidak menunjukkan busur, tetapi reputasi saya tidak cukup tinggi.
Alasan untuk codepen ini tidak berfungsi adalah karena htmlnya salah dengan lebar stroke nol.
Saya memperbaikinya dan menambahkan contoh kedua di sini: http://codepen.io/AnotherLinuxUser/pen/QEJmkN .
Html:
CSS yang relevan:
Javascript:
sumber
Gambar dan beberapa Python
Hanya untuk memperjelas dan menawarkan solusi lain. Perintah
Arc
[A
] menggunakan posisi saat ini sebagai titik awal sehingga Anda harus menggunakanMoveto
perintah [M] terlebih dahulu.Maka parameternya
Arc
adalah sebagai berikut:Jika kita mendefinisikan misalnya file svg berikut:
Anda akan mengatur titik dimulai dengan
M
titik berakhir dengan parameterxf
danyf
dariA
.Kami mencari lingkaran sehingga kami menyetel
rx
sama denganry
melakukannya pada dasarnya sekarang ia akan mencoba menemukan semua lingkaran jarirx
- jari yang memotong titik awal dan titik akhir.Anda dapat memiliki penjelasan lebih rinci dalam posting ini yang saya tulis.
sumber
Catatan untuk para pencari jawaban (siapa saya juga) - jika menggunakan busur tidak wajib , solusi yang jauh lebih sederhana untuk menggambar bagian-lingkaran adalah dengan menggunakan
stroke-dasharray
SVG<circle>
.Bagi array dasbor menjadi dua elemen, dan skala jangkauannya ke sudut yang diinginkan. Sudut awal dapat disesuaikan menggunakan
stroke-dashoffset
.Tidak ada satu pun kosinus yang terlihat.
Contoh lengkap dengan penjelasan: https://codepen.io/mjurczyk/pen/wvBKOvP
sumber
Fungsi asli polarToCartesian oleh wdebeaum benar:
Membalikkan titik awal dan akhir dengan menggunakan:
Membingungkan (bagi saya) karena ini akan membalikkan sweep-flag. Menggunakan:
dengan sweep-flag = "0" draw "normal" arc counter-clock-wise, yang saya pikir lebih lurus ke depan. Lihat https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths
sumber
Sedikit modifikasi pada jawaban @ opsb. Kami tidak dapat menggambar lingkaran penuh dengan metode ini. yaitu Jika kita memberi (0, 360) itu tidak akan menarik apa pun. Jadi sedikit modifikasi dilakukan untuk memperbaikinya. Mungkin bermanfaat untuk menampilkan skor yang terkadang mencapai 100%.
sumber
Versi ES6:
sumber
const d = `M ${start.x} ${start.y} A ${radius} ${radius} 0 ${largeArc} 0 ${end.x} ${end.y}`
Komponen ReactJS berdasarkan jawaban yang dipilih:
sumber
Anda dapat menggunakan kode JSFiddle yang saya buat untuk jawaban di atas:
https://jsfiddle.net/tyw6nfee/
yang perlu Anda lakukan adalah mengubah kode console.log baris terakhir dan berikan parameter Anda sendiri:
sumber