Как я могу проверить, если заданное дерево BSP оптимально? -- algorithm поле с участием 3d поле с участием bsp-tree пол Связанный проблема

How do I test if a given BSP tree is optimal?


3
vote

проблема

русский

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

по определению, лучшая глубина будет логотироваться2 (n) (или меньше, если сгруппированы совместные треугольники?) где n - количество треугольников в моей модели, а лучшая ширина будет n (смысл не имеет произошел). Но есть определенные конфигурации треугольников, для которых эта вершина никогда не будет достигнута.

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

Английский оригинал

I have a polygon soup of triangles that I would like to construct a BSP tree for. My current program simply constructs a BSP tree by inserting a random triangle from the model one at a time until all the triangles are consumed, then it checks the depth and breadth of the tree and remembers the best score it achieved (lowest depth, lowest breadth).

By definition, the best depth would be log2(n) (or less if co-planar triangles are grouped?) where n is the number of triangles in my model, and the best breadth would be n (meaning no splitting has occurred). But, there are certain configurations of triangles for which this pinnacle would never be reached.

Is there an efficient test for checking the quality of my BSP tree? Specifically, I'm trying to find a way for my program to know it should stop looking for a more optimal construction.

</div
        

Список ответов

3
 
vote
vote
Лучший ответ
 

Строительство оптимального дерева - это проблема с НП. Определение Если данное дерево оптимально, по сути та же проблема.

Из этого BSP FAQ :

Проблема является одним из расщеплений против дерево балансировка. Это взаимно Эксклюзивные требования. Вам следует Выберите свою стратегию для строительства Хорошее дерево на основе того, как вы собираетесь Используйте дерево.

 

Construction of an optimal tree is an NP-complete problem. Determining if a given tree is optimal is essentially the same problem.

From this BSP faq:

The problem is one of splitting versus tree balancing. These are mutually exclusive requirements. You should choose your strategy for building a good tree based on how you intend to use the tree.

</div
 
 
 
 
2
 
vote

Случайно строить деревья BSP до тех пор, пока вы не будете на самом деле, действительно неэффективны.

Вместо того, чтобы выбрать TRI наугад, чтобы использовать в качестве сплит-плоскости, вы хотите попробовать несколько (может быть, все они или, возможно, случайные выборки) и выберите один в соответствии с некоторыми эвристическими. Эуристика обычно основана на (а), насколько сбалансированы полученные дочерние узлы, а (б) сколько TRIS он будет разделен.

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

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

 

Randomly building BSP trees until you chance upon a good one will be really, really inefficient.

Instead of choosing a tri at random to use as a split-plane, you want to try out several (maybe all of them, or maybe a random sampling) and pick one according to some heuristic. The heuristic is typically based on (a) how balanced the resulting child nodes would be, and (b) how many tris it would split.

You can trade off performance and quality by considering a smaller or larger sampling of tris as candidate split-planes.

But in the end, you can't hope to get a totally optimal tree for any real-world data so you might have to settle for 'good enough'.

</div
 
 
 
 
1
 
vote
    .
  • Постарайтесь выбирать самолеты, которые (потенциально могут) расщеплять самые плоскости в виде расщепленных самолетов. Расщепляющиеся плоскости не могут быть разделены.
  • Попробуйте выбрать самолет, близкий к тому же количеству самолетов, спереди как в спине.
  • Попробуйте выбрать самолет, который не вызывает слишком много расщеплений.
  • Попробуйте выбрать плоскость, который является Coplanar с большим количеством других поверхностей

Вам придется попробовать эти критерии и придуматься с системой оценки, чтобы решить, какой из них, скорее всего, будет хорошим выбором для плоскости расщепления. Например, тем дальше баланс, тем больше оценка его теряет. Если это приводит к 20 расколам, то штраф составляет -5 * 20 (например). Выберите тот, который оценивает лучшее. Вам не нужно образец каждого многоугольника, просто искать довольно хороший.

 
  • Try to pick planes that (could potentially) get split by the most planes as splitting planes. Splitting planes can't be split.
  • Try to pick a plane that has close to the same number of planes in front as in back.
  • Try to pick a plane that doesn't cause too many splits.
  • Try to pick a plane that is coplanar with a lot of other surfaces

You'll have to sample this criteria and come up with a scoring system to decide which one is most likely to be a good choice for a splitting plane. For example, the further off balance, the more score it loses. If it causes 20 splits, then penalty is -5 * 20 (for example). Choose the one that scores best. You don't have to sample every polygon, just search for a pretty good one.

</div
 
 
 
 

Связанный проблема

5  Найти максимальные бийкики  ( Finding maximal bicliques ) 
У меня есть проблема, которую я смог моделировать как нахождение максимальных бийкликов (полные двусторонние графики) в бипарттовом графике. Я знаю, что алгор...

0  Как я могу получить родитель в бинарном дереве  ( How can i get the parent in binary tree ) 
Как я могу получить родителя в двоичном дереве в этом коде? Я написал это: <код> public class Node { public string state; public Node Left; pu...

15  Рассчитать, какие продукты вместе доставят запрошенную силу  ( Calculate which products together would deliver the requested power ) 
Допустим, у меня есть три продукта: <Сильный> Продукт A Доставит 5 власти. Стоит 50. Product B доставит 9 мощность. Стоит 80. <Сильный> продукт C до...

1  В Scala, какой правильный способ сортировки списка на композитный ключ  ( In scala what is the right way to sort a list on a composite key ) 
Я пытаюсь получить лучшие элементы N-1 из списка. Я прошел через подобные посты в так, как здесь . Я понял мотивы за решениями, предложенными на этих постах....

3  Алгоритм быстрее чем BMH (Boyer-Moore-Harspool)  ( Algorithm faster than bmh boyer moore horspool search ) 
Какой алгоритм вы бы использовали для поиска коротких подстроек в коротких текстах? К метку я имею в виду 5-10 символов для подстроки и 255 для строки. Я дума...

5  Максимальная щедрость от двух путей через прямоугольную сетку  ( Maximum bounty from two paths through a rectangular grid ) 
Я пытаюсь решить проблему, похожую на это Проблема в GeeksForGeeks , но другой: Учитывая прямоугольную 2-D сетку с некотором значением монеты, присутствующе...

6  Теоретически, находит_енди параллельно?  ( In theory is find end parallelizable ) 
В настоящее время я работаю над open -Под предложению Для достижения параллельной функциональности проекту я работаю, но я столкнулся с дорожным блоком с f...

10  Сумма продуктов для нескольких списков в Python  ( Sum of products for multiple lists in python ) 
Попытка имитировать функцию Sumproduct Excel: <код> SUMPRODUCT(v1, v2, ..., vN) = v1[0]*v2[0]*...*vN[0] + v1[1]*v2[1]*...*vN[1] + ... + v1[n]*v2[n]*...*...

3  Функциональные учебные проблемы  ( Functional learning woes ) 
Я начинающий к функциональным языкам, и я пытаюсь зацепить все это в Haskell. Вот быстроразъемная функция, которая находит все факторы номера: <код> factors...

0  Анимация холста, проблема с расчетами математики в моем коде JavaScript  ( Canvas animation issue with math calculations in my javascript code ) 
<Сильная> идея: Привет, это мой первый эксперимент с холстом анимацией. Я не уверен, что эта концепция уже существует, но я назвал мою версию «Двухугосудар...

14  Структура космического эффекта в памяти для отсортированного текста поддерживает префикс поиска  ( Space efficient in memory structure for sorted text supporting prefix searches ) 
У меня есть проблема: мне нужен космический поиск файловой системы, основанных на префиксе файлового пути. Преобразование поиска отсортированного текста, друг...

0  Обнаружить, когда последний товар в массиве пришел к остановке  ( Detect when the last item in an array has come to a stop ) 
У меня есть массив спрайтов, которые я анимирую, увеличивая свой свойство RotationX. Для них я хочу, чтобы они все исчезнули после того, как последний элеме...

255  Самый эффективный способ реализации целочисленной функции питания POW (INT, INT)  ( The most efficient way to implement an integer based power function powint int ) 
Что является наиболее эффективным способом поднять целое число к силе другое целое число в C? <код> // 2^3 pow(2,3) == 8 // 5^5 pow(5,5) == 3125 ...

1  OpenCV: алгоритм для простого вращения и уменьшения изображения  ( Opencv algorithm for simple image rotation and reduction ) 
Я пробовал вращение и уменьшение изображения (JPEG) с <Код> getRotationMatrix2D(center, angle, scale); и <код> warpAffine(image1, image3, rotation, image3.si...

0  FFT фундаментальный расчет частоты от Lomontfft  ( Fft fundamental frequency calculation from lomontfft ) 
Я использую lomontfft с http://www.lomont.org/ Программное обеспечение / MISC / FFT / LOMONTFFT.HTML Чтобы получить фундаментальную частоту от выборных знач...

Связанный проблема

5  Найти максимальные бийкики 
0  Как я могу получить родитель в бинарном дереве 
15  Рассчитать, какие продукты вместе доставят запрошенную силу 
1  В Scala, какой правильный способ сортировки списка на композитный ключ 
3  Алгоритм быстрее чем BMH (Boyer-Moore-Harspool) 
5  Максимальная щедрость от двух путей через прямоугольную сетку 
6  Теоретически, находит_енди параллельно? 
10  Сумма продуктов для нескольких списков в Python 
3  Функциональные учебные проблемы 
0  Анимация холста, проблема с расчетами математики в моем коде JavaScript 
14  Структура космического эффекта в памяти для отсортированного текста поддерживает префикс поиска 
0  Обнаружить, когда последний товар в массиве пришел к остановке 
255  Самый эффективный способ реализации целочисленной функции питания POW (INT, INT) 
1  OpenCV: алгоритм для простого вращения и уменьшения изображения 
0  FFT фундаментальный расчет частоты от Lomontfft