You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

TypeScript游戏开发:检查顶点坐标相等是否正确且一致?

游戏中边相交检测:共享顶点的浮点数相等判断是否可靠?

我正在开发一款TypeScript游戏,需要在画布上绘制顶点及连接它们的边,核心需求是判断不同顶点的边是否相交。目前用通用的doLinesIntersect函数做检测,但这个函数会把共享顶点的边判定为相交,不符合我的需求。

于是我手动加了顶点共享检查逻辑,代码如下:

function doLinesTrulyIntersect(aX1: number, aY1: number, aX2: number, aY2: number, bX1: number, bY1: number, bX2: number, bY2: number): boolean {
  const sharesVertexes = (aX1 === bX1 && aY1 === bY1) || 
                         (aX1 === bX2 && aY1 === bY2) || 
                         (aX2 === bX1 && aY2 === bY1) || 
                         (aX2 === bX2 && aY2 === bY2);

  return !sharesVertexes && doLinesIntersect(
    aX1, aY1, aX2, aY2,
    bX1, bY1, bX2, bY2
  );
}

我的逻辑是:如果两条边共享顶点,就判定它们不相交。我觉得共享顶点的坐标是完全相同的二进制位,用===判断没问题,但我知道通用场景下浮点数相等判断有坑,想确认这个逻辑是否始终有效?


你的逻辑在游戏场景下的顶点管理方式里是完全可靠的,原因如下:

  • 首先,游戏里的顶点坐标通常是你主动生成、存储和复用的——比如所有边的顶点都来自同一个顶点池,或者是通过固定逻辑计算出的精确值(比如网格点、预设路径点)。这种情况下,共享的顶点必然是同一个数值的引用或完全相同的二进制浮点数,用===判断完全准确。

  • 通用场景下浮点数相等判断的问题,大多出在多次计算后的精度丢失(比如复杂的几何变换、物理模拟后的坐标),但如果你的边是直接关联已有的顶点对象/数值,而非每次重新计算坐标,就不会出现这种情况。

  • 退一步说,即使你需要处理动态计算的坐标,只要在生成顶点时做了归一化或精度锁定(比如保留固定小数位后再存储),===判断依然有效——因为共享顶点的坐标会被处理成完全相同的二进制值。

唯一需要注意的例外:如果你的游戏有动态生成且未做精度处理的浮点数顶点(比如实时物理模拟中产生的顶点,每次计算都有微小误差),这时共享顶点可能出现二进制不相等的情况。但这种场景下,你本来就不应该直接用原始坐标判断共享顶点,而是应该给每个顶点分配唯一ID,通过ID来判断是否共享,这比坐标判断更可靠。

总结:只要你的顶点是可控的(复用、预设、或经过精度处理),用===判断共享顶点的逻辑就始终有效;如果是不可控的动态坐标,换用ID标识顶点是更稳妥的方案。

内容的提问来源于stack exchange,提问作者Ryan Peschel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 15:31:02