接手三維地質建模系統編製的項目時,我只是一個很菜鳥的業餘編程愛好者,但我對於這個項目高度興趣,不管結果如何,參與這個項目的過程就很有意思。
語言選擇:c++。選擇c++是考慮到c++可以向下相容c,同時兼具物件導向的特徵。
IDE:本來打算利用VC++6.0,因為VC++6.0是目前的主流開發三維可視化的IDE,不過使用難度較大,而且我們領導用的是C++ BUILDER,C++ BUILDER具有上手快、製作介面簡易的優點,於是選擇用BCB了。
三維圖形庫:利用open graphics library(opengl),至於Open Inventor(OIV),暫時不打算用,在開發過程中如果OPENGL用得比較好了再考慮是否用OIV。
主要痛點:
(1)地質三維建模方法:地質體是一個三維的、非均質性非常明顯的複雜體,和CAD系統相比建模方法要複雜很多。
(2)三維地質模型的三維顯示與互動:特別是互動功能的實現比較困難。
(3)對海量資料的處理:地質體三維數字化資料是非常龐大的,一個地層就動輒數十、上百萬個離散點。
自頂向下的目標分解思路:
三維地質建模系統是一個很龐大的軟體工程,如果不進行目標分解來逐步達成的話,實現起來將會遙遙無期。1961年,美國為了實現1970年登上月球曾經制定了詳細的登月計劃:
(1)發射火箭到大氣層;
(2)環繞地球;
(3)發射火箭,環繞月球;
(4)月球著陸器從火箭中分離,在月面降落;
(5)月球著陸器離開月球,與軌道艙會合;
(6)返回地球;
(7)進入大氣層;
(8)返回艙安全墜入大海。
然後每一個階段目標更進一步地分解為更小的目標,果然在1969年,人類首次登陸月球。
我們進行的目標分解過程如下:
(1)建立一個100×100×100的資料體,實現多層地層建模。
進一步分解:
①給定100個地層層面離散點,將地質資料體分為兩個層塊,實現對兩個層塊分別進行屬性值插值。
②給定少於100個離散點,自動延拓到資料體邊界。
③給定多於100個離散點,自動裁剪到資料體邊界。
④增加一個與上一個地層近平行不相接的地層層面,將地質資料體分為三個層塊,實現對三個層塊分別進行屬性值插值。
⑤增加一個與上一個地層部分相接的地層層面,將地質資料體分為三個層塊,實現對三個層塊分別進行屬性值插值。
⑥實現任意多層層面任意拓撲關係的地質建模和屬性插值演算法。
(2)建立一個100×100×100的資料體,實現地層-斷層混合建模。
進一步分解:
①實現一個地層面與一個斷層面的相交線的求取演算法
②實現根據一對相交線對一個地層進行撕裂的演算法,並分塊進行屬性值插值。
③實現根據一對相交線對多個地層進行撕裂的演算法,並分塊進行屬性值插值。
④實現根據兩對相交線對多個地層進行撕裂的演算法,並分塊進行屬性值插值。
⑤實現根據任意多個相交線對多個地層進行撕裂的演算法,並分塊進行屬性值插值。
(3)建立一個10000×10000×10000的資料體,實現地層-斷層混合建模。
進一步分解:
①將未經處理資料進行抽稀,使每個層面的資料少於等於10000.
②利用記憶體映射的技術對資料進行簡單操作。
③將第二步驟的演算法用記憶體映射的技術進行演算法重新編寫。
(4)實現三維地質模型的三維顯示。
(5)實現三維地質模型的三維互動(即時查詢與修改模型)