У меня есть модель сетки в формате X, Y, Z. Скажем так.
Points *P;
На первом этапе я хочу нормализовать эту сетку в (-1, -1, -1) к (1, 1, 1).
Здесь нормализовать означает поместить эту сетку в блок от (-1, -1, -1) до (1, 1, 1).
Затем, после этого, я делаю некоторую обработку для нормализованной сетки, и, наконец, я хочу вернуть размеры, аналогичные исходным сеткам.
шаг 1:
P = размеры оригинальной сетки;
шаг 2:
nP = нормализовать (P); // из (-1, -1, -1) в (1, 1, 1)
шаг 3:
cnP = сделать что-то с (nP), количество вершин увеличилось или уменьшилось.
шаг 4:
Исходные размеры сетки = Revert (cnP); // размерность должна совпадать с исходной сеткой
Как мне это сделать?
Я знаю, как легко можно потеряться в программировании и полностью упустить простоту основной математики. Но поверьте мне, это действительно просто.
Наиболее интуитивный способ решения вашей проблемы, вероятно, таков:
определить минимальное и максимальное значение для всех трех координатных осей (т.е. x
, y
а также z
). Эта информация содержится в восьми угловых вершинах вашего куба. Сохраните эти шесть значений в шести переменных (например, min_x
, max_x
, так далее.).
Для всех точек p = (x,y,z)
в сетке, вычислить
q = ( 2.0*(x-min_x)/(max_x-min_x) - 1.0
2.0*(y-min_y)/(max_y-min_y) - 1.0
2.0*(z-min_z)/(max_z-min_z) - 1.0 )
сейчас q
равняется p
переведено в интервал (-1,-1,-1) -- (+1,+1,+1)
,
Делайте все, что вам нужно сделать на этой промежуточной сетке.
Конвертировать все координаты q = (xx, yy, zz)
вернуться к исходной сетке, выполнив обратную операцию:
p = ( (xx+1.0)*(max_x-min_x)/2.0 + min_x
(yy+1.0)*(max_y-min_y)/2.0 + min_y
(zz+1.0)*(max_z-min_z)/2.0 + min_z )
Очистите любой беспорядок, который вы сделали, и продолжайте с остальной частью вашей программы.
Это так просто, вероятно, гораздо больше работы, чтобы выяснить, какая библиотека содержит эти функции, чем написать их самостоятельно.
Это просто — используйте функции формы. Вот одномерный пример для двух пунктов:
-1 <= u <= +1
x(u) = x1*(1-u)/2.0 + x2*(1+u)/2.0
x(-1) = x1
x(+1) = x2
Вы можете преобразовать между системами координат, используя Якобиан.
Давайте посмотрим, как это выглядит в 2D:
-1 <= u <= =1
-1 <= v <= =1
x(u, v) = x1*(1-u)*(1-v)/4.0 + x2*(1+u)*(1-v)/4.0 + x3*(1+u)*(1+v)/4.0 + x4*(1-u)*(1+v)/4.0
y(u, v) = y1*(1-u)*(1-v)/4.0 + y2*(1+u)*(1-v)/4.0 + y3*(1+u)*(1+v)/4.0 + y4*(1-u)*(1+v)/4.0