【问题标题】:Canvas: When animating the drawing of a circle, how to avoid gaps between line segments?Canvas:绘制圆形动画时,如何避免线段之间的间隙?
【发布时间】:2012-06-02 11:18:05
【问题描述】:

我正在尝试为正在绘制的圆圈设置动画 - 这是我正在做的简化版本:

http://jsfiddle.net/DQz37/1/

问题是:我在每个线段之间有轻微的线条/失真。像这样:

我正在处理的限制是:

  • 我需要在同一个画布上渲染多个圆圈,有时圆圈会重叠
  • 我需要使用透明度/rgba 着色来渲染圆圈
  • 我需要对圆圈的渲染进行动画处理(使它们看起来像正在绘制)

这是一个常见问题吗?这种事情你是怎么处理的?

【问题讨论】:

  • 看起来您在每个片段中都偏离了一个像素。也许改变你的算法,让每个部分重叠?
  • 也试过了...如果您使用的是不透明的笔触样式,您基本上会得到相反的效果 - 段重叠的较暗的带。

标签: javascript html canvas html5-canvas


【解决方案1】:

解决此问题的一种简单方法是始终绘制一条路径,这样您就可以保证它们连接良好。

所以不是从 A 到 B,然后 B 到 C,然后 C 到 D,而是从 A 到 B,清除画布,从 A 到 C,清除画布,从A到D的弧线等

这里以修改后的代码位为例:

http://jsfiddle.net/ZV7rv/


编辑:回应评论,这是如何在使用画布缓冲区保持与以前画布相同的状态时实现相同的事情:

http://jsfiddle.net/7vVBC/

【讨论】:

  • 是的。试过这条路线。问题是:我在绘制其他对象时无法清除画布。我想我可以捕捉画布的状态并在绘制下一个圆圈时恢复……但这似乎……有点疯狂? @_@
  • 这其实很正常。今晚晚些时候,我可以向您展示一些简单有效的方法。
  • 好的,今晚晚些时候! :D 我在答案中添加了一个画布缓冲区示例,请参阅编辑。
【解决方案2】:

基本上,您想要组合两条路径并将它们完美地连接起来,没有任何接缝,但这不会奏效,或者如果您真的很幸运并且它可以在一个浏览器中运行,那么它可能无法在另一个浏览器中运行。这是因为抗锯齿算法的实现并不完全相同,甚至可能经过硬件加速并传递给显卡。

提示:it's not possible to disable antialiasing.

作为一名程序员,你不断地遇到各种不容易做或不方便的问题,这时你需要退后一步,重新评估你的选择。这是其中之一。

在您指定的约束中,您唯一的选择是重绘每一帧上的所有内容,或者不使用 alpha,并稍微重叠段以确保您没有因为抗锯齿而有空格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多