Pertanyaan pendek: dengan menggunakan jalur SVG, kita bisa menggambar 99,99% dari sebuah lingkaran dan itu muncul, tetapi ketika itu 99,99999999% dari sebuah lingkaran, maka lingkaran itu tidak akan muncul. Bagaimana bisa diperbaiki?
Jalur SVG berikut dapat menggambar 99,99% dari lingkaran: (coba di http://jsfiddle.net/DFhUF/1381/ dan lihat apakah Anda melihat 4 busur atau hanya 2 busur, tetapi perhatikan bahwa jika itu adalah IE, itu adalah diberikan dalam VML, bukan SVG, tetapi memiliki masalah serupa)
M 100 100 a 50 50 0 1 0 0.00001 0
Tetapi ketika 99,99999999% lingkaran, maka tidak ada yang menunjukkan sama sekali?
M 100 100 a 50 50 0 1 0 0.00000001 0
Dan itu sama dengan 100% lingkaran (itu masih busur, bukan, hanya busur yang sangat lengkap)
M 100 100 a 50 50 0 1 0 0 0
Bagaimana itu bisa diperbaiki? Alasannya adalah saya menggunakan fungsi untuk menggambar persentase busur, dan jika saya perlu "kasus khusus" busur 99,9999% atau 100% untuk menggunakan fungsi lingkaran, itu akan agak konyol.
Sekali lagi, kasus uji pada jsfiddle menggunakan RaphaelJS ada di http://jsfiddle.net/DFhUF/1381/
(dan jika itu VML di IE 8, bahkan lingkaran kedua tidak akan menunjukkan ... Anda harus mengubahnya ke 0,01)
Memperbarui:
Ini karena saya membuat busur untuk skor di sistem kami, jadi 3,3 poin mendapatkan 1/3 lingkaran. 0,5 mendapat setengah lingkaran, dan 9,9 poin mendapatkan 99% lingkaran. Tetapi bagaimana jika ada skor yang 9,99 dalam sistem kami? Apakah saya harus memeriksa apakah dekat dengan 99,999% lingkaran, dan menggunakan arc
fungsi atau circle
fungsi yang sesuai? Lalu bagaimana dengan skor 9,9987? Yang mana yang akan digunakan? Sangat konyol untuk mengetahui skor seperti apa yang akan dipetakan ke "lingkaran terlalu lengkap" dan beralih ke fungsi lingkaran, dan ketika itu "99,9%" lingkaran atau skor 9,9987, maka gunakan fungsi busur .
Jawaban:
Sama untuk busur XAML. Cukup tutup busur 99,99% dengan
Z
dan Anda punya lingkaran!sumber
z
di akhir dan selesai. Anda mungkin harus menghapus nol, misalnya di Chrome terbaru yang harus saya tulis0.0001
untuk membuatnya berfungsi. Jika Anda mencari tempat untuk meletakkan string path, lihat Paths di MDN .Saya tahu ini agak terlambat dalam permainan, tetapi saya ingat pertanyaan ini sejak masih baru dan saya memiliki dillemma yang sama, dan saya tidak sengaja menemukan solusi "benar", jika ada yang masih mencari satu:
Dengan kata lain, ini:
dapat dicapai sebagai jalur dengan ini:
Triknya adalah memiliki dua busur, yang kedua mengambil tempat yang pertama ditinggalkan dan menggunakan diameter negatif untuk kembali ke titik awal busur asli.
Alasan itu tidak dapat dilakukan sebagai lingkaran penuh dalam satu busur (dan saya hanya berspekulasi) adalah karena Anda akan menyuruhnya untuk menggambar busur dari dirinya sendiri (misalkan 150.150) ke dirinya sendiri (150.150), yang dibuatnya sebagai "oh, aku sudah ada di sana, tidak perlu busur!".
Manfaat dari solusi yang saya tawarkan adalah:
Tak satu pun dari ini akan menjadi masalah jika mereka hanya mengizinkan textpath untuk menerima bentuk. Tapi saya pikir mereka menghindari solusi itu karena elemen bentuk seperti lingkaran secara teknis tidak memiliki titik "awal".
demo jsfiddle: http://jsfiddle.net/crazytonyi/mNt2g/
Memperbarui:
Jika Anda menggunakan path untuk
textPath
referensi dan Anda ingin teks untuk di-render di tepi luar arc, Anda akan menggunakan metode yang sama persis tetapi mengubah flag-sweep dari 0 ke 1 sehingga memperlakukan bagian luar dari jalanlah sebagai permukaan alih-alih bagian dalam (anggap1,0
sebagai seseorang yang duduk di tengah dan menggambar lingkaran di sekitar diri mereka sendiri, sementara1,1
sebagai seseorang berjalan di sekitar pusat pada jarak radius dan menyeret kapur mereka di samping mereka, jika itu bisa membantu). Berikut adalah kode seperti di atas tetapi dengan perubahan:sumber
Mengacu pada solusi Anthony, berikut adalah fungsi untuk mendapatkan jalur:
sumber
Pendekatan yang sama sekali berbeda:
Alih-alih mengutak-atik path untuk menentukan arc di svg, Anda juga bisa mengambil elemen lingkaran dan menentukan stroke-dasharray, dalam kode pseudo:
Kesederhanaannya adalah keunggulan utama dibandingkan metode jalur-busur-ganda (mis. Saat membuat skrip, Anda hanya memasukkan satu nilai dan Anda selesai untuk panjang busur apa pun)
Busur dimulai pada titik paling kanan, dan dapat digeser menggunakan rotate transform.
Catatan: Firefox memiliki bug aneh di mana rotasi lebih dari 90 derajat atau lebih diabaikan. Jadi untuk memulai lengkungan dari atas, gunakan:
sumber
stroke-dasharray="0 10cm 5cm 1000cm"
dimungkinkan untuk menghindari transformasiAdobe Illustrator menggunakan kurva bezier seperti SVG, dan untuk lingkaran itu menciptakan empat poin. Anda dapat membuat lingkaran dengan dua perintah busur elips ... tapi kemudian untuk lingkaran di SVG saya akan menggunakan
<circle />
:)sumber
circle
, silakan lihat Pembaruan dalam pertanyaan.arc
untuk membuat lingkaran penuh dengan menggunakan busur kiri dan busur kanan? Jadi arc tidak dapat menggambar lingkaran lengkap ... untuk melakukannya duaarc
jalur diperlukanIde bagus menggunakan perintah dua busur untuk menggambar lingkaran penuh.
biasanya, saya menggunakan elemen elips atau lingkaran untuk menggambar lingkaran penuh.
sumber
Membangun berdasarkan jawaban Anthony dan Anton, saya memasukkan kemampuan untuk memutar lingkaran yang dihasilkan tanpa memengaruhi keseluruhan penampilannya. Ini berguna jika Anda menggunakan jalur untuk animasi dan Anda perlu mengontrol dari mana ia dimulai.
sumber
Bagi mereka seperti saya yang mencari atribut elips untuk konversi jalur:
sumber
Ditulis sebagai fungsi, tampilannya seperti ini:
sumber
<circle>
, Anda harus mengubah arah ke Timur, Selatan, Barat, Utara:"M" + cx + "," + cy + "m" + (r) + ",0" + "a" + r + "," + r + " 0 1,1 " + (-r * 2) + ",0" + "a" + r + "," + r + " 0 1,1 " + (r * 2) + ",0"
Keuntungannya adalahstroke-dashoffset
danstartOffset
sekarang bekerja dengan cara yang sama.Jawaban ini terlalu rumit.
Cara sederhana untuk melakukan ini tanpa membuat dua lengkok atau mengonversi ke sistem koordinat yang berbeda ..
Ini mengasumsikan area kanvas Anda memiliki lebar
w
dan tinggih
.Cukup gunakan bendera "busur panjang", sehingga bendera penuh terisi. Kemudian buatlah busur 99,9999% lingkaran penuh. Secara visual itu sama. Hindari bendera sapuan dengan hanya memulai lingkaran di titik paling kanan dalam lingkaran (satu jari-jari horizontal langsung dari pusat)
sumber
Cara lain adalah dengan menggunakan dua Kurva Bezier Kubik. Itu untuk iOS yang menggunakan pocketSVG yang tidak mengenali parameter arc svg.
C x1 y1, x2 y2, xy (atau c dx1 dy1, dx2 dy2, dx dy)
Set koordinat terakhir di sini (x, y) adalah di mana Anda ingin mengakhiri garis. Dua lainnya adalah titik kontrol. (x1, y1) adalah titik kontrol untuk awal kurva Anda, dan (x2, y2) untuk titik akhir kurva Anda.
sumber
Saya membuat jsfiddle untuk melakukannya di sini:
tautan
yang perlu Anda lakukan adalah mengubah input dari console.log dan mendapatkan hasilnya di console
sumber