【问题标题】:Draw a Line with Pen Tool on Canvas Smothly without Having to Redraw All Other Lines用钢笔工具在画布上流畅地画一条线,而不必撤回所有其他线
【发布时间】:2012-12-28 00:13:32
【问题描述】:

有没有办法避免重绘画布上的所有元素(这样我就不必跟踪所有内容),同时仍然对当前绘制的线条有流畅的绘图体验?

【问题讨论】:

  • 我正在尝试将画布用于绘图应用程序。已经获得了鼠标位置,但结果(如您所料)非常前卫。我正在尝试平滑最后一行,而不需要从头开始每帧重新绘制它。也许是一种计算每帧添加的更平滑版本的方法...
  • @x3ro 如果您亲身体验过这个问题,您就会知道这实际上是一个非常好的问题,隐藏在有些糟糕的措辞后面。在您投票结束问题之前做出努力通常会受到赞赏。如果您愿意提供帮助,我已尝试改进措辞...
  • @iwein:我认为每个发布 SO 问题的人都应该努力写一个像样的问题。在上面的内容中,例如,他所读内容的链接,以及他已经编写的一些代码示例。此外,第一段陈述,第二段提出问题,但我真的看不出它们之间的直接联系(真的,一个可能能够插值,但仍然)。为什么一个糟糕的问题要在遇到理解它的人出现的情况下保持开放?为什么不强制 OP 重新措辞呢?
  • @x3ro 这不是一个糟糕的问题,而是措辞不当。强迫 OP 修复它比自己修复它的效果要差得多。
  • @Zettam 你能提供几个背景材料的链接吗?

标签: javascript html html5-canvas


【解决方案1】:

这个一个很好的问题,但它的措辞含糊。以后的措辞问题请多加注意。

通常在绘制平滑线时,您需要从头重新绘制线条

您不需要从头开始重绘所有内容,因为您应该遵循以下操作:

  1. 将当前画布保存到内存中的画布
  2. 开始画新线
  3. 在绘画时,您会不断地:
    • 清除画布
    • 从内存中的画布绘制到主画布上
    • 到目前为止画线
  4. 当行结束时,您将新画布保存到内存中的画布并重复此过程

您需要跟踪的唯一行(就点而言)是“当前”行。所有旧行都通过内存画布保存到位图中。

这是我很久以前做的一个例子,专门处理平滑线。代码组织很奇怪,因为我从别人的代码开始,但它应该给你基本的想法:

http://jsfiddle.net/NWBV4/10/

上面描述的绘图部分在mousemove中可以看到:

this.mousemove = function(ev) {
    if (tool.started) {
        context.clearRect(0, 0, 300, 300);
        // put back the saved content
        context.drawImage(memCanvas, 0, 0);
        tool.points.push({
            x: ev._x,
            y: ev._y
        });
        drawPoints(context, tool.points);
    }
};

【讨论】:

  • 感谢您的回复...我理解这个问题,这正是我问这个问题的原因(重新绘制问题)。关于您的小提琴和解释的一个小问题:“绘图从内存画布到主画布” - 为什么我们需要不断将临时画布重绘到现有画布上?
  • 因为我们每次都要清除画布。所以临时画布代表所有已经绘制的线条,我们必须在绘制最新线条之前将它们“放回”到画布上
  • 我完全同意这个答案,但我想说您也可以使用图像在画布上绘制。你有点放松了自己绘制形状的“控制”,但对我来说它似乎更有效(当你点击画布进行绘制时没有延迟),这取决于你的应用程序的真正用途。这是我的 - 不是真的 - 类似问题的链接(查看我的问题中的 EDIT 部分):stackoverflow.com/questions/10122553/… 您可以替换图像以获得您真正想要的结果
  • 这也很好,谢谢。。尽管它不是我想要的东西,但它对于我正在开发的应用程序的其他部分可能仍然有用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-12
  • 1970-01-01
  • 2013-09-21
  • 2017-04-02
相关资源
最近更新 更多