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

1,921
107
378
Вот есть квадрат. Из его центра исходят отрезки, которые выходят за квадрат. Каким образом можно получить позиции этих отмеченных точек (которые на картинке)? Способ "точка пересечения двух отрезков" не подходит. Заранее спасибо.
uc
 
Допустим, у тебя есть функция 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
 
Мне уже ответили... ответил CMTV. Только сообщение это тут не видно. Видно почему-то только на почте.
Screenshot_1.png
 
Да я просто удалил свой ответ, так как сам в нем был не очень уверен. Был еще вариант, брать луч отрезка и искать пересечение с каждой стороной квадрата. Но его уже предложил @hohserg1.
 
А как же учитывать длину стороны квадрата? Ведь ее в формулах нет... Хмм
 
Кстати, мой вариант работает для любого выпуклого многоугольника)
 
Ну я же этот квадрат рендерю. Так и естественно знаю его размер.
 
Это понятно. Но в формуле, которую я тебе дал, нигде этот размер не нужен. И это странно. Ведь квадраты разные могут быть.
 
Мне нужно было просто узнать это соотношение и умножить его на размер квадрата.
 
Я так и думал. Но все же был не уверен, поэтому удалил. Сейчас верну свое сообщение.
 

Пусть \( (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 \).
 
Это понятно. Но в формуле, которую я тебе дал, нигде этот размер не нужен. И это странно. Ведь квадраты разные могут быть.
Наверное формула опирается на относительные координаты, либо лучи всегда идут из центра. Во втором случае нужно знать только угол поворота квадрата и углы лучей
 
Назад
Сверху