В трехмерном пространстве есть отрезок и плоскость. Найдите их пересечение. Входные данные:
Двенадцать действительных трехмерных координат:
Два конца сегмента.
Точка на плоскости.
Нормальный вектор плоскости.
Длина нормального вектора больше 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
Другие языки программирования и технологии
В трехмерном пространстве есть отрезок и плоскость. Не могу найти их пересечение C#
два конца отрезка (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, подставляем в параметрическое уравнение прямой, получаем ответ.
тогда весь отрезок (и прямую, на которой он лежит) можно записать в параметрическом виде:
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, подставляем в параметрическое уравнение прямой, получаем ответ.
Жумагазы Тусупов
спасибо, и теперь мне нужно эти все поочередно формулы написать в шарпе, верно?
Жумагазы Тусупов
я просто не пойму, какой мне именно порядок формул, чтоб поочередно, у меня есть 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.
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.
Похожие вопросы
- Кратчайшее расстояние от точки до отрезка на плоскости (C++)
- Pasal! Как найти точку пересечения двух прямых? ax+by+c=0
- Как найти площадь пересечения колец?
- Я зная C++ (уровень - днище) написал полноценную программу на C# за 7 дней. А программисты C# могут так же на C++?
- где в c++ free proffesional 5 прописывать пути нахождения библиотек? искал в tools но чето не могу найти ((
- Даны 3 целых числа найти среднее язык #C
- Не могу найти ошибку c++
- Визуализация "Не могу найти в сети VRAY для 3DS MAX 2010 32bit."
- Где я могу найти хорошие бесплатные скрипты социальных сетей, интернет магазинов, Форумов. . ?
- Не могу найти в интернете