


html5 Tutorial lukisan kanvas (11)—Gunakan lineTo/arc/bezierCurveTo untuk melukis kemahiran tutorial oval_html5
Dalam kanvas, anda boleh menggunakan kaedah arka untuk melukis bulatan Pada asalnya, bulatan juga boleh dianggap sebagai elips dengan lebar dan ketinggian yang sama, tetapi tidak ada cara untuk melukis elips dalam kanvas untuk mensimulasikannya.
Kita mesti terlebih dahulu menjelaskan parameter yang diperlukan untuk melukis elips Pengetahuan geometri asas memberitahu kita bahawa elips memerlukan koordinat pusat, lebar, ketinggian - atau sudut putaran, tetapi ini boleh diabaikan buat masa ini, putaran lebih mudah.
1. Gunakan lineTo untuk melukis elips
Anda membaca betul, lineTo, kaedah yang digunakan untuk melukis garis lurus, sebenarnya boleh digunakan untuk melukis elips! ? Tetapi dia memang wujud, tetapi kaedah penulisannya sungguh luar biasa:
fungsi DrawEllipse(Kanvas,O,OA,OB){
//Lukis elips, contoh: var B=New Array(150,150); ;
dengan ( Kanvas){
var x=O[0] OA; 0;i<=360 ;i ){
var ii=i*Math.PI/180;
var x=O[0] OA*Math.cos(ii); [1]-OB* Math.sin(ii);
lineTo(x,y);
}
}
}
Prinsip kaedah ini ialah bahawa bulatan mempunyai 360 darjah, Kemudian gunakan lineTo untuk menggelung 360 kali, lukis segmen garisan untuk setiap darjah, dan akhirnya sambungkannya menjadi elips. Fungsi trigonometri sinus dan kosinus diperlukan untuk pengiraan.
Perhatikan bahawa parameter kedua kaedah ini ialah tatasusunan, iaitu koordinat tengah elips
Kita hanya perlu memahami ideanya
2 Gunakan lengkok untuk melukis bulatan, dan kemudian skalakannya menjadi elips
Teks asal kaedah ini ada di sini, dan intinya. fungsi adalah seperti berikut:
Salin kod
context.translate(canvas.width / 2, canvas.height / 2); secara mendatar
context.scale( 2, 1);
// lukis bulatan yang akan diregangkan menjadi
context.beginPath();
context.arc(centerX, centerY, radius, 0 , 2 * Math.PI, false );
// pulihkan kepada keadaan asal
context.restore()
Kaedah ini menggunakan fungsi kanvas yang tidak pernah saya bincangkan sebelum ini , iaitu skala, yang boleh melaksanakan kanvas zum. Terdapat dua arah penskalaan: mendatar dan menegak Dalam kod, kanvas dibesarkan dalam arah mendatar, tetapi arah menegak kekal tidak berubah Jadi, bulatan yang dilukis dengan lengkok menjadi elips.
Kaedah ini kelihatan sangat baik pada pandangan pertama, dengan kurang kod dan prinsipnya mudah difahami. Tetapi selepas analisis, anda boleh menemui kelemahannya yang jelas, iaitu - ketidaktepatan! Sebagai contoh, saya memerlukan elips dengan lebar 171 dan ketinggian 56. Jika kita menetapkan jejari arka kepada 28, maka kita akan tertekan oleh nombor yang menyakitkan dan tidak dapat difahami 171/28/2.
Tetapi kompromi adalah dengan sentiasa menetapkan jejari arka kepada 100, dan kemudian besarkan jika tidak mencukupi, dan kecilkan jika melebihinya. Walau bagaimanapun, ia masih tidak tepat.
3, gunakan Bezier curve bezierCurveTo
Memandangkan saya merasakan kaedah penskalaan di atas tidak tepat, saya ingin mencari kaedah yang tepat untuk melukis elips, dan akhirnya menemuinya pada stackoverflow:
Salin kod
Kod adalah seperti berikut:
ctx.moveTo(x, ym);
ctx.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y); 🎜 >ctx.bezierCurveTo(xm lembu, y, xe, ym - oy, xe, ym);
ctx.bezierCurveTo(xe, ym oy, xm ox, ye, xm, ye); ( xm - ox, ye, x, ym oy, x, ym);
Kaedah ini boleh dianggap sempurna. Dia membahagikan elips kepada empat lengkung Bezier dan menyambungkannya untuk membentuk elips. Akhirnya, lebar dan tinggi adalah lebih tepat dan overhed adalah kurang.
Tetapi kaedah ini masih mempunyai kekurangan. Lihat pada parameter kappa, ia mempunyai nilai yang sangat pelik. Saya percaya ramai orang tidak faham mengapa ia perlu menjadi nilai ini sehingga pakar geometri memberitahu anda mengapa ia perlu menjadi nilai ini - saya masih tidak tahu. Dan saya mempunyai keinginan yang kuat untuk mengubahnya dan melihat apa akibatnya.
Sudah tentu, impuls saya yang serupa dengan pesakit gangguan obsesif-kompulsif tidak boleh dikatakan sebagai kelemahan kaedah ini. Saya secara peribadi merasakan bahawa elips jelas terdiri daripada dua lengkung Bezier dan bukannya empat. Idea ini akhirnya membawa saya kepada cara yang sempurna untuk melukis elips.
4, gunakan dua lengkung Bezier untuk melukis elips
Untuk memahami sama ada kaedah sebelumnya boleh dipermudahkan, saya telah mendaftarkan akaun stackoverflow untuk bertanyakan soalan soalan, saya tidak mempunyai mata yang mencukupi untuk dipindahkan, jadi saya terpaksa menggunakan bahasa Inggeris saya yang hampir tidak mencukupi untuk menjawab soalan daripada orang asing untuk mendapatkan mata. Tetapi nasib akhirnya datang dan masalah mata saya diselesaikan dengan menjawab soalan.
Soalan yang saya tanya tentang hubungan antara lengkung Bezier dan elips ada di sini
Sejujurnya, saya tidak faham kebanyakan jawapan orang asing di bawah, tetapi mujurlah dia menyediakan halaman contoh kod, yang membuatkan saya faham. . Prinsip, saya ingin mengucapkan terima kasih kepada beliau sekali lagi. Mengikut jawapan beliau, kaedah yang saya dapati untuk melukis elips adalah seperti berikut:
//Ellipse
CanvasRenderingContext2D.prototype.oval = fungsi (x, y, lebar, tinggi) {
var k = (lebar/0.75)/2,
w = lebar/ 2,
h = tinggi/2;
this.beginPath();
this.moveTo(x, y-h); , y h, x, y h );
ini.bezierCurveTo(x-k, y h, x-k, y-h, x, y-h);
Kaedah ini tepat, memerlukan kod yang lebih sedikit dan tidak mempunyai sebarang ciri pelik. Ingat ini, nisbah lebar elips kepada koordinat titik kawalan lengkung Bezier yang melukis elips adalah seperti berikut:
Titik kawalan Bezier x=(lebar elips/0.75)/2 Ini sudah dalam kod yang ditunjukkan dalam.
Anda boleh mencuba 4 kaedah di atas untuk melukis elips.

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Seni bina GPU generasi seterusnya Intel dijangka dilancarkan pada bulan September sebagai sebahagian daripada Tasik Lunar Intel. Seperti Arc Alchemist iGPU dari Meteor Lake, iGPU mempunyai sehingga 8 teras Xe, tetapi seni bina baharu dijangka mencapai prestasi 50% lebih tinggi

Pemalam anak panah kanvas termasuk: 1. Fabric.js, yang mempunyai API yang ringkas dan mudah digunakan serta boleh mencipta kesan anak panah tersuai 2. Konva.js, yang menyediakan fungsi melukis anak panah dan boleh mencipta pelbagai anak panah gaya; 3. Pixi.js , yang menyediakan fungsi pemprosesan grafik yang kaya dan boleh mencapai pelbagai kesan anak panah; ; 6. Rough .js, anda boleh membuat anak panah yang dilukis dengan tangan, dsb.

Butiran jam kanvas termasuk penampilan jam, tanda semak, jam digital, jam, minit dan jarum kedua, titik tengah, kesan animasi, gaya lain, dsb. Pengenalan terperinci: 1. Penampilan jam, anda boleh menggunakan Kanvas untuk melukis dail bulat sebagai penampilan jam, dan anda boleh menetapkan saiz, warna, jidar dan gaya dail lain. 2. Garisan skala, lukis garisan skala; dail untuk mewakili jam atau minit. 3. Jam digital, anda boleh melukis jam digital pada dail untuk menunjukkan jam dan minit semasa

Terokai rangka kerja Kanvas: Untuk memahami apakah rangka kerja Kanvas yang biasa digunakan, contoh kod khusus diperlukan Pengenalan: Kanvas ialah API lukisan yang disediakan dalam HTML5, yang melaluinya kita boleh mencapai kesan grafik dan animasi yang kaya. Untuk meningkatkan kecekapan dan kemudahan melukis, banyak pembangun telah membangunkan rangka kerja Kanvas yang berbeza. Artikel ini akan memperkenalkan beberapa rangka kerja Kanvas yang biasa digunakan dan menyediakan contoh kod khusus untuk membantu pembaca memperoleh pemahaman yang lebih mendalam tentang cara menggunakan rangka kerja ini. 1. Rangka kerja EaselJS Ea

Versi html2canvas termasuk html2canvas v0.x, html2canvas v1.x, dsb. Pengenalan terperinci: 1. html2canvas v0.x, yang merupakan versi awal html2canvas Versi stabil terkini ialah v0.5.0-alpha1. Ia adalah versi matang yang telah digunakan secara meluas dan disahkan dalam banyak projek;

Cara menggunakan kanvas untuk melukis carta dan kesan animasi dalam uniapp memerlukan contoh kod khusus 1. Pengenalan Dengan populariti peranti mudah alih, semakin banyak aplikasi perlu memaparkan pelbagai carta dan kesan animasi pada terminal mudah alih. Sebagai rangka kerja pembangunan merentas platform berdasarkan Vue.js, uniapp menyediakan keupayaan untuk menggunakan kanvas untuk melukis carta dan kesan animasi. Artikel ini akan memperkenalkan cara uniapp menggunakan kanvas untuk mencapai kesan carta dan animasi serta memberikan contoh kod khusus. 2. kanvas

Atribut kanvas tkinter termasuk bg, bd, relief, lebar, ketinggian, kursor, latar belakang sorotan, warna sorotan, ketebalan sorotan, latar belakang sisipan, lebar sisipan, latar belakang pilih, latar belakang pilih, atribut perintah xscroll, dsb. Pengenalan terperinci

Fahami kuasa dan aplikasi kanvas dalam pembangunan permainan Gambaran Keseluruhan: Dengan perkembangan pesat teknologi Internet, permainan web menjadi semakin popular di kalangan pemain. Sebagai bahagian penting dalam pembangunan permainan web, teknologi kanvas telah muncul secara beransur-ansur dalam pembangunan permainan, menunjukkan kuasa dan aplikasinya yang berkuasa. Artikel ini akan memperkenalkan potensi kanvas dalam pembangunan permainan dan menunjukkan aplikasinya melalui contoh kod tertentu. 1. Pengenalan kepada teknologi kanvas Kanvas ialah elemen baharu dalam HTML5, yang membolehkan kami menggunakan
