Алгоритм марширующих кубов C ++ Объяснение

Я пытаюсь реализовать алгоритм движущихся кубов в C ++ на основе этого описания:

http://paulbourke.net/geometry/polygonise/

Но я не понимаю, как вы рассчитываете значения «GRIDCELL». А точнее

 double val[8];

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

typedef struct {
XYZ p[8];
double val[8];
} GRIDCELL;

Как я понимаю, XYZ p [8]; координаты вершины для куба. Но что вал [8]; является?
Также не могли бы вы объяснить, как их рассчитать?

Спасибо!

1

Решение

Алгоритм марширующих кубов — это, как объяснено в связанном описании, алгоритм построения многоугольного представления из выборочных данных.

double val[8];

являются образцами для 8 вершин куба. Таким образом, они не вычисляются, они являются измерениями, например, от МРТ сканирует. Таким образом, алгоритм работает наоборот: возьмите набор измеренных чисел и постройте из него представление поверхности для визуализации.

2

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

Я провел небольшое исследование, и теперь я полностью понимаю алгоритм.

Во-первых:

  • Воксель представляет значение на регулярной сетке в трехмерном пространстве.

Я не знал об этом, но теперь я.

Это значение просто представляет изоповерхность. Или, другими словами, плотность.

double val[8];

Для упрощения: от -1,0 до 0,0 воксел может быть сплошным или не сплошным.

Для значений ISO можно использовать, например, перлин / симплексный шум.

1

Te val — это уровень «заряда» для каждой вершины ячейки, он зависит от формы, которую вы хотите создать.
например: если вы хотите сделать шар, вы можете выбрать значения по формуле:

 for (int l = 0; l < 8; ++l){
float distance = sqrtf(pow(cell.p[l].x - chargepos.x, 2.0) + pow(cell.p[l].y - chargepos.y, 2.0) + pow(cell.p[l].z - chargepos.z, 2.0));

cell.val[l] = chargevalue /pow(distance, 2.0);}
1
По вопросам рекламы [email protected]