接手三維地質建模系統編制的項目時,我只是一個很菜鳥的業余編程愛好者, 但我對於這個項目很感興趣,不管結果如何,參與這個項目的過程就很有意思。
語言選擇: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)實現三維地質模型的三維交互(實時查詢與修改模型)