Другие языки программирования и технологии

В трехмерном пространстве есть отрезок и плоскость. Не могу найти их пересечение C#

В трехмерном пространстве есть отрезок и плоскость. Найдите их пересечение. Входные данные:

Двенадцать действительных трехмерных координат:

Два конца сегмента.
Точка на плоскости.
Нормальный вектор плоскости.
Длина нормального вектора больше 1e-8.

Выход:

Есть следующие выходные случаи:

Целое число 0, если отрезок и плоскость не пересекаются.
Целое число 1 и трехмерные координаты пересечения, если отрезок и плоскость пересекаются в одной точке.
Целое число 4 и трехмерные координаты двух концов отрезка, если он находится на плоскости.
Входные данные:
0,0 0,0 0,0 1,0 0,0 0,0 3,0 5,0 0,0 0,0 1,0 0,0

Выход:
0

Входные данные:
1,0 2,0 3,0 -4,0 -3,0 -2,0 -3,0 9,0 2,0 -1,0 0,0 0,0

Выход:
1 -3,0 -2,0 -1,0

Вход

4.0 3.0 -2.0 0.0 10.0 -2.0 -9.0 4.0 -2.0 0.0 0.0 1.0

Выход

4 4.0 3.0 -2.0 0.0 10.0 -2.0
два конца отрезка (x1, y1, z1)-(x2, y2, z2) задают вектор: (x2-x1, y2-y1, z2-z1).
тогда весь отрезок (и прямую, на которой он лежит) можно записать в параметрическом виде:
x = x1 + (x2 - x1) * t
y = y1 + (y2 - y1) * t
z = z1 + (z2 - z1) * t

плоскость, заданная вектором нормали n = (nx, ny, nz) и своей точкой A = (xA, yA, zA), имеет уравнение:
(x - xA)*nx + (y - yA)*ny + (z - zA)*nz = 0

подставляем одно в другое, получаем уравнение относительно t:
(x1 + (x2 - x1) * t - xA)*nx + (y1 + (y2 - y1) * t - yA)*ny + (z1 + (z2 - z1) * t - zA)*nz = 0

решаем:
t = [(xA-x1)*nx + (yA-y1)*ny + (zA-z1)*nz] / [(x2-x1)*nx + (y2-y1)*ny + (z2-z1)*nz]

проверяем, чтобы t лежало между 0 и 1, подставляем в параметрическое уравнение прямой, получаем ответ.
П[
Павел [Amatory]
82 367
Лучший ответ
Жумагазы Тусупов спасибо, и теперь мне нужно эти все поочередно формулы написать в шарпе, верно?
Жумагазы Тусупов я просто не пойму, какой мне именно порядок формул, чтоб поочередно, у меня есть 12 чисел и я буду ими высчитывать
есть код на C++

v3f - вектр с `x y z` компонентами

v3f getPoint(){
// ABC есть треугольник - достаточно для ПЛОСКОСТИ
v3f A = v3f( координаты );
v3f B = v3f( координаты );
v3f C = v3f( координаты );

v3f N = math::cross(B - A, C - A);
v3f V = A - X;
f32 d = math::dot( N, V );
v3f W = Y - X;
f32 e = math::dot( N, W );

v3f O;
if( e != 0 ){
O = X + W * d/e;
}else if( d == 0 ){
O = X + W * 1.f;
}

return O;
}

Рабочий код, но не идеален. Источник потерял. Взято с stackoverflow.
Сергей Бак
Сергей Бак
30 070