Как представить / изменить 3D-тела - PullRequest
1 голос
/ 08 октября 2010

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

Итак, мой вопрос, что такое хорошая общая структура данных для представления результирующего трехмерного объекта и какой алгоритмиспользуется для вычитания 3d-тела из другого?

Ответы [ 2 ]

1 голос
/ 08 октября 2010

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

class Solid {
    Solid solids = [] // each Solid has a list of solids that  
                      // have been subtracted from it.                      

    abstract method containedInSelf(point) {
        // this will obviously vary from one type of solid to another
    } 

    method contains(point) {
        if !containedInSelf(point) return False;
        else {
            for solid in solids {  // loop over all contained solids
                if solid.contains(point) return False; 
                // point is contained in a solid that has been subtracted from it
            }
            // Now we know that point is contained but not contained in anything
            // that's been subtracted
            return True;
        }
    }

    method subtract(solid) {
        solids.append(solid)
    } 

}

Преимущество состоит в том, что вы можете составлять вычитания. Например, вы можете вычесть твердое A из твердого B, а затем твердое B из твердого C, и оно будет работать, как и ожидалось. Например, с тремя сферами по центру в начале координат и radius(A) < radius(B) < radius(C), вы получите очки, которые содержатся в A или содержатся в C, но не B.

Вы также можете, например, вычесть два додекаэдра из сферы и затем вычесть это кубу. Это, конечно, то же самое, что вычесть сферу из куба и добавить обратно два додекаэдра.

0 голосов
/ 08 октября 2010

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

Я напоминаю, что Povray , raytracer с открытым исходным кодом, который имеет хороший текстовый язык для представления 3D-сцени который включает в себя полный набор геометрических операций (объединение, пересечение и т. д.) " Конструктивная сплошная геометрия ";это довольно гибко, но я сомневаюсь, что это то, что вы ищете.Имейте в виду, кроме того, что у raytracer есть еще несколько концепций, помимо чистой геометрии: текстуры, источники света и т. Д.

...