![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Sep 2010
Сообщений: 90
|
Есть плоскость, выстраиваемая по 4 точкам {x,y,z} и есть луч - отрезок, построенный по двум точкам {x2,y2,z2}-{x1,y1,z1}, как определить какие плоскости пересекает луч и точку пересечение на плоскости, помогите, если кто решал подобную задачу? с аналитической геометрией у меня никак от слова совсем. В инете нашел много информации по этому поводу, включая алгоритмы на си-крестах, но все везде разное и дает соответственно разные результаты, причем у меня все неверные)
|
|
|||||
|
1) Вообще плоскость должна задаваться 3 точками. 4 могут не образовать плоскость. Давайте считать что у нас есть 3 точки: A, B, C
2) Создадим вектора AB и AC (оба соответственно лежат в плоскости, так как соединяют вершины, лежащие на этой плоскости) 3) Возмем cross-product от AB и AC (это третий вектор, который точно перпендикулярен и AB и AC). Что такое cross-product и как его считать можно нагуглить. Так вот, помимо прочего cross-product будет нормалью плоскости (то есть перпендикулярен любой прямой, лежащей в плоскости) 4) Проверим, что обе точки отрезка лежат по одну сторону относительно плоскости (зная нормаль и координаты это можно посчитать. Координаты - это у нас точка A, так как и AB и AC, и cross-product выходят из нее и направлены в разные стороны). Как считать - я честно не помню. Но опять же можн найти. 5) Если в пункте 4 выяснилось что обе точки нашего отрезка лежат по одну сторону от плоскости, значит отрезок плоскость не пересекает. 6) Все готово, дело за малым - осталось лишь найти пересечение прямой, на которой лежит отрезок, и плоскости. Все данные у нас есть. Решение, опять же, можно найти. ЗЫ Извините что даю только теорию, но я совсем давно этим занимался. Кстати, когда занимался, я все что мне нужно было находил здесь: http://www.enlight.ru/faq3d/content.htm
__________________
...вселенская грусть |
|
|||||
|
.
|
Я не спец по геометрии, но в числе первых нагугленных вроде есть несколько по теме.
cross-product это вроде бы векторное произведение, не путать со скалярным умножением векторов и умножением вектора на скаляр. Последний раз редактировалось dimarik; 25.12.2013 в 22:32. |
|
|||||
|
Регистрация: Sep 2010
Сообщений: 90
|
Т.е., я могу взять любые 3 точки из 4х или это должны быть какие-то иные точки? Вообще, теории, конечно, уже начитался, кроссы и доты расписаны давно, проблема именно с уравнением плоскости и нормалью - по идее, достаточно ее одной и луча, для определения пересечения, но то ли у меня лыжи не едут, то ли неверно беру нормаль: у меня все плоскости образуют коробки, т.е., 2 компоненты нормали каждой стороны, по идее, должны быть равны нулю, а 3я 1 или -1, но так вычисления выходят неверны.
UPD. Все правильно было, я не поставил возврат значения и луч улетал в деревню дедушки, продолжая считать) вот, если кому пригодится: // tested_direction кэширован заранее шоп копий не плодить // p1 - одна из точек плоскости // start начальная точка луча tested_direction.x = p1.x - start.x; tested_direction.y = p1.y - start.y; tested_direction.z = p1.z - start.z; // коэффициент приближения к плоскости // если k > 1, значит луч не пересекает плоскость, если меньше, значит находится в одном полупространстве с ней // trace_direction - вектор луча var k:Number = tested_direction.Dot(normal) / trace_direction.Dot(normal); // точка на плоскости trace_point.x = start.x +trace_direction.x *k; trace_point.y = start.y +trace_direction.y *k; trace_point.z = start.z +trace_direction.z *k; Последний раз редактировалось dimarik; 25.12.2013 в 23:27. Причина: зачеркивания глаз режут. |
![]() |
![]() |
Часовой пояс GMT +4, время: 07:09. |
|
|
« Предыдущая тема | Следующая тема » |
|
|