HTML5 Canvas - 与alpha通道自行交叉

时间:2011-09-27 15:33:28

标签: canvas alpha lines html5-canvas line-intersection

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

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

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

  1. 这是合乎逻辑的,应该是;
  2. 这不符合逻辑,但如果它发生了 - 我们假设该功能;
  3. 由于技术原因,Canvas以这种方式工作 - 实现更简单。
  4. 这是一个明显的错误,浏览器的作者应该修复它。
  5. P.S。抱歉我的英语不好。

1 个答案:

答案 0 :(得分:1)

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

  1. 这是合乎逻辑的,应该是;
  2. 让我们探讨一下这个原因。

    绘制红色路径时,不会绘制单独的线条。您正在绘制整个路径,并且一次绘制整个路径并一次描边,并且路径的颜色不能“重叠”自身。这是由规范有意定义的。它reads

      

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

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

    你应该认为这个特性是一件好事:如果Canvas规范要求路径的每个子路径引起一个额外的叠加,那么每个路径的角落(每条线都被连接起来)看起来会很糟糕! (请参阅红色连接here以获取每个角落的示例)

    由于路径在十字架上重叠也意味着它会在每个角落重叠,因此规范决定仅在行程时使用union'd路径,这使得正常的角落保持为预期的默认值(我想大多数人都会希望他们看起来像他们一样,而不是像我所展示的那样。如果线条覆盖在交叉点而不是每个角落,那么这将不是一致的规则,这使得学习和解决更加困难。

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

    良好的规范始终一致。如果某些东西是一致的,那么它就更容易学习,一旦你知道为什么会这样做,就会更容易理解。