前端/移动开发面试题更新 2026-08-05

在 Canvas 中,怎样检测某个坐标点是否位于已绘制的图形内部?

前端/移动开发性能优化技术原理方案权衡JavaScript

考察说明

评估对 Canvas 命中检测技术的理解和实际应用能力,以及性能与场景的取舍。

回答思路

  1. 【回答框架 1】Canvas 提供内置的 isPointInPath 方法,可以检测指定坐标点是否在当前路径或指定路径内,支持 fill 和 stroke 两种检测模式,是常用的简单判断方式。
  2. 【回答框架 2】对于复杂图形或需要检测多个图形时,可以遍历所有图形的路径,调用 isPointInPath 并传入每个图形,结合变形矩阵可将鼠标坐标转换为对应图形的本地坐标。
  3. 【回答框架 3】当图形不是路径形式,例如由图像或像素数据组成时,需使用像素级检测:获取 ImageData 并检查对应坐标的 alpha 值是否大于零,但性能较差且需考虑坐标偏移。
  4. 【回答框架 4】几何计算适用于规则图形,如圆可利用距离与半径比较,矩形用坐标范围比较,多边形采用射线法,这些方法灵活且无需依赖路径状态。
  5. 【回答框架 5】实际选择时,优先考虑内置方法以保证维护性和性能,仅在特殊需求下使用几何或像素方法,同时注意 Canvas 变换可能影响坐标一致性。
  6. 【关键点 1】isPointInPath 提供路径命中检测,支持坐标系转换,是首选方案。
  7. 【关键点 2】像素检测需读取 ImageData,性能开销大,适合图像或非场景中的简单检测。
  8. 【关键点 3】规则图形可用几何公式高效判断,多边形建议使用射线法。
  9. 【关键点 4】检测前需将屏幕坐标转换为 Canvas 坐标,注意高 DPI 下的缩放。
  10. 【关键点 5】对于大量图形,可利用空间分区(如网格)减少检测次数。
  11. 【易错点 1】忽略 Canvas 变换(如缩放、平移)导致坐标未转换,检测结果偏移。
  12. 【易错点 2】使用临时路径后未重置路径,导致 isPointInPath 检测到无关图形。
  13. 【易错点 3】对于闭合路径,未正确设置 fill 或 stroke 模式,导致检测范围与预期不符。