(отредактировано после комментария)
Учитывая рисунок выше, ваша задача сводится к простой тригонометрической задаче.По сути, вам нужно вычислить d
, а затем сравнить его с h
.Если d
больше и h
, то точка C
находится вне коридора, в противном случае точка C
находится внутри коридора.
Расчет d
Расчетd
так же просто, как применить несколько тригонометрических тождеств.
Во-первых, вы знаете, что скалярное произведение векторов AB
и AC
определяется как:
, который позволяет рассчитать a
:
Затем, используя обычные тригонометрические соотношения, выполучить:
, что превращается в:
, которые выможно рассчитать, так как у вас есть выражение для a
.
Расчет d'
Это снова просто тригонометрия:
Функция предиката
Эта функция принимает как минимум 4 аргумента в качестве входных данных:
h
- ширина коридора
A
- координаты точки A
B
- координаты точки B
C
- координаты точки C
Внутри функции вам необходимо:
- Рассчитать векторы
AB
и AC
- Рассчитать
d
- Рассчитать
d'
- Если
d'
<0 или <code>d'> || AB ||, вернуть false - Если
d
<=<code>h вернуть true, false иначе
Принимая размеры A
, B
и C
, если вы знаете, что их форма не слишком сложна.По сути, вам нужно изменить тесты в точках 4 и 5 выше, чтобы учитывать фактический размер объектов.
(например, если вы предполагаете, что A
и C
являются сферами, то вам нужночтобы убедиться, что hh <<code>d' <|| AB || - hh, где hh - сумма радиусов <code>A и C
)