Algorithm 如何表示/修改三维实体

Algorithm 如何表示/修改三维实体,algorithm,data-structures,3d,subtraction,solid-bodies,Algorithm,Data Structures,3d,Subtraction,Solid Bodies,在我的程序中,我有一些立方体(简单,xyz位置,xyz大小)。我希望bo能够从这些立方体中取一个,然后从中“减去”另一个立方体 所以我的问题是,什么是一个好的通用数据结构来表示生成的三维对象,以及使用什么样的算法来从另一个三维实体中减去一个三维实体?我怀疑是否有一种标准的方法来表示该级别的几何对象 我记得,这是一个开源的光线跟踪器,它有一个很好的文本语言来表示3D场景,包括一整套几何操作(并集、交集等)”;它很灵活,但我怀疑这是你想要的。此外,请记住,光线跟踪器除了要处理纯几何图形外,还有一些其

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


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

我怀疑是否有一种标准的方法来表示该级别的几何对象


我记得,这是一个开源的光线跟踪器,它有一个很好的文本语言来表示3D场景,包括一整套几何操作(并集、交集等)”;它很灵活,但我怀疑这是你想要的。此外,请记住,光线跟踪器除了要处理纯几何图形外,还有一些其他概念需要处理:纹理、灯光等。

我怀疑是否存在在该级别表示几何对象的标准方法


我记得,这是一个开源的光线跟踪器,它有一个很好的文本语言来表示3D场景,包括一整套几何操作(并集、交集等)”;它很灵活,但我怀疑这是你想要的。此外,请记住,光线跟踪器还有一些概念需要处理,除了纯几何体:纹理、灯光等。

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

这具有允许复合减法的优点。例如,您可以从solid
B
中减去solid
A
,然后从solid
C
中减去solid
B
,它将按预期工作。例如,对于以原点为中心的三个球体和
radius(A)
,您将获得包含在
A
中或包含在
C
中但不包含在
B
中的点


例如,您还可以从球体中减去两个十二面体,然后再将其减去一个立方体。当然,这与从立方体中减去球体,再加上两个十二面体是一样的。

这是一个相当普遍的问题,取决于你想知道关于固体的什么,以及你想知道它的速度有多快。假设您只需要成员资格测试,这可能会起作用(psuedocode):

这具有允许复合减法的优点。例如,您可以从solid
B
中减去solid
A
,然后从solid
C
中减去solid
B
,它将按预期工作。例如,对于以原点为中心的三个球体和
radius(A)
,您将获得包含在
A
中或包含在
C
中但不包含在
B
中的点


例如,您还可以从球体中减去两个十二面体,然后再将其减去一个立方体。当然,这与从立方体中减去球体,再加上两个十二面体是一样的。

我认为这将适用于我正在做的工作,它与我已有的数据非常接近,一张胶合板,上面有各种各样的切口和孔。我想我只是假设它会变得更复杂。我想这将适用于我正在做的事情,它非常接近我已有的数据,一张胶合板,上面有各种各样的切口和孔。我想我只是认为事情会变得更复杂。
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)
    } 

}