【问题标题】:javascript canvas intersection between two path2D两个path2D之间的javascript画布交集
【发布时间】:2021-08-11 21:26:43
【问题描述】:

我正在寻找一种方法来检查两个 path2D 是否相交但找不到方法...

示例:

// My circle
let circlePath = new Path2D();
circlePath.ellipse(x, y, radiusX, radiusY, 0, 0, Math.PI*2, false);

// My rectangle
let rectPath = new Path2D();
rectPath.rect(x, y, width, height);

// Intersect boolean
let intersect = circlePath.intersect(rectPath); // Does not exists

有这样的功能吗?

我找到了isPointInPath(path2D, x, y)(我用我的路径来检查是否与鼠标相交)但不能在两条路径之间使用它。

或者也许是一种获取 Path2D 中所有点的数组的方法,以便将 isPointInPath 与所有点一起使用?

编辑:

仅供参考,我想要这个用于游戏开发,我希望能够检查我的实体之间的碰撞(实体由一些数据和 Path2D 定义)。我的实体可以是正方形、圆形或更复杂的形状。

【问题讨论】:

  • 顺便说一句,我很好奇你为什么需要这个。您能否进一步扩展您的用例?
  • @Kaiido 我刚刚编辑了我的问题来解释我的用例

标签: javascript canvas html5-canvas


【解决方案1】:

API 中目前没有执行此操作的任何内容。

Path2D 接口仍然只是一个不透明的对象,我们甚至无法从中提取路径数据。实际上,我刚刚开始着手制定未来的提案,以公开此路径数据并向 Path2D 对象添加更多方法,例如getPointAtLength(),或导出到 SVG 路径命令,这将有助于做你想做的事,但是在它成为 API 的一部分之前我不会屏住呼吸,我必须承认我什至没有考虑包含这样的路径相交方法......

所以暂时,你可以做的是使用其他人所做的,例如this project可能对最简单的路径有所帮助。您必须自己将 Path2D 绘图调用转换为 SVG 路径命令,但如果您不过多处理省略号和addPath,这可能是一个解决方案。

否则,一个缓慢而残酷的解决方案是绘制这些路径,将 globalCompositeOperation 设置为 source-in 并检查是否有一些不透明的像素。
如果ctx.isPointInPath(path1, x, y) && ctx.isPointInPath(path2, x, y)...

,另一个缓慢而残酷的解决方案是检查每个像素

但最好不要做这些。

【讨论】:

  • 很高兴你回答了这个问题。我正在尽一切努力获得某种来自 path2D 的位置数据。在控制台中查看它只会提供无尽的无用(对我而言)数据树。有趣的是,我们有一种方法可以确定路径中是​​否有一个点,但两条路径是否重叠。
  • @Justin 好吧,isPointInPath 确实是进行任何命中测试所必需的,所以它是一种“基本”方法,在大多数 SVG 实现中可能已经存在。路径交叉点更复杂,用例也不太明显。
  • 感谢您的回答。我想我会使用方形或圆形来定义我的实体边界并计算碰撞
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 2018-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-18
相关资源
最近更新 更多