Линия - Тест пересечения окружности в 3D мире? - PullRequest
2 голосов
/ 19 мая 2011

У меня есть трехмерный мир, где у меня есть несколько 2-мерных кругов, лежащих на земле лицом к небу.

Как я могу проверить, будет ли линия пересекаться с одним из этих кругов сверху вниз?

Я пытался найти, но все, что я получаю, это тест пересечения: http://mathworld.wolfram.com/Circle-LineIntersection.html

, но это не то, что мне нужно, вот изображение, которое я имею в виду: http://imageshack.us/m/192/8343/linecircleintersect.png

Ответы [ 2 ]

4 голосов
/ 19 мая 2011

В трехмерном смысле вы прежде всего озабочены не кругом, а плоскостью, в которой лежит круг.Затем вы можете найти точку пересечения между лучом (линией) и плоскостью (диском).

Мне нравится использовать однородные координаты для точки, плоскостей и линий, и я надеюсь, что вы знакомы с векторной точкой · и кросс продукты ×.Вот метод:

Плоскость (диск) определяется точечным вектором 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)

, из которых вы можетепроверьте расстояние до центра круга.

4 голосов
/ 19 мая 2011

Если вы находитесь в системе координат, где земля задана z = c для c некоторой константой, то вы можете просто вычислить координаты x, y линии для z = c.Теперь для круга происхождения x0, y0 и радиуса R вы просто проверите, если

(x - x0) ^ 2 + (y - y0) ^ 2 <= R ^ 2. </p>

Если это правда, линия пересекает окружность.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...