В трехмерном смысле вы прежде всего озабочены не кругом, а плоскостью, в которой лежит круг.Затем вы можете найти точку пересечения между лучом (линией) и плоскостью (диском).
Мне нравится использовать однородные координаты для точки, плоскостей и линий, и я надеюсь, что вы знакомы с векторной точкой ·
и кросс продукты ×
.Вот метод:
Плоскость (диск) определяется точечным вектором r=[rx,ry,rz]
и вектором нормального направления n=[nx,ny,nz]
.Вместе они образуют плоскость W=[W1,W2]=[n,-r·n]
.
Линия (луч) определяется двумя точечными векторами r_A=[rAx,rAy,rAz]
и r_B=[rBx,rBy,rBz]
.Вместе они образуют линию L=[L1,L2]=[r_B-r_A, r_A×r_B]
Пересекающаяся точка определяется как P=[P1,P2]=[L1×W1-W2*L2, -L2·W1]
или расширяется как
P=[ (r_B-r_A)×n-(r·n)*(r_A×r_B), -(r_A×r_B)·n ]
Координаты точки находятся по r_P = P1/P2
, где P1
имеет три элемента, а P2
является скалярным.
Получив координаты, вы проверяете расстояние с центром круга с помощью d=sqrt((r_p-r)·(r_p-r))
и проверяете d<=R
, где R
- радиускруг.Обратите внимание на разницу в обозначениях между скалярным умножением *
и точечным произведением ·
Если вы точно знаете, что круги лежат на земле (r=[0,0,0]
) и направлены вверх (n=[0,0,1]
)тогда вы можете сделать много упрощений для приведенного выше общего случая.
[ref: Координаты Плюккера ]
Обновление:
При использовании земли (с + Z вверх) в качестве плоскости (где лежат круги), затем используйте r=[rx,ry,0]
и n=[0,0,1]
, и вышеуказанная точка пересечения упрощается до
r_p = [ rBy-rAy, rAx-rBx, 0] / (rAy*rBx-rAx*rBy)
, из которых вы можетепроверьте расстояние до центра круга.