Скажу сразу, я не силён в аналитической геометрии, поэтому за решением пошёл сразу в интернет.
Мне нужно найти точку пересечения 2х конечных отрезков, порывшись в интернете ничего толком рабочего не нашёл, а из рабочего только пересечение 2х бесконечных линий. Типа такого:
float t2 = (-w * p1.x + w * r1.x + v * p1.y - v * r1.y) / (w * v2 - v * w2);
82
83
// t = (p1.X - r1.X + v2t2) / v - (у.1)
84
float t = (p1.x - r1.x + v2 * t2) / v;
85
86
// Если один из параметров меньше 0 и больше 1, значит пересечения нет.
87
if (t < 0 || t > 1 || t2 < 0 || t2 > 1)
88
{
89
//info.Id = 20;
90
//info.Message = "Пересечения нет";
91
92
93
return Vector2.negativeInfinity;
94
}
95
96
// Координаты точки пересечения
97
float xx = p1.x + v2 * t2;
98
float yy = p1.y + w2 * t2;
99
100
101
//info.Id = 0;
102
//info.Message = "Пересечение есть";
103
104
returnnew Vector2(xx, yy);
105
106
}
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
FiEctro найди сперва пересечение луча с плоскостью. А потом уже делай проверки как бы ограничить эту плоскость.
Я бы посоветовал ограничивающие объемы, но имхо для 2д это какой-то оверкилл.
Ну или переформулируй задачу, может тебе нужно совсем другое.
Есть луч в 3хмерном пространстве мне нужно получить координаты пересечения этим лучом границ экрана.
Цитата:
XaeroX писал: Решение любой задачи по геометрии начинается с хорошего чертежа.
А толку если я формул не знаю.
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!
Вот по этой ссылке всё неплохо расписано. Что именно не работает?
Допустим, у тебя есть отрезки AB и CD. Координаты точек A, B, C и D, соответственно, (Ax, Ay), (Bx, By), (Cx, Cy) и (Dx, Dy).
Сначала находим параметрические уравнения прямых, на которых лежат отрезки. В общем виде уравнение такое: M = P*t + M0
Где M0(x0, y0) начальная точка, P - направляющий вектор, t - параметр.
Нам нужно найти значение параметров в точке пересечения отрезков, и если 0<= t <=1, то отрезки пересекаются.
Уравнения будут такие: M1 = (B-A)*t1 + A M2 = (D-C)*t2 + C
Точка пересечения это M1 = M2. Тогда:
(B-A)*t1 + A = (D-C)*t2 + C
Решаем систему линейных уравнений, находим t1 и t2. Отрезки пересекаются, если 0<= t1 <=1 и 0<= t2 <=1. Если уравнения оказываются линейно зависимыми, то t найти нельзя и пересечения нет. Работает и для двумерного, и для трёхмерного случая (в последнем случае система будет из трёх уравнений, по x, y и z).
Дядя Миша писал: FiEctro найди сперва пересечение луча с плоскостью. А потом уже делай проверки как бы ограничить эту плоскость.
Я бы посоветовал ограничивающие объемы, но имхо для 2д это какой-то оверкилл.
Ну или переформулируй задачу, может тебе нужно совсем другое.
Я первоначально так и хотел, но потом понял что с этим слишком много лишних телодвижений. Сначала считать пересечения с плоскостью, потом как то ещё думать как их ограничивать, потом ещё вычленять нужные координаты, нафиг надо этот геморой.
Цитата:
XaeroX писал: Так я не понял, вопрос о пересечении двух двумерных отрезков, или о пересечении трёхмерного луча с фрустумом?
Да разницы никакой, и так и так 4 отрезка получается. Действительно я вчера тоже переделал на получение координат границ экрана путём пересечения фрустума с плоскостью, до этого пытался конвертировать отрезки в экранное пространство, и что то оно не очень хорошо работало.
Цитата:
XaeroX писал: Вот по этой ссылке всё неплохо расписано. Что именно не работает?
Да такое ощущение что половина случаев когда они точно должны пересекаться, он не видит и выдаёт что они не пересекаются. Но как говорил выше, сейчас попробую переделать и заменить экранные координаты на координаты с фрустума. Так думаю должно всё работать, а там посмотрим.
Цитата:
XaeroX писал: Допустим, у тебя есть отрезки AB и CD. Координаты точек A, B, C и D, соответственно, (Ax, Ay), (Bx, By), (Cx, Cy) и (Dx, Dy).
Сначала находим параметрические уравнения прямых, на которых лежат отрезки. В общем виде уравнение такое:
M = P*t + M0
Где M0(x0, y0) начальная точка, P - направляющий вектор, t - параметр.
Нам нужно найти значение параметров в точке пересечения отрезков, и если 0<= t <=1, то отрезки пересекаются.
Уравнения будут такие:
M1 = (B-A)*t1 + A
M2 = (D-C)*t2 + C
Точка пересечения это M1 = M2. Тогда:
(B-A)*t1 + A = (D-C)*t2 + C
Решаем систему линейных уравнений, находим t1 и t2. Отрезки пересекаются, если 0<= t1 <=1 и 0<= t2 <=1. Если уравнения оказываются линейно зависимыми, то t найти нельзя и пересечения нет. Работает и для двумерного, и для трёхмерного случая (в последнем случае система будет из трёх уравнений, по x, y и z).
Уже более менее понятнее, спасибо. Хотя вроде мало чем отличается от того что по ссылке. Ладно попробую, тогда можно будет думать что дальше.
Добавлено 03-01-2024 в 14:38:
Да, вроде это работает. Похоже я накосячил просто с входными данными.
Делаю это так:
if (u < 0.0f || u > 1.0f || v < 0.0f || v > 1.0f) returnfalse; // Пересечение вне отрезков
12
13
intersection.x = p1.x + u * (p2.x - p1.x);
14
intersection.y = p1.y + u * (p2.y - p1.y);
15
16
returntrue;
17
}
__________________
У котёнка мокрый нос и гладенькая шерсть, у него забавный хвост и быстрых лапок шесть. Две задних, две средних и две передних лапы, такая многоножка получилася у папы.
Он ученый — папа мой — зверушек изучает, гуляет по помойкам, ловит крыс и чаек. Две крысы белокрылые и чайки две унылые покрытые пупырчатою кожей лягушат без пёрышек тоскуют и ускакать спешат.
А ещё есть муравей большой размером с гуся он пугает всех зверей, и я его боюся, когда он ковыляет на лапках на своих.
И в двери ударяет, и начинает стих: Я — муравей, воды налей! Не меньше ведра, напиться мне пора!