Точки пересечения квадрата с линиями

1,560
86
204
Вот есть квадрат. Из его центра исходят отрезки, которые выходят за квадрат. Каким образом можно получить позиции этих отмеченных точек (которые на картинке)? Способ "точка пересечения двух отрезков" не подходит. Заранее спасибо.
uc
 
7,099
324
1,510
Допустим, у тебя есть функция intersect: (Section, Ray)=>Option[Point], которая принимает отрезок, луч и возвращает возможно их точку пересечения.
Тогда можно написать искомую функцию так:
Scala:
val findPoints =
    (rays:List[Ray], sections:List[Section]) =>
        rays.flatMap(r => sections.flatMap(s => intersect(s,r)))

Т.е. ищем пересечение каждого луча с каждым отрезком.
Можно оптимизировать этот алгоритм, если искать только первое пересечение для каждого луча. Для этого можно использовать Stream#span
 
1,560
86
204
Мне уже ответили... ответил CMTV. Только сообщение это тут не видно. Видно почему-то только на почте.
Screenshot_1.png
 

CMTV

Основатель
Администратор
1,304
4
601
Да я просто удалил свой ответ, так как сам в нем был не очень уверен. Был еще вариант, брать луч отрезка и искать пересечение с каждой стороной квадрата. Но его уже предложил @hohserg1.
 

CMTV

Основатель
Администратор
1,304
4
601
А как же учитывать длину стороны квадрата? Ведь ее в формулах нет... Хмм
 
7,099
324
1,510
Кстати, мой вариант работает для любого выпуклого многоугольника)
 

CMTV

Основатель
Администратор
1,304
4
601
Это понятно. Но в формуле, которую я тебе дал, нигде этот размер не нужен. И это странно. Ведь квадраты разные могут быть.
 
1,560
86
204
Мне нужно было просто узнать это соотношение и умножить его на размер квадрата.
 

CMTV

Основатель
Администратор
1,304
4
601
Я так и думал. Но все же был не уверен, поэтому удалил. Сейчас верну свое сообщение.
 

CMTV

Основатель
Администратор
1,304
4
601

Пусть \( (x,y) \) - координаты конца какого-нибудь красного отрезка.

Тогда:

\[ u = \max(|x|, |y|) \\ x_t = \frac{x}{u}\cdot a \\ y_t = \frac{y}{u}\cdot a \]

Где, \( (x_t, y_t) \) - искомая точка на квадрате, \( a \) - сторона квадрата.

Суть в том, что \( |x_2 - x_1| + |y_2 - y_1| \) дает нам метрику на числовой плоскости, в которой "единичным кругом" является квадрат со стороной \( 1 \). И в этой метрике нужно просто нормализовать вектор красного отрезка. Тогда получаем точку на "единичном квадрате". Затем умножаем обе координаты на длину стороны квадрата \( a \).
 
7,099
324
1,510
Это понятно. Но в формуле, которую я тебе дал, нигде этот размер не нужен. И это странно. Ведь квадраты разные могут быть.
Наверное формула опирается на относительные координаты, либо лучи всегда идут из центра. Во втором случае нужно знать только угол поворота квадрата и углы лучей
 
Сверху