Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 与AABB矩形相交的直线?_C#_Line_Collision Detection_Intersection - Fatal编程技术网

C# 与AABB矩形相交的直线?

C# 与AABB矩形相交的直线?,c#,line,collision-detection,intersection,C#,Line,Collision Detection,Intersection,最好不使用任何循环,因为这将在游戏中使用 我想让一条线与任意大小的矩形相交。 但我也希望返回交点 这是可能的,我在谷歌上搜索了一下,但仍然没有找到答案 使用(x1,y1,x2,y2)定义线。 矩形也有这两点。我建议只需在构成矩形的每条线段(边)上进行线段相交检查。这是我多年前写的一个线段交点检测算法,是从我的一个旧XNA项目中挖掘出来的: // a1 is line1 start, a2 is line1 end, b1 is line2 start, b2 is line2 end stati

最好不使用任何循环,因为这将在游戏中使用

我想让一条线与任意大小的矩形相交。 但我也希望返回交点

这是可能的,我在谷歌上搜索了一下,但仍然没有找到答案

使用(x1,y1,x2,y2)定义线。
矩形也有这两点。

我建议只需在构成矩形的每条线段(边)上进行线段相交检查。这是我多年前写的一个线段交点检测算法,是从我的一个旧XNA项目中挖掘出来的:

// a1 is line1 start, a2 is line1 end, b1 is line2 start, b2 is line2 end
static bool Intersects(Vector2 a1, Vector2 a2, Vector2 b1, Vector2 b2, out Vector2 intersection)
{
    intersection = Vector2.Zero;

    Vector2 b = a2 - a1;
    Vector2 d = b2 - b1;
    float bDotDPerp = b.X * d.Y - b.Y * d.X;

    // if b dot d == 0, it means the lines are parallel so have infinite intersection points
    if (bDotDPerp == 0)
        return false;

    Vector2 c = b1 - a1;
    float t = (c.X * d.Y - c.Y * d.X) / bDotDPerp;
    if (t < 0 || t > 1)
        return false;

    float u = (c.X * b.Y - c.Y * b.X) / bDotDPerp;
    if (u < 0 || u > 1)
        return false;

    intersection = a1 + t * b;

    return true;
}
//a1是line1开始,a2是line1结束,b1是line2开始,b2是line2结束
静态布尔相交(向量2 a1、向量2 a2、向量2 b1、向量2 b2、外向量2相交)
{
交点=矢量2.0;
向量2b=a2-a1;
向量2d=b2-b1;
浮动bDotDPerp=b.X*d.Y-b.Y*d.X;
//如果b dot d==0,则表示直线平行,因此有无限个交点
如果(bDotDPerp==0)
返回false;
向量2c=b1-a1;
浮动t=(c.X*d.Y-c.Y*d.X)/bDotDPerp;
如果(t<0 | | t>1)
返回false;
浮动u=(c.X*b.Y-c.Y*b.X)/bDotDPerp;
如果(u<0 | | u>1)
返回false;
交叉点=a1+t*b;
返回true;
}
我将把输入每个边到上述方法中并收集结果作为练习留给读者:)


编辑1年后现在我上了大学,学习了一门图形课程: 当您有一大组线,其中大多数线与矩形不相交时,请查看以有效地执行此操作。它使用9段网格,将线的每个端点放置在所述网格的一个区域中:

使用此选项,我们可以判断是否将不存在任何直线交点:

例如,此处的
CD
不会与矩形相交(第一幅图像中显示为红色),因为
C
D
都位于顶行,而且
AB
也不会相交。对于直线可能与矩形相交的部分,我们必须尝试直线相交

这些部分的编号/标签方式允许我们只需执行
x和y!=0
(其中
x
y
是每条线端点的截面标签),以确定是否存在交点


使用这种方法意味着我们必须有更多、更少的线交点,这大大加快了整个过程。

从一个更简单的问题开始。你知道如何将一条无限线与另一条无限线相交吗?我不认为你通过苏格拉底的方法学习得更好;我知道不是每个人都这样。相反,我试图衡量你现有的知识水平。如果你不知道如何相交两条线,那么在你尝试相交更复杂的几何图形之前,你可能必须先学习这一点。我根本不同意。有时候,用代码实现其他人的解决方案、验证它是否有效并忘记它,比学习解决方案背后的理论并自己实现要好得多。你学的不多,但不是每个人都想或需要学习所有东西。这很容易做到。非常感谢。在上面的代码示例中,这些实际上是叉积,而不是点积。Cohen–Sutherland算法似乎是关于剪裁和查找交集,而不是交集,所以肯定会慢一些?嗯,Cohen-Sutherland算法假设有限空间被划分为9个相等的区域(或3d中的27)。当你的空间无限大时会发生什么?@MattEsch:我猜你只是把外部的8(26)个区域无限大。