Войти
ПрограммированиеФорумОбщее

Найти ближайшую точку на поверхности

#0
8:57, 24 ноя. 2016

Всем доброго времени суток! Столкнулся, в общем, с небольшой проблемой. Необходимо найти ближайшую точку на поверхности, которая описана треугольником, до другой точки, которая не лежит в плоскости данной поверхности. Поиск, к сожалению не дал желаемых результатов. Какие есть идеи по решению этой задачи?)


#1
10:17, 24 ноя. 2016

Kurandx
Расстояние от точки до плоскости треугольника = ax+by+cz+d (a, b, c - нормаль плоскости), ну и дальше рассматривать случаи внутри или вне.

#2
15:48, 24 ноя. 2016

Kurandx
> Какие есть идеи по решению этой задачи?)
Подучить аналитическую геометрию. Серьёзно. Если возникают такие задачи, то она Вам пригодится ещё не раз.

Задайте в плоскости два вектора. Учитывая, что Вам нужно только расстояние - всё равно, как их задавать. Очевидно, это два вектора, построенные на трёх точках Вашего треугольника x1x2x3.
Делаете векторное произведение и нормируете его на модуль.
Получаете нормаль (nx,ny,nz).
Строите векторное уравнение плоскости как (a-x1)*n = 0 - скалярное произведение векторов, а - произвольная точка в плоскости.
И теперь ведёте с точки Х расстояние от которой ищите вдоль нормали линию v = kn + X, очевидно, пересечение с плоскостью будет точка v = a-x1 и тогда умножив это на нормаль получим
kn*n + X*n = 0
и искомое расстояние до плоскости:
k = |X*n|
(вроде как нигде не наошибался - я умею :) Проверьте, при необходимости)

#3
16:52, 24 ноя. 2016

Большое спасибо, очень помогли!!!)))

#4
17:04, 24 ноя. 2016
Capture | Найти ближайшую точку на поверхности

Дано:
Треугольник ABC и некоторая точка D.

Найти:
Точку Е, которая является проекцией точки D на плоскость, заданную треугольником ABC.

Решение:
Пусть вектор AF - единичная нормаль к плоскости треугольника. Чтобы его получить, векторно перемножим любые две стороны треугольника (что даст нам перпендикуляр к плоскости) и полученный вектор нормализуем:

1) AF = (AB×AC) / |AB×AC|

Точка E является проекцией точки D на плоскость треугольника, поэтому вектор ED тоже перпендикулярен этой плоскости, как и вектор AF.

Поскольку AF - единичный вектор, его скалярное произведение на вектор AD даст нам длину проекции вектора AD на вектор AF, т.е. длину вектора ED:

2) |ED| = AF · AD

Теперь мы знаем координаты точки D, длину отрезка ED и то, что он направлен так же, как вектор AF. Отсюда находим координаты точки E:

3) E = D + DE
4) E = D - ED
5) E = D - AF * |ED|

где точка D известна, а значения AF и |ED| уже найдены в (1) и (2).

--
В зависимости от системы координат (правосторонней или левосторонней) и выбранного соглашения, в какие стороны направлены вектора X Y Z в этой системе координат,  вектор AF в формуле (1) может оказаться направлен как вверх, как на картинке, так и в противоположную сторону. Если окажется, что формула (5) даёт точку Е не в плоскости треугольника, а где-то ещё, то минус в формуле надо будет изменить на плюс.

#5
1:35, 25 ноя. 2016

alexzzzz
У тебя задача неверно сформулирована: надо найти такую точку E, которая лежит внутри треугольника и является ближайшей к точке D. При этом проекция точки D на плоскость может лежать за пределами треугольника.

#6
2:12, 25 ноя. 2016

Kurandx
> найти ближайшую точку на поверхности, которая описана треугольником, до другой
> точки,

искать надо 1 одну точку и всё.(взять точку N из области  и постановить точка N принадлежит данному треугольнику  . или не принадлежит) .?. 2 определить какие-то две точки и найти расстояние (R=formula) между этими самыми какими то двумя точками ?

#7
2:22, 25 ноя. 2016

Wraith
> надо найти такую точку E, которая лежит внутри треугольника и является
> ближайшей к точке D

А хз, внутри или нет. Формулировка задачи нечёткая.

#8
3:05, 25 ноя. 2016

Ну вообще да, нечеткая. Я подумал, что зачем говорить про треугольник, если надо просто найти проекцию на плоскость, заданную тремя точками.

#9
9:52, 25 ноя. 2016
О, это я жестоко протупил с условием задачи :) Чего-то меня переклинило, что надо найти расстояние от точки до плоскости... Наверное, сонный совсем вчера был...
Но подход тот же самый, надо просто искать тогда вектор a. Его найти чуть сложнее, но, по сути, логика та же.
ПрограммированиеФорумОбщее

Тема в архиве.