RayCast: узнать точку пересечения отрезка и rectangle (прямоугольника)

мне надо как то узнать в какой точке находится пересечение отрезка и Rectangle, нашел такой метод на этом сайте bool LineIntersectsRect, который разбивает Rectangle на 4 отрезка и проверяет их пересечение с нашим отрезком bool LineIntersectsLine. Да факт пересечения он возвращает в формате true/false, но проблема в том что мне нужно узнать в какой точке луч столкнулся с объектом

    static public List<GameObject> castedObjects = new List<GameObject>();
    public void Cast(World world)
    { 
        castedObjects.Clear();
        
        PointF start = new PointF(From.x, From.y);
        PointF end = new PointF(toX,toY);
        
        for(int j = 0; j < world.CurrentMap.Count; j++)
        {
            RectangleF objectBounds = world.CurrentMap[j].Bounds;
            
            if (LineIntersectsRect(start,end,objectBounds))
            {
                castedObjects.Add(world.CurrentMap[j]);
            }
        }            
    }
    
    static bool LineIntersectsRect(PointF p1, PointF p2, RectangleF r)
    {
        return LineIntersectsLine(p1, p2, new PointF(r.X, r.Y), new PointF(r.X + r.Width, r.Y)) ||
            LineIntersectsLine(p1, p2, new PointF(r.X + r.Width, r.Y), new PointF(r.X + r.Width, r.Y + r.Height)) ||
            LineIntersectsLine(p1, p2, new PointF(r.X + r.Width, r.Y + r.Height), new PointF(r.X, r.Y + r.Height)) ||
            LineIntersectsLine(p1, p2, new PointF(r.X, r.Y + r.Height), new PointF(r.X, r.Y)) ||
            (r.Contains(p1) && r.Contains(p2));
    }
    
    static bool LineIntersectsLine(PointF l1p1, PointF l1p2, PointF l2p1, PointF l2p2)
    {
        float q = (l1p1.Y - l2p1.Y) * (l2p2.X - l2p1.X) - (l1p1.X - l2p1.X) * (l2p2.Y - l2p1.Y);
        float d = (l1p2.X - l1p1.X) * (l2p2.Y - l2p1.Y) - (l1p2.Y - l1p1.Y) * (l2p2.X - l2p1.X);

        if( d == 0 )
        {
            return false;
        }

        float r = q / d;

        q = (l1p1.Y - l2p1.Y) * (l1p2.X - l1p1.X) - (l1p1.X - l2p1.X) * (l1p2.Y - l1p1.Y);
        float s = q / d;

        if( r < 0 || r > 1 || s < 0 || s > 1 )
        {
            return false;
        }

        return true;
    }

Ответы (0 шт):