У меня есть ряд точек, которые образуют облако точек. Мне нужно вычислить вектор нормали в каждой точке и навести луч из этой точки в направлении вектора нормали. Какой тип формулы мне нужно использовать для вычисления вектора нормалей в этой ситуации?
РЕДАКТИРОВАТЬ*
У меня есть ряд точек (x, y, z), которые образуют облако точек (назовите это A), который формирует форму полусферы. У меня также есть еще одно облако точек (назовите это B), к которому я подгонял поверхность, которая образует еще одну полусферу, которая вписывается в A. Я хочу измерить длину, на которой эти поверхности находятся далеко друг от друга, поэтому мой план направить луч из каждой точки A на поверхность B и измерить точку пересечения с этой точкой. Я надеюсь, что это объяснение делает мой вопрос более ясным.
Спасибо вам за помощь!
У вас есть сетка, чтобы вы знали, с какими другими локальными точками связана точка?
В этом случае нормаль в точке — это среднее (т.е. нормализованное к единичному вектору единица) перекрестное произведение между каждой парой линий, встречающихся в точке.
Можете ли вы установить соответствие между двумя сетками? То есть для каждой точки в сетке A есть соответствующая точка в сетке B в другом месте в результате перемещения / масштабирования / вращения. Если так, то вы можете использовать Анализ протоков найти оптимальные матрицы преобразования перевода / масштабирования / вращения между двумя облаками. В примере, представленном в OP, масштабирующая матрица может показать расстояния между двумя ячейками.
Если две сетки произвольны, то лучший алгоритм, который я могу придумать, — это сначала поместить оба облака точек в одно и то же дерево октав. Отсюда вы можете выполнить итерацию по каждой точке сетки A и найти ближайшую точку сетки B. «Минимальное расстояние между двумя сетками» — это минимальное расстояние, найденное между 2 точками после итерации.
Альтернативой 2 является итерация грубой силы по всем пунктам:
double min=BIG_NUMBER;
for(Point a : meshA)
for(Point b : meshB)
if(dist(a,b)<min) min=dist(a,b);