Вопрос

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

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

Это было полезно?

Решение

Это довольно общий вопрос и зависит от того, что вы хотите знать о твердом теле и насколько быстро вы хотите это знать. Предполагая, что вы хотите только тесты членства, это может работать (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.

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

Другие советы

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

Я вспоминаю это Поврайский, Raytracer с открытым исходным кодом, у которого есть хороший текстовый язык для представления трехмерных сцен, и который включает в себя полный набор геометрических операций (объединение, пересечение и т. Д.) »Конструктивная твердая геометрия«; Это довольно гибко, но я сомневаюсь, что это то, что вы ищете. Медведись, кроме того, что у Raytracer есть еще концепции, помимо чистой геометрии: текстуры, огни и т. Д.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top