在我的程序中,我有一些立方体(简单,xyz位置,xyz大小)。我希望bo能够从其中一个立方体中‘减去’另一个立方体。
所以我的问题是,什么是一个好的通用数据结构来表示产生的3d对象,以及什么样的算法被用来从一个3d实体中减去另一个3D实体?
发布于 2010-10-08 07:29:41
这是一个非常普遍的问题,取决于你想知道关于固体的什么,以及你想要多快知道它。假设您只需要成员资格测试,这可能会起作用(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)
}
}这样做的好处是可以进行复合减法。例如,可以从solid A中减去solid B,然后从solid C中减去solid C,它将按预期工作。例如,如果有三个球体以原点和radius(A) < radius(B) < radius(C)为中心,您将获得包含在A中或包含在C中但不包含在B中的点。
例如,您还可以从球体中减去两个十二面体,然后将其减去一个立方体。这当然等同于从立方体中减去球体,然后再添加两个十二面体。
发布于 2010-10-08 07:19:48
我怀疑是否有一种标准的方式来表示那个级别的几何对象。
我记得Povray,一个开源的光线跟踪器,它有一种很好的文本语言来表示3D场景,并且包含了一套完整的几何操作(并集、交集等) "Constructive Solid Geometry";它相当灵活,但我怀疑它是否是您正在寻找的。此外,请记住,除了纯几何之外,光线跟踪器还需要处理一些更多的概念:纹理、灯光等。
https://stackoverflow.com/questions/3886536
复制相似问题