c# - 两条线段在 c# 或 vb.net 中使用 xna 相交吗?

标签 c# .net vb.net xna collision-detection

我一直在寻找一种合适的方法来确定两条线段(每组 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# - 两条线段在 c# 或 vb.net 中使用 xna 相交吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12963661/

相关文章:

c# - 性能调整分隔文件读取和写入数据库

c# - 为什么这个添加 SIMD 数组的示例可能无法证明比简单的实现有任何性能提升?

.net - 无法获得对 ConfigurationManager 的引用

vb.net - 如何在 VB .Net 中检查 2 个文本框的数据

vb.net - 必须将哪些文件/文件夹添加到源代码管理?

c# - 捕获当前正在播放的声音

c# - 如何区分 T 和 IList<T>

c# - WPF TextBox 在焦点上更改颜色

C# linq filter 加 concat

c# - 什么是NullReferenceException,如何解决?