अपडेट:
- स्केलिंग विधि स्ट्रोक चौड़ाई की उपस्थिति को प्रभावित कर सकती है
- स्केलिंग विधि सही तरीके से करने पर स्ट्रोक की चौड़ाई बरकरार रह सकती है
- कैनवास में दीर्घवृत्त विधि है जो क्रोम अब समर्थन करता है
- JSBin में अद्यतन परीक्षण जोड़े गए
JSBin परीक्षण उदाहरण (तुलना के लिए अन्य के जवाबों का परीक्षण करने के लिए अद्यतन)
- बेज़ियर - ऊपरी बाएँ पर आधारित ड्रॉ जिसमें आयत और चौड़ाई / ऊँचाई होती है
- केंद्र के साथ बेजियर - केंद्र और चौड़ाई / ऊंचाई के आधार पर ड्रा
- आर्च और स्केलिंग - ड्राइंग सर्कल और स्केलिंग के आधार पर ड्रा
- द्विघात वक्र - चतुर्भुज के साथ ड्रा
- प्रतीत होता है कि परीक्षण काफी समान नहीं है, कार्यान्वयन हो सकता है
- देखें ऑयोपेंट का जवाब
- कैनवस इलिप्स - W3C मानक दीर्घवृत्त () विधि का उपयोग करना
- प्रतीत होता है कि परीक्षण काफी समान नहीं है, कार्यान्वयन हो सकता है
- देखिए लोकतर का जवाब
मूल:
यदि आप एक सममित अंडाकार चाहते हैं, तो आप हमेशा त्रिज्या चौड़ाई का एक चक्र बना सकते हैं, और फिर इसे उस ऊँचाई तक माप सकते हैं जिसे आप चाहते हैं ( संपादित करें: यह नोटिस स्ट्रोक की चौड़ाई को प्रभावित करेगा - एकडामेली का उत्तर देखें), लेकिन यदि आप दीर्घवृत्त का पूर्ण नियंत्रण चाहते हैं यहाँ 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>