Найти координаты точек внутри пирамидальной области

Дан массив точек в пространстве. Обозначим точку из него как P. Из некоторой точки C вдоль оси OZ проведена четырехугольная пирамида такая, что ребра ее основания параллельны осям OX и OY, а сам четырехугольник является прямоугольником. Также известен угол между OZ и гранями пирамиды (пусть phi1 - угол с гранью, основание которой параллельно OX, а phi2 - угол с гранью, основание которой параллельно OY). Задача состоит в том, чтобы из всех P заданного массива отобрать те точки, которые лежат внутри заданной пирамиды.

При чем, пирамида имеет бесконечную высоту, поэтому при попытке решить данный вопрос я пыталась ориентироваться именно на углы отклонения от высоты, которая и лежит на OZ.

Моя идея была такова:

1) Пусть P = (Px, Py, Pz), C = (cx, cy, cz)
2) Pxz = (Px-cx, Py-cy), Pyz = (Py-cy, Py-cy)
3) Ox = (cx+1,cy,cz), Oy = (cx,cy+1,cz), Oz = (cx,cy,cz+1)
4) Далее ищем угол между Pxz и Oz (alpha) и угол между Pyz и Oz (beta)
5) Если |alpha|<=phi1 и |beta|<=phi2, то точка P нам подходит, иначе смотрим следующую точку.

Однако, когда я делала это в Matlab, результат выдавался неверным. На изображении показана общая картина. Голубая, малиновая и зеленая линии - это система координат, относительно которой строится пирамида. Синяя линия - пространственный эллипс, точки которого - это заданный массив. введите сюда описание изображения


Ответы (1 шт):

Автор решения: MBo

Задаётся пирамида, конечно, альтернативненько....

Подразумеваем, что P - верхняя точка пирамиды.

Сечение пирамиды плоскостью z = P.Z является прямоугольником с полуразмерами

hw = (P.Z - C.Z) * tan(phi1)
hh = (P.Z - C.Z) * tan(phi2)

Остаётся проверить, что

abs(P.X - C.X) <= hw  && abs(P.Y - C.Y) <= hh
→ Ссылка