2010-10-07 49 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」;它非常靈活,但我懷疑它是你在尋找什麼。請記住,除了純幾何外,光線追蹤器還有一些更多的概念需要處理:紋理,燈光等。