cập nhật:
- phương pháp chia tỷ lệ có thể ảnh hưởng đến sự xuất hiện chiều rộng của nét vẽ
- phương pháp chia tỷ lệ được thực hiện đúng có thể giữ nguyên chiều rộng nét vẽ
- canvas có phương thức ellipse mà Chrome hiện hỗ trợ
- đã thêm các thử nghiệm cập nhật vào JSBin
Ví dụ kiểm tra JSBin (được cập nhật để kiểm tra câu trả lời của người khác để so sánh)
- Bezier - vẽ dựa trên phía trên bên trái có chứa trực tràng và chiều rộng / chiều cao
- Bezier with Center - vẽ dựa trên tâm và chiều rộng / chiều cao
- Cung và Chia tỷ lệ - vẽ dựa trên vẽ vòng tròn và chia tỷ lệ
- Đường cong bậc hai - vẽ bằng phép toán bậc hai
- kiểm tra dường như không vẽ hoàn toàn giống nhau, có thể đang thực hiện
- xem câu trả lời của oyophant
- Canvas Ellipse - sử dụng phương thức ellipse () tiêu chuẩn W3C
- kiểm tra dường như không vẽ hoàn toàn giống nhau, có thể đang thực hiện
- xem câu trả lời của Loktar
Nguyên:
Nếu bạn muốn một hình bầu dục đối xứng, bạn luôn có thể tạo một hình tròn có chiều rộng bán kính, sau đó chia tỷ lệ nó theo chiều cao bạn muốn ( chỉnh sửa: lưu ý điều này sẽ ảnh hưởng đến sự xuất hiện của chiều rộng nét - xem câu trả lời của acdameli), nhưng nếu bạn muốn toàn quyền kiểm soát hình elip đây là một cách sử dụng các đường cong bezier.
<canvas id="thecanvas" width="400" height="400"></canvas>
<script>
var canvas = document.getElementById('thecanvas');
if(canvas.getContext)
{
var ctx = canvas.getContext('2d');
drawEllipse(ctx, 10, 10, 100, 60);
drawEllipseByCenter(ctx, 60,40,20,10);
}
function drawEllipseByCenter(ctx, cx, cy, w, h) {
drawEllipse(ctx, cx - w/2.0, cy - h/2.0, w, h);
}
function drawEllipse(ctx, x, y, w, h) {
var kappa = .5522848,
ox = (w / 2) * kappa,
oy = (h / 2) * kappa,
xe = x + w,
ye = y + h,
xm = x + w / 2,
ym = y + h / 2;
ctx.beginPath();
ctx.moveTo(x, ym);
ctx.bezierCurveTo(x, ym - oy, xm - ox, y, xm, y);
ctx.bezierCurveTo(xm + ox, y, xe, ym - oy, xe, ym);
ctx.bezierCurveTo(xe, ym + oy, xm + ox, ye, xm, ye);
ctx.bezierCurveTo(xm - ox, ye, x, ym + oy, x, ym);
ctx.stroke();
}
</script>