如何表示/修改三维实体

时间:2010-10-07 23:03:46

标签: algorithm data-structures 3d subtraction solid-bodies

在我的程序中,我有一些立方体(简单,xyz位置,xyz大小)。我希望能够从这些立方体中选择一个并从中“减去”另一个立方体。

所以我的问题是,什么是一个很好的通用数据结构来表示生成的3d对象,以及用什么样的算法从另一个中减去3d实体?

2 个答案:

答案 0 :(得分:1)

这是一个非常普遍的问题,取决于您想要了解的内容以及您想要了解它的速度。假设您只需要成员资格测试,这可能会起作用(伪代码):

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的点数。

例如,您还可以从球体中减去两个十二面体,然后将其减去立方体。这当然与从立方体中减去球体并添加两个十二面体相同。

答案 1 :(得分:0)

我怀疑在那个级别上有一种表示几何对象的标准方法。

我记得Povray是一个开源光线跟踪器,它有一个很好的文本语言来表示3D场景,其中包括一套完整的几何操作(联合,交集等)“Constructive Solid Geometry “;它非常灵活,但我怀疑它是你在寻找什么。另外,请记住,除了纯粹的几何形状外,光线跟踪器还有更多的概念需要处理:纹理,灯光等。