2011-05-17 37 views
18

我正在試圖用畫布繪製一條二次曲線。下面是代碼:
HTML:HTML5畫布反別名?

<canvas id="mycanvas"> 
    Your browser is not supported. 
</canvas> 

的JavaScript:

var canvas = document.getElementById("mycanvas"); 
canvas.style.width = "1000px"; 
canvas.style.height = "1000px"; 
if (canvas.getContext) { 
    var ctx = canvas.getContext("2d"); 
    var x = 0, 
     y = 0; 
    setInterval(function() { 
     ctx.lineTo(x, y); 
     ctx.stroke(); 
     x += 1; 
     y = 0.01 * x * x; 
    }, 100); 
} 

但結果是十分可怕的,第一,線條太粗,第二,別名是如此明顯? 。我怎麼能改進它?
您可以在這裏看到效果:http://jsfiddle.net/7wNmx/1/

回答

16

您正在做的是創建一個默認大小的畫布,300乘150,然後使用CSS將其縮放到1000 x 1000像素。但像這樣放大隻是放大像素的大小,並不會增加畫布本身的分辨率。你需要做的是設置使用widthheight屬性畫布本身的實際尺寸是什麼:

<canvas width="1000" height="1000" id="mycanvas"> 
    Your browser is not supported. 
</canvas> 

然後,你不需要通過設置canvas.style.widthheight任何更多的將其放大。

+0

優秀的答案! – wong2 2011-05-17 14:35:58

+2

它仍然不漂亮。貝塞爾曲線可能很有用(動畫會有所不同):http://www.robodesign.ro/coding/canvas-primer/20081208/example-paths.html – Rudie 2011-05-17 14:41:20

23

另一件事是,你正在撫摸每個時間。所以第一行最多,第二行少一次,等等。

這也導致它變得醜陋。你需要開始一個新的路徑和行程只有一個:

var canvas = document.getElementById("mycanvas"); 
canvas.style.width = "1000px"; 
canvas.style.height = "1000px"; 
if (canvas.getContext) { 
    var ctx = canvas.getContext("2d"); 
    var x = 0, 
     y = 0; 
    setInterval(function() { 
     ctx.beginPath(); 
     ctx.moveTo(x,y) 
     x += 1; 
     y = 0.01 * x * x; 
     ctx.lineTo(x, y); 
     ctx.stroke(); 
    }, 100); 
} 

比較:

http://i.stack.imgur.com/40M20.png

它也更快,因爲更少的圖紙完成。

+0

好建議!謝謝! – wong2 2011-05-17 14:38:48

+0

是的,這是另一個問題。接得好!在我們的兩個答案之間,它看起來好多了。 – 2011-05-17 14:45:04

+1

+1仍然有幫助的建議,甚至兩年! – TheTurkey 2013-10-21 09:54:13