我一直在寻找合适的方法来寻找两条线段(每组 2 组 x,y 坐标)是否相交。我见过很多(包括: How do you detect where two line segments intersect? ),但我见过的都有缺陷。主要是如果线条平行但彼此重叠,则它们不会检测到碰撞。
我也不需要返回交点,只需要一个 bool 值就可以了。
如果有人能指出我正确的方向,我将不胜感激,因为显然我很擅长几何。 :(
最佳答案
当然有数学上优雅的方法可以做到这一点,但是如果您正在寻找使用基本代数的易于理解的算法,请尝试以下操作(这不是代码):
让我们通过端点定义两条线段:
l0 : { (x0, y0), (x1, y1) }
l1 : { (x2, y2), {x3, y3) }
首先,获得每条线的斜截距形式。您可以查找 m、b 的公式或自己推导出它们:
l0 : m0 * x + b0
l1 : m1 * x + b1
如果
(m0 != m1)
线不平行。要找到潜在的交点解决 l0 = l1
:x = (b1 - b0) / (m0 - m1)
y = m0 * x + b0
当且仅当
(x, y)
位于两个段上时,这些段才会相交。请注意,仅检查 x 坐标就足够了,因为我们已经确定 (x, y)
在两行上:[编辑以反射(reflect)@KenoguLabz 的出色输入]
(x0 <= x <= x1) AND (x2 <= x <= x3) AND (y0 <= y <= y1) AND (y2 <= y <= y3)
min(x0, x1) <= x <= max(x0, x1) AND min(x2, x3) <= x <= max(x2, x3)
如果两条线平行并且您想知道它们是否重叠,请将一条线的端点替换为上面的 x(不过,您只需要对另一条线进行测试)
希望这可以帮助。祝你好运!
关于c# - 两条线段是否使用 xna 在 c# 或 vb.net 中相交?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12963661/