Vector 二维光线相交AABB,代码生成过多相交

Vector 二维光线相交AABB,代码生成过多相交,vector,2d,raytracing,aabb,Vector,2d,Raytracing,Aabb,我正在尝试为一个游戏实现一些基本的2D光线跟踪,我需要知道光线进入和退出一个轴对齐的正方形的确切交点。我们的游戏是二维的,左手坐标系,世界的下角是0,0,Y轴向上,x轴向右 我试图检测一条光线从原点到一个正方形的交点,我需要知道确切的交点 我对它做了很多研究,发现了很多指南,这本是最有用的。 他们中的大多数人都说了类似的话,这只是一种更好的理解方式。我们的游戏不在unity engine中,这并不重要 我已经完成了90%的工作,并且编写了一些代码,这些代码看起来几乎可以正常工作,但是它检测到了

我正在尝试为一个游戏实现一些基本的2D光线跟踪,我需要知道光线进入和退出一个轴对齐的正方形的确切交点。我们的游戏是二维的,左手坐标系,世界的下角是0,0,Y轴向上,x轴向右

我试图检测一条光线从原点到一个正方形的交点,我需要知道确切的交点

我对它做了很多研究,发现了很多指南,这本是最有用的。

他们中的大多数人都说了类似的话,这只是一种更好的理解方式。我们的游戏不在unity engine中,这并不重要

我已经完成了90%的工作,并且编写了一些代码,这些代码看起来几乎可以正常工作,但是它检测到了太多的相交点

最关键的混淆点之一是,本指南和其他许多指南指示我选择左下角的交点,以最大的为准(右上角最小的为准)。我觉得这没有意义,因为光线完全有可能从框的底部到左侧,或从顶部到右侧切割,因此两个交点都与一个角关联

我试图通过在两个相交后缩短来解释这一点,但遇到了一个问题,即它非常频繁地检测到左下角的两个相交(因为它首先完成),一个正确,一个无意义。我不明白这里出了什么问题

我还对参考线做了另一个偏离,在不同的相交点上添加了相应的LL坐标。如果没有这个参考点,它们是个位数的值,而这些角点距离游戏的零坐标有几千个单位

/proc/ray_turf_intersect(var/vector2/origin, var/vector2/ray, var/turf/target)
    
    //Some game-specific stuff here to calculate the lowerleft and upper 
right corners of the turf (box), represented by the pair of vector2s LL and 
UR from here on out. I'm 100% sure they're calculated correctly
    //---------------------------------


    var/ax = ray.x ? ((LL.x - origin.x) / ray.x)+LL.x   :   origin.x
    var/ay = ray.y ? ((LL.y - origin.y) / ray.y)+LL.y   :   origin.y
    var/bx = ray.x ? ((UR.x - origin.x) / ray.x)+LL.x   :   origin.x
    var/by = ray.y ? ((UR.y - origin.y) / ray.y)+LL.y   :   origin.y
    
    var/list/intersections = list()
    if (ax >= LL.x && ax <= UR.x)
        intersections += new /vector2(ax, LL.y)

    if (ay >= LL.y && ay <= UR.y)
        intersections += new /vector2(LL.x, ay)

    if (intersections.len == 2)
        return intersections


    if (bx >= LL.x && bx <= UR.x)
        intersections += new /vector2(bx, UR.y)

    if (by >= LL.y && by <= UR.y)
        intersections += new /vector2(UR.x, by)

    return intersections```
/proc/ray\u turp\u intersect(var/vector2/origin,var/vector2/ray,var/turp/target)
//这里有一些特定于游戏的东西来计算上下限
草皮(长方体)的右角,由矢量2和LL对表示
从现在开始。我百分之百肯定他们计算正确
//---------------------------------
var/ax=射线x?((LL.x-origin.x)/ray.x)+LL.x:origin.x
var/ay=ray.y?((LL.y-origin.y)/ray.y)+LL.y:origin.y
var/bx=射线x?((UR.x-origin.x)/ray.x)+LL.x:origin.x
var/by=ray.y?((UR.y-origin.y)/ray.y)+LL.y:origin.y
var/list/crossions=list()
如果(ax>=LL.x&&ax=LL.y&&ay=LL.x&&bx=LL.y&&by