Ikhtisar Kanvas dalam HTML5 tidak secara langsung menyediakan kaedah untuk melukis elips Berikut ialah ringkasan beberapa kaedah lukisan. Setiap kaedah mempunyai kelebihan dan kekurangannya sendiri, yang harus dipilih mengikut situasi. Parameter bagi setiap kaedah adalah sama:
konteks ialah objek persekitaran lukisan 2D Kanvas,
x ialah absis pusat elips,
y ialah ordinat pusat elips,
a ialah panjang separuh paksi melintang elips,
b ialah panjang separuh paksi membujur elips.
Kaedah persamaan parametrik Kaedah ini menggunakan persamaan parametrik elips untuk melukis elips
//----------Gunakan persamaan parametrik untuk melukis elips---------- ------ -----
//Parameter x dan y fungsi ialah pusat elips a, b ialah separuh paksi melintang dan panjang separuh paksi menegak bagi elips masing-masing, yang tidak boleh 0 pada masa yang sama
//Ini Kelemahan kaedah ialah apabila linWidth lebih lebar dan elips lebih rata
//Hujung paksi panjang di dalam elips lebih tajam, bukan lancar dan kecekapannya rendah
fungsi ParamEllipse(konteks, x, y, a, b)
{
//maks bersamaan dengan 1 dibahagikan dengan nilai paksi utama yang lebih besar a dan b
//i meningkat sebanyak 1/maks setiap gelung, menunjukkan peningkatan dalam darjah
//Ini berfungsi Jadikan laluan (arka) yang dilukis dalam setiap kitaran hampir kepada 1 piksel
var step = (a > ; b) ? 1 / a : 1 / b;
konteks.beginPath(); i = 0; i < 2 * Math.PI; i = step)
{
//Persamaan parametrik ialah x = a * cos(i), y = b * sin(i),
//Parameter ialah i, menunjukkan darjah (radian)
context.lineTo(x a * Math.cos(i), y b * Math.sin(i)); );
context.stroke();
};
Kaedah mampatan seragam
Kaedah ini menggunakan prinsip mampatan seragam dalam matematik untuk memampatkan secara seragam bulatan menjadi elips Secara teorinya, elips standard boleh diperolehi Kod berikut akan menyebabkan masalah lebar garisan yang tidak konsisten. Lihat 5 untuk penyelesaiannya.
Salin kod
//Tepi elips yang dilukis dengan kaedah ini lebih tebal kerana ia lebih dekat dengan hujung paksi panjang , dan lebar garisan di hujung paksi panjang ialah nilai normal
//Sisi Semakin dekat dengan paksi kecil, semakin rata dan nipis elips itu, malah ketakselanjaran, yang merupakan hasil skala
//Kekurangan ini kadangkala merupakan kelebihan, seperti apabila menyatakan kesan tiga dimensi gelang (halo planet)
//Untuk kes di mana parameter a atau b ialah 0, kaedah ini tidak boleh digunakan
fungsi EvenCompEllipse(konteks, x, y, a, b)
{
context.save();
//Pilih yang lebih besar daripada a dan b sebagai parameter jejari kaedah arka
var r = (a > b) ? a : b;
nisbah varX = a / r; context.scale(ratioX, ratioY); //scaling (mampatan seragam)
context.beginPath();
// Lukis lawan jam bermula dari titik akhir kiri elips
context.moveTo((x a) / ratioX, y / ratioY);
context.arc(x / ratioX, y / ratioY, r, 0, 2 * Math. PI
context.closePath(); );
context.restore();
};
kaedah lengkung Bezier Er padu 1
Lengkung Bezier kubik melukis elips lukisan, dan ia juga merupakan anggaran dalam teori. Tetapi kerana kecekapannya yang tinggi, ia sering digunakan untuk melukis elips dalam grafik vektor komputer, tetapi saya tidak begitu jelas tentang teori tertentu. Tahap penghampiran terletak pada pemilihan kedudukan dua titik kawalan. Kedudukan titik kawalan kaedah ini diperolehi oleh percubaan saya sendiri, dan ketepatannya adalah okey. Kodnya adalah seperti berikut:
//---------Gunakan lengkung Bezier kubik untuk mensimulasikan elips 1---------------- -----
//Kaedah ini juga akan menghasilkan fenomena apabila garis Lebar lebih lebar dan elips lebih rata,
//hujung paksi panjang lebih tajam dan tidak licin
fungsi BezierEllipse1(konteks , x, y, a, b ) {
//Kunci ialah tetapan dua titik kawalan dalam bezierCurveTo
//0.5 dan 0.6 ialah dua pekali kunci (diperolehi daripada eksperimen dalam fungsi ini )
var lembu = 0.5 * a,