1

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

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

4

2 回答 2

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从实体中减去实体,它会按预期工作。例如,三个球体以原点和 为中心,您将获得包含在或包含在但不包含在 中的点。BBCradius(A) < radius(B) < radius(C)ACB

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

于 2010-10-07T23:29:40.727 回答
0

我怀疑是否有一种标准方法可以在该级别表示几何对象。

我记得Povray是一个开源的光线追踪器,它有一种很好的文本语言来表示 3D 场景,并且包括一整套几何操作(并集、交集等)“构造实体几何”;它非常灵活,但我怀疑它是您正在寻找的。此外,请记住,光线追踪器除了纯几何之外还有更多概念需要处理:纹理、灯光等。

于 2010-10-07T23:19:47.990 回答