1

请看(抱歉,新用户不能直接在帖子中插入图片)。线条是半透明的颜色(alpha = 0.5)。当红线与自身相交时,不会出现双重叠加半透明颜色。同时,将叠加在红色上的绿色线分开。可以得出结论,画布上绘制的线条不是线性的,以及整个区域。我认为这是不正确的行为。

现场演示:jsfiddle.net/dom1n1k/xb2AY/

我不会问如何解决它:) 问题是意识形态的:你如何看待这种行为?

  1. 这是合乎逻辑的,应该是;
  2. 这不合逻辑,但如果它发生了——我们假设该特征;
  3. 出于技术原因,Canvas 以这种方式工作 - 实现更简单。
  4. 这是一个明显的错误,浏览器的作者应该修复它。

PS对不起我的英语不好。

4

1 回答 1

1

好问题!规范作者(和我)相信答案是:

  1. 这是合乎逻辑的,应该是;

让我们探讨一下其中的原因。

绘制红色路径时,您没有绘制单独的线。您正在绘制一条完整的路径,一条完整的路径一次全部绘制并一次全部描边,并且路径的颜色不能“重叠”自身。这是规范有意定义的。上面写着

由于子路径都被描画为一个,因此在一次描画操作中路径的重叠部分被视为它们的并集是绘制的。

如果您想获得叠加效果,您可以简单地使用多个路径,就像添加绿线一样。因此,您可以在必要时轻松地以其他方式进行操作。

您应该认为此功能是一件好事:如果 Canvas 规范要求路径的每个子路径产生额外的覆盖,那么每条路径的拐角(每条线连接的地方)都会看起来很糟糕!(有关每个角落的示例,请参见此处的红色连接)

由于在十字架上的路径重叠也意味着它会在每个角落重叠,因此规范决定在抚摸时只使用联合路径,这将保持正常的角落作为预期的默认值(我认为大多数人会期望它们像他们那样看,而不是像我展示的那样看)。如果线被覆盖在交叉路口而不是每个角落,那么这将不是一个一致的规则,这使得学习和工作变得更加困难。

所以我希望推理很清楚。规范必须给我们 3 件事,通常按这个顺序:最常见的预期输出(角落看起来像他们一样),一致性(如果我们覆盖在线交叉,我们也会在角落做,所以我们应该' t 这样做),并且易于理解。

一个好的规范总是一致的。如果某件事是一致的,那么它就更容易学习,一旦你知道为什么要这样做,就更容易理解。

于 2011-09-27T16:04:53.673 回答