Javascript画布绘图问题

时间:2010-08-28 20:05:58

标签: javascript html5 canvas

所以我有一堆javascript来制作一些随机点,然后通过最小生成树连接它们。一切正常。

之后,它将点和路径绘制到画布上;它绘制了这样的图像:

First example

- 每次随机生成。

我遇到的问题是,我希望每个圆圈都是一个带有黄色轮廓的黑色圆圈。圆圈的绘制方式如下:

context.fillStyle = "#ffff00";
for(var i = 0; i < syscount; i++){
    context.moveTo(systemsX[i],systemsY[i]);
    context.arc(systemsX[i],systemsY[i],4,0,Math.PI*2,true);
}
context.fill();

并且工作正常,但我想绘制一个黑色圆圈,并有一个黄色的痕迹。我想这样做,因为它比停止加入点的线要比通常更早停止几个像素容易得多。

这是我的尝试:

context.fillStyle = "#000000";
for(var i = 0; i < syscount; i++){
    context.moveTo(systemsX[i],systemsY[i]);
    context.arc(systemsX[i],systemsY[i],ssize,0,Math.PI*2,true);
}
context.fill();

context.strokeStyle = "#ffff00";
for(var i = 0; i < syscount; i++){
    context.moveTo(systemsX[i]+ssize,systemsY[i]);
    context.arc(systemsX[i],systemsY[i],ssize,0,Math.PI*2,true);
}
context.stroke();

但它得出了这个:

Second example

?!它重写在另一条路径上。为什么呢?!

页面的Zip:http://rapidshare.com/files/415710231/page.zip(zip文件中的html文件和css文件)。用于绘制圆圈的代码片段从第164行开始。

1 个答案:

答案 0 :(得分:2)

在绘制每个部分以清除路径之前,您需要调用context.beginPath()stroke()fill()保留了路径,因此您在每一步都重新绘制线条。

您还可以利用粘贴的路径,并重复使用填充的黑色圆圈和轮廓的路径。它避免了代码重复,应该稍快一些。代码如下所示:

// Clear out the existing path and start a new one
context.beginPath();

// Add the circles to the newly-created path
for(var i = 0; i < syscount; i++){
    context.moveTo(systemsX[i]+ssize,systemsY[i]);
    context.arc(systemsX[i],systemsY[i],ssize,0,Math.PI*2,true);
}

// Fill them in with black
context.fillStyle = "#000000";
context.fill();

// Draw the outline with yellow
context.strokeStyle = "#ffff00";
context.stroke();