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;
}