Как программно рассчитать пересечение линии и плоскости? - PullRequest
1 голос
/ 20 июня 2020

У меня есть формула для плоскости в трехмерном пространстве

-2658985.48304*(x+2658985.48304)
-5346635.44099*(y+5346635.44099)
+5269212.43874*(z-5269212.43874) = 0

У меня также есть векторная формула для линии в трехмерном пространстве ...

r(t) =   (  4077149.9388, 14675462.7240,-11546186.0029) 
     + t*(-10458715.0981,-27507387.7824,-24192295.8559)

Есть ли способ программно вычислить точку пересечения плоскости и вектора на PHP (или другом языке программирования)?

1 Ответ

2 голосов
/ 21 июня 2020

Да, есть ... Вам нужно описать свой самолет его нормалью n и любой точкой q, принадлежащей плоскости. Нормаль легко сделать, просто преобразовав ваше уравнение в:

dot( n , (x,y,z) )  = D 

, где n - нормаль плоскости. q необходимо вычислить, установив 2 координаты для чего угодно и вычислив 3-ю, однако, если ваша плоскость параллельна плоскости xy, yz или zx, вам нужно выбрать координаты, которые меняются ... Итак выберите 2 абс. наименьших координаты в нормальном режиме, и все должно быть в порядке. для q. Для простоты пусть x=z=0 ...

У вас уже есть линия в векторной форме:

p(t) = p0 + t*dp

где p0 - начальная точка вашей строки, dp - end_point-start_point и t - скалярный параметр в диапазоне t=<0.0,1.0>

, из которого вы можете использовать векторную математику, чтобы получить точку пересечения p ...

t = dot( q-p0 , dp )
p = p0 + t*dp

Однако вам нужно проверьте, находится ли точка внутри линии, поэтому:

t >= 0.0 AND t <= 1.0

Однако, если плоскость и линия параллельны (можно использовать любой из этих двух):

|   dot( n , dp ) - |n|*|dp| | <= 1e-6
| cross( n , dp )            | <= 1e-6

Вы должны проверить результирующая точка действительно находится внутри плоскости, просто проверив

| dot ( n , q ) - D | <= 1e-6

и все ...

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