![]() |
|
|
![]()
|
|
| KonovalovSerega |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 5.1.2007 Репутация: нет Всего: нет |
Привет!!!
Я тут разбирался с DirectX и у меня возникла одна проблема. Суть проблемы такова: У меня есть луч опред. вектором начала и направления и есть много прямоугольников. Мне нужно определить в какой прямоугольник попал луч(если вообше попал). Кто знает как решить эту проблему, напишите как(желательно по понятней). Зарание спосибо! |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
ну, например, так:
луч пересекает прямоугольник тогда и только тогда, когда он пересекает хотя бы одну сторону, так что достаточно проверить пересечение с лучом для каждого отрезка для отрезка можно поступить так: - считаем модуль угла между лучом и направлением из его начала на одну вершину - считаем модуль угла между лучом и направлением на вторую вершину - считаем модуль угла между направлениями на вершины если сумма первых равна третьему, значит, пересекает правда, у меня сильные сомнения, что это - самый оптимальный способ, но хоть такой для начала... -------------------- qqq |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 4 Всего: 27 |
maxim1000, это ж для 2D случая... насколько я понял, нужно для 3D (в пространстве)
|
|||
|
||||
| Artemios |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 1 Всего: 50 |
Решается система уравнений: 2 линейных уравнения от 3-х переменных, задающие плоскость, в которой лежит квадрат, 3-е линейное уравнение задает прямую для луча. Решение системы уравнений является точкой пересечения прямой и плоскости, и останется выяснить, принадлежит ли точка в плоскости квадрату в той же плоскости. Эту проверку можно сделать несколькими способами, например: нормали из точки, построенные к противолежащим сторонам квадрата, должны быть противоположно направлены.
Добавлено @ 02:30
Точнее, не к сторонам квадрата, а к прямым, на которых эти стороны лежат. Другой вариант: если точка внутри квадрата, то все нормали от нее к прямым, на которых лежат стороны квадрата, пересекают эти прямые именно внутри отрезков-сторон квадрата. Т.е. считаем точку пересечения 2-х прямых (прямяя для стороны квадрата и нормаль к ней из исследуемой точки). Получили точку пересечения -- считаем, принадлежит ли она отрезку (конкретной стороне квадрата). И так для всех 4-х сторон. Это сообщение отредактировал(а) Artemios - 20.1.2007, 02:31 -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
|||
|
||||
| maxim1000 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3334 Регистрация: 11.1.2003 Где: Киев Репутация: 33 Всего: 110 |
и то правда, просто прочитал "прямоугольники" в голове сразу "2D" Добавлено @ 02:52 О... кстати... придумал ещё один способ: проектируем квадрат на плоскость, перпендикулярную лучу, и проверяем, лежит ли в нём точка (0,0) (после проекции уже 2D получается) правда, это - скорее, способ для прямой и квадрата, нужно ещё проверить направление на точку пересечения зато, по идее, должно работать, когда всё (и луч, и прямоугольник) лежит в одной плоскости, т.е. единственной точки пересечения нет -------------------- qqq |
|||
|
||||
| $tatic |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 651 Регистрация: 28.1.2005 Репутация: нет Всего: 22 |
В DirectX есть готовая функция для этого. К сожалению, сейчас не помню как называется
|
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 4 Всего: 27 |
По поводу сообщения Artemios'a: очень сложный алгоритм, в плане времени вычисления. Однако проверить пересикается ли луч с плоскостью можно так:
Point = A + c*(n*(B-A)/(n*c)) где n - нормаль к плоскости B - любая вершина прямоугольника (а вообще точка, лежащая на плоскости) A - начало луча с - направление луча n*c - скалярное произведение векторов (угол между векторами). Если n*c=0 луч и плоскость паралельны n(B-A) - тоже скалярное произведение (так как B-A - вектор) Решив это, получим точку пересечения луча с плоскостью. Теперь нужно выяснить лежит ли точка в прямоугольнике или треугольнике. Короче, это сложный метод, так как это нужно решать для каждого прямоугольника |
|||
|
||||
| Artemios |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 1 Всего: 50 |
Мне кажется, сложность такого поиска пересечения прямой с плоскостью не меньше, чем решение системы 3-х линейных уравнений (и что-то мне подсказывает, что с математической точки зрения это "абсолютно те же яйца, но боком", другое дело, если нормаль к плоскости заранее известна -- ну тут уже особенности DirectX-а, а не математики) -------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 4 Всего: 27 |
Artemios, так я ж Вами предложенный метод и описал
|
|||
|
||||
| Artemios |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 405 Регистрация: 14.8.2006 Где: Саратов, Россия Репутация: 1 Всего: 50 |
а зацепился я на противопоставлении:
-------------------- fib = 1: 1: [ x+y | (x,y) <- zip fib (tail fib) ] |
||||
|
|||||
![]()
|
| Правила форума "Алгоритмы" | |
|
|
Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, maxim1000. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Алгоритмы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |