预测一条线段的运动轨迹是否与矩形相交的算法?

我不确定该使用什么数学知识,因为我在使用数学解决此类问题时非常缺乏经验,所以我想知道这里是否有人能够给我一些指示或给我一些查找此特定问题的地方的建议。我有单个点(或球)的 x 和 y 轨迹,当它移动时,它就像一条线一样运动,从一个位置移动到必须停止的另一个位置,然后反弹(反射轨迹)并沿着反弹轨迹继续前进。我只需要算法能够确定当前斜率是否会与矩形相交,并以 true/false(布尔值)的形式返回结果。如果需要,我有矩形的 4 个边缘点和矩形的中心点。

点赞
用户1161878
用户1161878

在我看来,atan 是一个不好的选择。它很费时,而且象限的调整非常困难。

你可以通过使用 atan2 来简化已接受的代码,但这仍然太耗费资源。

你并不真正关心角度。你关心的是方向向量和当前位置到盒子角落的极端向量之间的角度的 _符号_。

为此,叉积更便宜、更简单、更适合。如果有两个向量 a 和 b,则以下量:

s = a.x * b.y - a.y * b.x

如果从 a 到 b 的锐角是正向的(逆时针),则其结果是正的,反之亦然。

你只需要验证方向向量和从当前点到每个框角的线形成的锐角中至少包含一个正值和一个负值。

function is_intersect(pos, dir, quad)
  local n_pos, n_neg = 0, 0
  for i = 1, 4 do
    local dx, dy = quad[i].x - pos.x, quad[i].y - pos.y
    local s = dir.x * dy - dir.y * dx
    if s > 0 then n_pos = n_pos + 1 end
    if s < 0 then n_neg = n_neg + 1 end
  end
  return n_pos > 0 and n_neg > 0
end

对不起,我不是 Lua 程序员。这是一个使用已接受的答案作为模式来猜测 Lua 语法的最佳猜测。

2017-02-03 03:02:12