2010-10-07 53 views
1

在我的程序中,我有一些立方体(简单,xyz位置,xyz大小)。我希望博能够采取这些立方体之一,并从中减去另一个立方体。如何表示/修改3d实体

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

回答

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) 
    } 

} 

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

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

+0

我认为这将适用于我正在做的事情,它与我已有的数据非常接近,一张胶合板variouse削减和孔应用。我想我只是假定它会比这更复杂。 – Kratz 2010-10-08 20:50:53

0

我怀疑有一个标准的方式来表示在该级别的几何对象。

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