【问题标题】:canvas jagged edges woes with lines/strokes画布锯齿状边缘的线条/笔触问题
【发布时间】:2012-02-28 23:22:03
【问题描述】:

我在画布上画线时遇到了一点问题,

基本上我希望线条美观、柔和且半透明,但画布似乎只想对最后渲染的线段进行此操作。

看看这里,你会发现最后绘制的线段很好,而且我想要它)但是随着动画的播放,之前绘制的线变得锯齿和讨厌。

我注意到,如果我使用 closepath,这不会发生,但是由于间隔/动画,我不能在每次渲染时都使用它,因为线条遍布整个地方:

http://jsfiddle.net/xSPuM/1/

任何人对如何阻止这种情况发生有任何想法,我将非常感激。

非常感谢 一个

【问题讨论】:

    标签: javascript canvas html5-canvas


    【解决方案1】:

    奇怪的代码!动画很简洁,虽然这样做的方式似乎有点独特,所以让我们来看看。

    首先要完全清楚,当你在制作路径时,你可以一遍又一遍地继续抚摸它。

    因此,如果您有一条包含三个线段 A、B、C 的路径并且您这样做了:

    A、笔画、B、笔画、C、笔画

    您将得到片段 A 被抚摸 3 次,B 被抚摸 2 次,C 被抚摸一次。

    这基本上就是你在这里所做的。

    你可以通过在路径的尽头只抚摸一次来轻松避免这种情况:

    http://jsfiddle.net/xSPuM/5/

    这会停止动画,但说明问题所在。您可以通过清除屏幕来修复动画。因此,我们将使用分段 ABC:

    A、清、笔、B、清、笔、C、清、笔

    然后你会在 A 段中划一次,屏幕被清除,然后 A-B 段被划一次,屏幕最后一次被清除,所以 A-B-C 段被划一次。这就是你想要的。

    这样做的问题是,清除屏幕意味着清除所有以前绘制的形状!见这里:

    http://jsfiddle.net/xSPuM/7/

    有几种方法可以解决这个问题:

    1. 将当前正在绘制的对象保存在临时画布上(可能比较棘手)
    2. 将之前绘制的状态保存到临时画布(不那么棘手)
    3. 跟踪这三条路径,就好像它们是一条路径一样(简单易行,我会为您完成)

    要做#3,我们要做的就是不要在每个新部分的开头调用beginPath。相反,我们一开始只调用一次beginPath,每个新部分都只是一个moveTo 操作!

    http://jsfiddle.net/xSPuM/8/

    这些信息应该足以让您走上正轨!

    【讨论】:

    • 这很酷,感谢您的帮助,但是到最后一部分时,速度似乎有很大的降低。知道是什么原因导致您的修改吗?清理和重绘?
    • 我质疑这样一个多产的解决方案/答案的唯一原因是我还必须合成大约 5 个其他绘图对象,所以它会变得相当沉重......:-)
    • 可能是这样。取出 console.log 语句应该会有所帮助:jsfiddle.net/xSPuM/11
    • 哈哈!很公平,实际上我一直在您的(非常有用的)博客上阅读此:simonsarris.com/blog/…,并认为它可能适用。
    • 这是真的,这可能会有所帮助,但只有如果您不打算积极地制作动画!例如,您可以做的一件事是我在回答中记为 #2 的原因是,出于我博客中的原因,将已经完成的画布路径(实际上是图像)缓存起来。绘制图像总是比一遍又一遍地绘制 30 个贝塞尔曲线要快!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    • 1970-01-01
    相关资源
    最近更新 更多