【发布时间】:2010-12-28 21:21:50
【问题描述】:
简要背景:我正在开发一个基于 Web 的绘图应用程序,我正在实施的工具之一是 1 像素厚的铅笔。该工具允许用户在画布上绘制 1px 的别名线。
为了确定用户在画布上绘制的位置,会监视鼠标坐标。如果 mouse1 被按住,光标所在的像素将会改变。本质上它就像 Photoshop 中的铅笔工具一样工作。
注意:Bresenham 的算法不适用于这种情况。我的输入是实时提交的,所以我没有画一条从 P0 到 P1 的线,因为 P0 和 P1 之间的距离很多像素。一般来说,P1 是 P0 的邻居。
我遇到的问题是我得到的线条没有完全干净的 1px 粗细。这是一个例子:
请注意,两条线都是手绘的,因此存在一些差异。有趣的是,Photoshop 能够对我绘制的线条进行更清晰的 1px 表示。我的线看起来更脏的原因是这样的:
在我的应用程序中使用该工具绘图时,红色像素被填充。在 Photoshop 中,红色像素未被填充。这是有道理的,因为为了从给定像素移动到它的东南部邻居,无论是东邻还是南邻,都可能会被忽略。光标将恰好越过角落进入东南邻域的可能性非常小,从而避免绘制红色像素,但这通常不会发生。
所以,我剩下的问题是 Photoshop 如何能够跳过出现在我的线条中的红色像素。我唯一能想到的就是等到两个像素排队后再绘制它们中的任何一个,这样我就会知道是否传递了“角落邻居”。在这种情况下,我不会绘制两个像素中的第一个,因为它相当于我图中的一个红色像素。如果用户绘制一个像素,将光标向南移动一个像素,然后向东移动一个像素,这将存在未绘制预期像素的风险。两个像素都应该被绘制,但算法会说不然。
有什么想法吗? Photoshop 会如何处理这个问题?
【问题讨论】:
-
快速移动鼠标会发生什么?它会跳过像素吗?
-
@Hans Passant 是的,当快速绘制时,我得到的线条类似于 Photoshop 生成的线条。奇怪的是,您不必在 Photoshop 中快速绘制即可跳过那些不需要的像素。
-
它将鼠标点存储在折线中。当它可以简单地扩展前一个段时,它不会向其中添加新段。
-
@Hans Passant 我不确定我是否完全遵循。如果我画一条穿过 (50,50)、(50,51) 和 (51,51) 的线,理想的结果将是跳过 (50,51),因为我正在向下移动到 (51,51)。但是折线中的点会说这条线应该穿过 (50,51)...?
标签: algorithm graphics drawing paint