【问题标题】:Html5 Canvas method isPointInPath determines only the last objectHtml5 Canvas 方法 isPointInPath 只确定最后一个对象
【发布时间】:2012-08-27 02:00:07
【问题描述】:

一个例子here

var context=document.getElementById("canvas").getContext("2d");

//Red Box
context.beginPath();
context.fillStyle="Red";
context.rect(10,10,50,50);
context.fill();

//Pink circle
context.beginPath();
context.lineWidth="3";
context.fillStyle="Pink";
context.arc(250,250,50,0,Math.PI*2,false);
context.fill();
context.stroke();

context.font="1.2em Verdana";
context.fillStyle="Black";
context.fillText(context.isPointInPath(35,35),35,35);
context.fillText(context.isPointInPath(250,250),250,250);

如果您在没有 beginPath 的情况下编写,则检测到所有对象。 如何识别画布上的对象或省略 beginPath?

【问题讨论】:

  • +1 是一个简单、优雅且适当精简的测试用例来解释您的问题。

标签: javascript html canvas


【解决方案1】:

如果您想使用该功能,您需要在每次进行测试时重建路径(只是不要调用fillstroke)。

如果有很多对象并且速度很重要,我通常会使用我自己的多边形测试函数或我自己的空间数据结构。

请注意,画布只是一个位图,它不存储您用来在其上绘制的命令。这就是为什么它在绘制形状后无法进行检查,您只能测试当前路径。

调用beginPath 后,之前的路径几何图形将被丢弃,如果调用fillstroke,则只有受影响的像素。

对于您的情况,检查画布像素的颜色可能是有意义的...

【讨论】:

  • 我的代码中也有类似的需求,按照 6502 的建议,我将点存储在自己的数据结构中,并使用自己的多边形点函数进行命中测试。画布 API 确实不支持非平凡的命中测试。
  • ...或者您可能需要考虑使用保留的图形模式 API(如 SVG)而不是 <canvas>,后者会为您处理命中测试。您仍然可以根据需要合成<canvas> 以获得每像素效果。
【解决方案2】:

我刚刚读到画布规范的一个新补充是 Path() 对象。据推测,这些可以被存储并随后测试和/或重放。可能有用。如果我正确理解了规范。

http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#path-objects

【讨论】:

猜你喜欢
  • 2012-05-26
  • 2012-01-26
  • 2013-06-03
  • 1970-01-01
  • 2016-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-31
相关资源
最近更新 更多