Как нормализовать сетку в -1 к 1, а затем вернуться из нормализованной сетки в исходную?

У меня есть модель сетки в формате 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); // размерность должна совпадать с исходной сеткой

Как мне это сделать?

0

Решение

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

Наиболее интуитивный способ решения вашей проблемы, вероятно, таков:

  1. определить минимальное и максимальное значение для всех трех координатных осей (т.е. x, y а также z). Эта информация содержится в восьми угловых вершинах вашего куба. Сохраните эти шесть значений в шести переменных (например, min_x, max_x, так далее.).

  2. Для всех точек 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),

  3. Делайте все, что вам нужно сделать на этой промежуточной сетке.

  4. Конвертировать все координаты 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 )
    
  5. Очистите любой беспорядок, который вы сделали, и продолжайте с остальной частью вашей программы.

Это так просто, вероятно, гораздо больше работы, чтобы выяснить, какая библиотека содержит эти функции, чем написать их самостоятельно.

3

Другие решения

Это просто — используйте функции формы. Вот одномерный пример для двух пунктов:

-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
3

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector