2015-05-20 3 views
5

как проследить изоповерхность на более высокое пространстве эффективноизоповерхности отслеживание в высоких измерениях

+0

Как вы ожидаете, что решение будет представлено? Я предполагаю, что ваш текущий подход дает вам 3 кривые, а не поверхность, но я могу ошибаться. –

+0

@YvesDaoust Это дает поверхности не 3 только 3 кривых. Я хочу набор изотопов. – CRM

+0

Если вы не предоставляете больше информации, я не могу вам помочь. –

ответ

1

вас есть функция затрат скаляра в Н размеров,

е ( у- , y , .., y N) ε ℝ,   у ε ℝ

, но выборка только в регулярной прямоугольной сетке,

у к = Ψ к + ψ к x k,   константы Ψ к ε ℝ и ψ к ε ℝ и сетки координат х K е ℕ

и проблема, чтобы найти изоповерхность (ы) I,

е ( г. , у , .., у N) = С я

Прямой подход был бы просто цикл по каждой ячейке в сетку и проверить, пересекает ли текущая изоповерхность текущая ячейка, и если да, описать часть изоповерхности в текущей ячейке. (Маршевые кубы - это один из подходов к описанию того, как изоповерхность пересекает каждую ячейку сетки.)

Ограничение здесь заключается в том, чтобы использовать поиск по соседству вместо проверки каждой ячейки.

OP был previous question специально для 3D-случая, к которому я posted ссылку на пример кода, grid.h и grid.c (в Pastebin.com, потому что они были слишком длинными, чтобы включать в себя встроенный).

Эта реализация полностью отличается от метода разрезания ОП. Мой - это прямое, простое прохождение по ячейкам сетки, пересекающим текущую изоповерхность.Он кэширует образцы сетки и использует отдельную карту (один из на ячейку ячейки), чтобы отслеживать, какие ячейки сетки были кэшированы, прошли и/или нажали в стек, чтобы пройти позже. Этот подход легко распространяется на более чем три измерения. Хотя код написан точно для трех измерений, сам подход не является специфическим для трех измерений; все, что вам нужно сделать, это настроить структуры данных для размещения любого (разумного) количества измерений.

Самоизогнутая прогулка является тривиальной. Вы начинаете с любой ячейки сетки, пересекая изоповерхность, затем исследуйте все ячейки ближайшего соседа, чтобы увидеть, пересекает ли их изоповерхность. На практике вы используете стек ячеек ячейки сетки для проверки и карту фреймов ячейки сетки, чтобы избежать повторного изучения уже рассмотренных ячеек сетки.

Поскольку число выборок точек сетки на ячейку сетки равно 2 N, мой примерный код не является оптимальным: множество соседних точек сетки в конечном итоге оценивается, чтобы увидеть, пересекаются ли соседние ячейки сетки изоповерхности. (Вместо того, чтобы рассматривать только точки сетки, ограничивающие изоповерхность, рассматриваются узлы сетки, принадлежащие клеткам сетки, окружающим изоповерхность.) Эта дополнительная работа растет экспоненциально, так как N увеличивается.

Лучше было бы рассмотреть каждый из 2 N возможно ( N -1) -граней отдельно, чтобы избежать изучения клеток изоповерхности не пересекаются вообще.

В N-мерном регулярной прямоугольной сетки, каждая ячейка представляет собой N-мерный параллелепипед, определяется по точкам сетки 2 N в вершинах (углах). В Н -cuboid клетки имеют N ( N -1) двухмерные грани и 2 N ( N -1) -мерных граней.

Для изучения каждого ( N -1) -Лицо, вам необходимо изучить функцию стоимости на 2 N -1 точек сетки, определяющих, что ( N -1) -Лицо. Если функция стоимости в этих точках охватывает изоповерхностное значение, то изоповерхность пересекает поверхность ( N -1), а изоповерхность также пересекает следующую ячейку сетки в этом направлении.

Есть две ( N -1) -граундов, перпендикулярных каждой оси. Если изоповерхность пересекает ( N -1) -покрытие ближе к отрицательной бесконечности, то изоповерхность также пересекает следующую ячейку сетки вдоль этой оси в сторону отрицательной бесконечности. Аналогично, если изоповерхность пересекает ( N -1) -поверхность ближе к положительной бесконечности, то она также пересекает следующую ячейку сетки вдоль этой оси в сторону положительной бесконечности. Таким образом, ( N -1) -верхны идеально подходят для определения того, какие соседние ячейки следует исследовать или нет. Это верно, потому что ( N -1) -поля - это точно набор точек сетки, которыми разделяют две ячейки.

Я очень сомневаюсь предоставить пример кода C, потому что примерный код того же подхода для 3D-приложения, похоже, пока не помог никому.Я боюсь, что более длинное объяснение с использованием двух- и трехмерных иллюстраций для иллюстрации потребуется для описания подхода в легко понятных терминах; и без твердого понимания логики, любой примерный код выглядел бы как gobbledygook.

1

Лучше использовать библиотеку для 2 измерений, вы можете попробовать алгоритм conrec от профессора Пола Бурка. Это похоже на маршевый куб.

Смежные вопросы