Я пытаюсь реализовать алгоритм движущихся кубов в C ++ на основе этого описания:
http://paulbourke.net/geometry/polygonise/
Но я не понимаю, как вы рассчитываете значения «GRIDCELL». А точнее
double val[8];
часть не понятна для меня, что она делает. Я посмотрел на некоторые примеры, но они слишком сложны, и трудно понять, как эти значения вычисляются.
typedef struct {
XYZ p[8];
double val[8];
} GRIDCELL;
Как я понимаю, XYZ p [8]; координаты вершины для куба. Но что вал [8]; является?
Также не могли бы вы объяснить, как их рассчитать?
Спасибо!
Алгоритм марширующих кубов — это, как объяснено в связанном описании, алгоритм построения многоугольного представления из выборочных данных.
double val[8];
являются образцами для 8 вершин куба. Таким образом, они не вычисляются, они являются измерениями, например, от МРТ сканирует. Таким образом, алгоритм работает наоборот: возьмите набор измеренных чисел и постройте из него представление поверхности для визуализации.
Я провел небольшое исследование, и теперь я полностью понимаю алгоритм.
Во-первых:
Я не знал об этом, но теперь я.
Это значение просто представляет изоповерхность. Или, другими словами, плотность.
double val[8];
Для упрощения: от -1,0 до 0,0 воксел может быть сплошным или не сплошным.
Для значений ISO можно использовать, например, перлин / симплексный шум.
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);}