Алгоритм для наименьшего количества прямоугольников неправильной формы - PullRequest
3 голосов
/ 10 января 2011

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

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

например (где X обозначает место размещения куба)

OOOXXXOOOO
OOXXXXXXXO
OOXXXXXXXO
OOXXXXOOOO

в настоящее время будет представлено как 21 кубили 252 треугольника, тогда как его можно легко представить в виде (где каждая буква обозначает часть прямоугольника)

OOOAAAOOOO
OOBAAACCCO
OOBAAACCCO
OOBAAAOOOO

, что представляет собой всего лишь 3 прямоугольника или 26 треугольников.

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

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

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

1 Ответ

0 голосов
/ 10 января 2011

Может быть, что-то вроде "октри", например:

Создайте сетку 64x64x64 поверх своей сетки 128x128x128, чтобы каждая ячейка первой сетки содержала ячейки высоты второй.

Для каждой ячейки сетки размером 64x64x64 выполните следующее:

  • Если ячейки, содержащие высоту, имеют одинаковое значение, поместите это значение в сетку 64x64x64.
  • В противном случае нарисуйте каждую ячейку отдельно и поместите -1 в сетку 64x64x64.

Теперь создайте сетку 32x32x32 поверх сетки 64x64x64 и повторите.

Затем 16x16x16, 8x8x8, 4x4x4, 2x2x2, 1x1x1, и все готово:)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...