青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

eryar

PipeCAD - Plant Piping Design Software.
PlantAssistant - Translate AVEVA RVM/SP3D VUE to glTF, STEP, etc.
posts - 606, comments - 590, trackbacks - 0, articles - 0

Topology and Geometry in OpenCascade-Topology

Posted on 2013-09-21 14:59 eryar 閱讀(5975) 評論(2)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

Topology and Geometry in OpenCascade-Topology

eryar@163.com

摘要Abstract:本文簡要介紹了幾何造型中的邊界表示法(BRep),并結合程序說明OpenCascade中的邊界表示的具體實現,即拓樸與幾何的聯系。對具有幾何信息的拓樸結構頂點(vertex)、邊(edge)、面(face)進行了詳細說明。本文通過ACIS與OpenCascade進行對比來對拓樸(Topology)的概念進行說明。并通過示例程序,說明如何在OpenCascade中取得與一個拓樸對象相連的其他拓樸對象,包括父對象和子對象。

關鍵字Key Words:OpenCascade、ACIS、BRep、Topology、Geometry

一、引言 Introduction

邊界表示(Boundary Representation)也稱為BRep表示,它是幾何造型中最成熟、無二義的表示法。實體的邊界通常是由面的并集來表示,而每個面又由它所在的曲面的定義加上其邊界來表示,面的邊界是邊的并集,而邊又是由點來表示的。

邊界表示的一個重要特征是描述形體的信息包括幾何信息(Geometry)和拓樸信息(Topology)兩個方面。拓樸信息描述形體上的頂點、邊、面的連接關系,它形成物體邊界表示的“骨架”。形體的幾何信息猶如附著在“骨架”上的肌肉。例如,形體的某個面位于某一個曲面上,定義這一曲面方程的數據就是幾何信息。此外,邊的形狀、頂點在三維空間中的位置(點的坐標)等都是幾何信息,一般來說,幾何信息描述形體的大小、尺寸、位置和形狀等。

在邊界表示法中,邊界表示就按照體-面-環-邊-點的層次,詳細記錄構成形體的所有幾何元素的幾何信息及其相互連接的拓樸關系。這樣,在進行各種運算和操作中,就可以直接取得這些信息。

拓樸是指一個模型中的不同實體之間的關系,它描述了幾何實體之間的連接方式。拓樸定義了一個空間位置不固定的浮動模型。當拓樸實體與幾何信息關聯在一起時,它的空間位置才確定。

拓樸可以是有邊界的、沒邊界的和半封閉的,它允許實體是完全實體,也可以是不完全實體。例如,實體可以沒有面,面可以沒有邊,實體也可以從內部將它分割成殼的內部面。這種實體在物理世界中是不存在的,但在幾何造型內核中可以表現出來。

二、ACIS中的拓樸結構 Topology of ACIS

ACIS模型的邊界表示(B-Rep)是將模型的拓樸結構按層次分解成下述對象:

1. 體(Body):是實體對象的最高層次,是塊(lump)的集合。體可以是線、面、或實心體;

2. 塊(Lump):空間一維、二維或三維點連接而成的集合,與其他塊(lump)不關聯,其邊界由殼(shell)組成;

3. 殼(Shell):互聯的線或面的集合,它可以界定實體的外部或內部區域;

4. 子殼(Subshell):殼的進一步分解,用于處理內部處理算法的效率;

5. 面(Face):被一個或多個邊(edge)組成的環(loop)界定的曲面中的連通域。面可以是“雙向”的,這時它的厚度趨于無窮小。面也可以是“單向”的,這時面的法線指向面的外部,另一邊側是面的內部;

6. 環(Loop):面(face)的邊界中互相連接的部分,它由一系列的有向邊(coedge)組成。通常環是封閉的,沒有實際的開始和結束點,但是ACIS中的環可以是開環;

7. 線(Wire):沒有附著在面上的,連接在一起的有向邊(coedge);

8. 有向邊(Coedge):表示面(face)或線(wire)中對某個邊的引用;

9. 邊(Edge):與曲線關聯的拓樸,由頂點(vertex)界定。

10. 頂點(Vertex):點是幾何造型中的最基本元素。用計算機存儲、管理、輸出形體的實質就是對點集及其連接關系的處理。

wps_clip_image-6000

Figure 2.1 Topology of ACIS

上圖說明了概念上的拓樸對象之間的關系,這些對象組成了ACIS邊界表示方法的基礎。它們在ACIS中分別用類BODY、LUMP、SHELL、SUBSHELL、FACE、LOOP、WIRE、COEDGE、EDGE和VERTEX實現,這些類派生于類ENTITY。

ACIS通過在它的數據結構中整合了線框、曲面和實體這三種表示方法,將這三種不同的幾何體聯系在一起。線框實體可以和實體(solid)與面實體共享,它們可以是共享邊、有向邊與頂點。由于這種共存的實現,使ACIS具有了表示混合維度模型與各種各樣不封閉模型的能力,如一個平面可以只在3個方向上有邊界邊,另外一方向沒有邊界。

wps_clip_image-11877

Figure 2.2 Class Diagram of ACIS Topology

ACIS的對象都有包圍盒(Bound),這在求交運算中很有用,可以提高效率。如果兩個對象的包圍盒相交,那么這兩個對象則可能相交,然后再執行更精確的求交運算。如果兩個對象的包圍盒不相交,則這兩個對象一定不相交,這樣進一步的精確求交運算就不需要了。

既然拓樸表示了各對象之間的連接關系,那么給定一個對象時,可以容易得到其相連接其它對象。圖3說明了ACIS中組成實體、面、線和混合體的所有實體類,這些類及其方法提供了一個邊界表示造型器所必需的數據和方法。層次關系中向上和向下的指示說明這些類之間允許數據的快速切換,利用這種功能就可以確定兩個實體是否共享邊或頂點。從圖中可以看出拓樸類都有指向對應的幾何體類的指針。

wps_clip_image-8073

Figure 2.3 Topology structure of ACIS

從上圖可以看出,任意給定一個對象,可以快速獲得與其相連的其它對象,不管是向下還是向上。如給定一個FACE對象,可以通過loop()向下獲得LOOP對象;可以通過shell()向上獲得SHELL對象。

除了頂點以外,其他拓樸對象都有bound(),可以取得其包圍盒。

下面是統計一個模型中所有面的數量的程序,該程序就是利用拓樸類的公共成員函數來完成面的統計功能。通過這個程序來說明函數的使用方法。

wps_clip_image-11521

 

三、OpenCascade中的拓樸結構 Topology of OpenCascade

3.1 OpenCascade拓樸簡介 Introduction of OpenCascade Topology

OpenCascade中的拓樸(topology)是根據STEP標準ISO-10303-42設計的。也許讀一下這個標準中的有關概念還是很有幫助的。STEP ISO-10303-42的相關資源:

http://www.steptools.com/support/stdev_docs/express/step_irs/index.html

wps_clip_image-6429

Figure 3.1 Topology data structure in OpenCascade

wps_clip_image-12719

TopoDS_Shape由值控制,包含三個成員變量:myLocation、myOrient、myTShape。

wps_clip_image-16890

Figure 3.2 TopoDS_Shape member fields

其中TopoDS_TShape中包含與此對象相連接的子對象。

下圖所示為由一條邊連接的兩個面組成的殼(shell):

wps_clip_image-28930

Figure 3.3 Structure of a shell formed from two faces

上圖所示的形狀表示為TS, 面TF1和TF2,有七條邊TE1~TE7和六個頂點TV1~TV6。

環TW1引用邊TE1~TE4;環TW2引用TE4~TE7 。邊引用的頂點如下:TE1(TV1,TV4),TE2(TV1,TV2),TE3(TV2,TV3),TE4(TV3,TV4),TE5(TV4,TV5),TE6(TV5,TV6),TE7(TV3,TV6)。

wps_clip_image-14945

Figure 3.4 Data structure of the shell formed from two faces connected at an edge

注:OpenCascade中的這個數據結構中不包含“反向引用(back references)”,即所有的引用只從復雜形狀到簡單形狀。(Note that this data structure does not contain any “back references”. All references go from more comples underlying shapes to less complex ones.)有點有向圖的意思。

這個根據OpenCascade的拓樸結構的類圖可知,訪問形狀的子對象是很容易的。為了獲得一個對象的拓樸,不管是向上還是向下,OpenCascade提供了專門類和函數來實現。當向下訪問拓樸對象時,OpenCascacde提供了兩種方法來遍歷子對象。向上遍歷時,OpenCascade提供了一個靜態函數TopExp::MapShapesAndAncestors()來實現。以下分別對其進行說明。

3.2 遍歷子對象 Iteration over Children

遍歷子對象是向下來訪問拓樸關系。OpenCascade中遍歷一個形狀的子對象的兩個方法分別為:

l 直接使用類TopoDS_Iterator來遍歷:

Direct children can be retrieved using TopoDS_Iterator,如下函數可以訪問當前對象所有的子對象,不管子對象的類型。通過遞歸的方式來實現。

1 void TraverseShape(const TopoDS_Shape& theShape) 
2 
3     TopoDS_Iterator anIt(theShape); 
4     for ( ; anIt.More(); anIt.Next() ) 
5     { 
6         const TopoDS_Shape& aChild = anIt.Value(); 
7         TraverseShape(aChild); 
8     } 
9 

 

TopoDS_Iterator有兩個標志位,用于控制在查詢子對象時設定是否考慮父對象的位置和朝向(location and orientation)。若位置(location)標志設置為開,那么所有子對象返回的值就像它們是獨立的對象一樣,而且位置是在具有全局坐標系的三維空間中的位置。(例如用戶將看到單獨取出來的邊edge與其父對象環wire中顯示的位置是一樣的。)若朝向(orientation)標設置為開,則返回的子對象的朝向將會變成父對象的朝向與子對象朝向的乘積(例如,子對象和父對象兩者都是反向reversed或是向前forward,則結果仍然向前。向前與反向的任意組合結果都將為反向)。

若標志位為關,則子對象就只返回其自身保存的位置和朝向。默認情況下,兩個標志位都設置為開。

l 使用類TopExp_Explorer來遍歷指定類型的子對象:

若只想訪問形狀指定類型的子對象,可以使用類TopExp_Explorer來實現。如下程序所示為訪問對象的邊的功能。

1 TopExp_Explorer anExp(theShape, TopAbs_EDGE); 
2 
3 for (; anExp.More(); anExp.Next() ) 
4 
5     const TopoDS_Edge& anEdge = TopoDS::Edge(anExp.Current()); 
6     // do something with anEdge 
7 
8 

類TopExp_Explorer還有一個附加參數,可以用來指定要跳過的父對象類型。這個參數在下面的情況下很有用。例如只想取得“懸空”邊(floating edge, 即不屬于面的邊),就可用下面代碼來實現:

1 TopExp_Explorer aFloatingEdgeExp(theShape, TopAbs_EDGE, TopAbs_FACE); 

 

3.3 反向引用 Back references

在使用OpenCascade時,你可能也注意到了,或者根據類圖分析到拓樸對象包含其子對象,而不是相反的方式。這是可以理解的,同一個對象或者子對象可以屬于不同的對象。例如任意共享邊可以屬于至少兩個面。然而有時也需要從子對象追蹤到與其相連的父對象。在OpenCascade中提供了靜態函數TopExp::MapShapesAndAncestors()來實現這個功能。

1 TopTools_IndexedDataMapOfShapeListOfShape anEFsMap; 
2 TopExp::MapShapesAndAncestors (myShape, TopAbs_EDGE, TopAbs_FACE, anEFsMap); 

上面的代碼生成了myShape中面和邊之間的映射。若myShape是長方體,每一條邊會映射到兩個面上。若遍歷同樣的長方體,并在每一個面中盡力找到邊的父對象,那么明顯的該映射中一條邊只有一個面,也就是當前正在搜索的面。

 

四、示例程序 Example Code

1. 統計一個長方體面的數量

 1 /* 
 2 *    Copyright (c) 2013 eryar All Rights Reserved. 
 3 
 4 *        File    : Main.cpp 
 5 *        Author  : eryar@163.com 
 6 *        Date    : 2013-09-21 11:58 
 7 *        Version : 1.0v 
 8 
 9 *    Description : Count faces of a box.  
10 *                   
11 */ 
12 
13 // OpenCascade library. 
14 #define WNT 
15 #include <BRepPrimAPI_MakeBox.hxx> 
16 #include <TopExp_Explorer.hxx> 
17 #pragma comment(lib, "TKernel.lib"
18 #pragma comment(lib, "TKMath.lib"
19 #pragma comment(lib, "TKBRep.lib"
20 #pragma comment(lib, "TKTopAlgo.lib"
21 #pragma comment(lib, "TKPrim.lib"
22 
23 int main(void
24 
25     Standard_Integer nFaceCount = 0
26     TopoDS_Shape aBox = BRepPrimAPI_MakeBox(100150200); 
27 
28     for (TopExp_Explorer faceExp(aBox, TopAbs_FACE); faceExp.More(); faceExp.Next()) 
29     { 
30         nFaceCount++
31     } 
32 
33     std::cout << "The box has " << nFaceCount << " faces." << std::endl; 
34 
35     return 0
36 

程序輸出結果為:

1 The box has 6 faces. 

 

2. 反向訪問

 1 /*
 2 *    Copyright (c) 2013 eryar All Rights Reserved.
 3 *
 4 *        File    : Main.cpp
 5 *        Author  : eryar@163.com
 6 *        Date    : 2013-09-21 11:58
 7 *        Version : 1.0v
 8 *
 9 *    Description : Demonstrate how to access parent and child topology data
10 *       for a given topology shape.
11 *                  
12 */
13 
14 // OpenCascade library.
15 #define WNT
16 #include <BRepPrimAPI_MakeBox.hxx>
17 #include <TopExp_Explorer.hxx>
18 #include <TopoDS.hxx>
19 #include <TopExp.hxx>
20 #include <TopTools_ListOfShape.hxx>
21 #include <TopTools_ListIteratorOfListOfShape.hxx>
22 #include <TopTools_IndexedDataMapOfShapeListOfShape.hxx>
23 
24 #pragma comment(lib, "TKernel.lib")
25 #pragma comment(lib, "TKMath.lib")
26 #pragma comment(lib, "TKBRep.lib")
27 #pragma comment(lib, "TKTopAlgo.lib")
28 #pragma comment(lib, "TKPrim.lib")
29 
30 void dumpVertex(const TopoDS_Vertex& vertex)
31 {
32     gp_Pnt pnt = BRep_Tool::Pnt(vertex);
33 
34     std::cout << "(" << pnt.X() << "" << pnt.Y() << "" << pnt.Z() << ")" << std::endl;
35 }
36 
37 int main(void)
38 {
39     Standard_Integer nCount = 0;
40     TopoDS_Shape aBox = BRepPrimAPI_MakeBox(100150200);
41 
42     TopTools_IndexedDataMapOfShapeListOfShape shapeMap;
43     TopTools_ListOfShape edges;
44     TopTools_ListIteratorOfListOfShape edgeItr;
45 
46     // Use TopExp_Explorer to access subshapes.
47     TopExp_Explorer vertexExp(aBox, TopAbs_VERTEX);
48 
49     const TopoDS_Vertex& aVertex = TopoDS::Vertex(vertexExp.Current());
50 
51     // Use TopExp::MapShapesAndAncestors() to access parent shapes.
52     TopExp::MapShapesAndAncestors(aBox, TopAbs_VERTEX, TopAbs_EDGE, shapeMap);
53     
54     edges = shapeMap.FindFromKey(aVertex);
55 
56     dumpVertex(aVertex);
57 
58     for (edgeItr.Initialize(edges); edgeItr.More(); edgeItr.Next() )
59     {
60         const TopoDS_Edge& anEdge = TopoDS::Edge(edgeItr.Value());
61 
62         std::cout << "Vertex belong to the Edge: " << std::endl;
63         dumpVertex(TopExp::FirstVertex(anEdge));
64         dumpVertex(TopExp::LastVertex(anEdge));
65         std::cout << "---------------------------" << std::endl;
66     }
67 
68     return 0;
69 }

程序輸出結果:

 1 (00200)
 2 Vertex belong to the Edge:
 3 (000)
 4 (00200)
 5 ---------------------------
 6 Vertex belong to the Edge:
 7 (00200)
 8 (0150200)
 9 ---------------------------
10 Vertex belong to the Edge:
11 (00200)
12 (1000200)
13 ---------------------------
14 Vertex belong to the Edge:
15 (000)
16 (00200)
17 ---------------------------
18 Vertex belong to the Edge:
19 (00200)
20 (0150200)
21 ---------------------------
22 Vertex belong to the Edge:
23 (00200)
24 (1000200)
25 ---------------------------
26 Press any key to continue . . .

 

五、結論 Conclusion

OpenCascade中的拓樸關系不像ACIS中那樣直接,但是也提供了向下訪問子形狀、向上訪問父形狀的類和函數,使用起來要涉及到好幾個類,不是很方便。

當向上訪問與頂點相連接的邊時,有重復數據。

 

六、參考資料 References

1. Roman Lygin, OpenCascade notes, opencascade.blogspot.com

2. 詹海生等, 基于ACIS的幾何造型技術與系統開發, 清華大學出版社, 2002

3. 孫家廣等. 計算機圖形學. 清華大學出版社

4. OpenCascade source code.

 

Feedback

# re: Topology and Geometry in OpenCascade-Topology  回復  更多評論   

2013-09-22 18:18 by eryar
共同學習,,@大島小柚子

# re: Topology and Geometry in OpenCascade-Topology  回復  更多評論   

2013-09-22 15:52 by 大島小柚子
感謝分享。
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久久久久久欧美精品| 久久综合伊人77777| 久久婷婷麻豆| 欧美一区二区网站| 午夜欧美电影在线观看| 午夜精品视频在线观看| 羞羞色国产精品| 久久精品国产综合精品| 久久蜜桃香蕉精品一区二区三区| 久久免费精品日本久久中文字幕| 免费一级欧美片在线播放| 欧美激情网友自拍| 99热免费精品在线观看| 午夜亚洲福利在线老司机| 久久久久久免费| 欧美精品 日韩| 国产免费成人| 亚洲人被黑人高潮完整版| 亚洲一区二区三区中文字幕| 久久精品道一区二区三区| 欧美成人一区二区| 制服丝袜亚洲播放| 久久视频在线看| 欧美视频日韩视频在线观看| 国模套图日韩精品一区二区| 91久久在线播放| 亚洲欧美另类国产| 免费永久网站黄欧美| 亚洲少妇自拍| 美日韩精品免费观看视频| 国产精品一二| 亚洲精选在线| 久久成年人视频| 一本一本a久久| 一区在线播放视频| 影音先锋亚洲视频| 欧美成年人视频网站| 欧美激情国产日韩| 亚洲欧美国产精品桃花| 欧美aⅴ一区二区三区视频| 欧美三区美女| 亚洲国产女人aaa毛片在线| 午夜精品短视频| 亚洲国产精品一区| 日韩视频精品在线观看| 免费欧美高清视频| 好男人免费精品视频| 午夜精品久久久久久久蜜桃app | 亚洲一区二区三区高清不卡| 欧美成人国产一区二区 | 日韩系列欧美系列| 欧美mv日韩mv国产网站| 午夜精品区一区二区三| 国产精品色网| 亚洲欧美日韩一区在线| 一区二区三区www| 欧美日韩精品免费在线观看视频 | 久久aⅴ国产紧身牛仔裤| 日韩亚洲欧美一区| 欧美区国产区| 在线视频你懂得一区| 亚洲精品韩国| 欧美日本一道本| 一区二区欧美国产| 99在线精品观看| 欧美视频在线观看一区| 亚洲男女自偷自拍| 亚洲一二区在线| 欧美午夜电影网| 亚洲欧美国产一区二区三区| 亚洲一区高清| 国产午夜精品一区二区三区视频| 久久国产精品亚洲va麻豆| 欧美一级视频一区二区| 黄色成人小视频| 欧美顶级大胆免费视频| 欧美激情视频一区二区三区免费| 日韩午夜高潮| 亚洲一区二区三区乱码aⅴ蜜桃女| 国产精品久久久久9999| 欧美一区二区三区在线免费观看| 欧美亚洲在线播放| 最新国产精品拍自在线播放| 亚洲日本成人| 国产精品午夜电影| 麻豆精品视频| 欧美日韩国产小视频在线观看| 亚洲一区制服诱惑| 西西人体一区二区| 在线欧美日韩精品| 久久久91精品国产| 久久女同互慰一区二区三区| 在线精品亚洲一区二区| 最新高清无码专区| 国产伦精品一区二区| 久久中文字幕一区二区三区| 麻豆精品传媒视频| 在线视频你懂得一区| 欧美在线免费看| 日韩亚洲成人av在线| 亚洲女人小视频在线观看| ●精品国产综合乱码久久久久| 亚洲激情专区| 国产一区二区精品久久91| 亚洲韩国一区二区三区| 国产一区二区三区高清| 99国产精品久久久久久久| 樱桃视频在线观看一区| 亚洲视频在线免费观看| 在线免费高清一区二区三区| 一区二区三区国产在线| 在线免费精品视频| 亚洲午夜在线视频| 亚洲免费观看高清完整版在线观看| 亚洲自拍三区| 亚洲最新在线视频| 免费av成人在线| 久久久久在线| 国产精品视频你懂的| 亚洲免费精彩视频| 亚洲国产人成综合网站| 欧美一区二区三区播放老司机 | 午夜一区在线| 欧美日韩国产成人| 亚洲成色最大综合在线| 激情成人中文字幕| 欧美亚洲一区三区| 久久xxxx精品视频| 国产麻豆9l精品三级站| 一区二区三区欧美日韩| 一区二区三区免费看| 欧美国产综合| 欧美激情第9页| 在线观看日韩专区| 久久久久国产精品厨房| 久久女同互慰一区二区三区| 国产精品日韩久久久久| 亚洲一区成人| 午夜天堂精品久久久久| 国产精品网站在线观看| 新67194成人永久网站| 亚洲欧美欧美一区二区三区| 欧美视频在线观看 亚洲欧| 在线中文字幕日韩| 亚洲一区尤物| 国产农村妇女毛片精品久久麻豆| 一区二区三区三区在线| 亚洲欧美国产三级| 国产一区二区三区四区在线观看| 性做久久久久久久久| 久久久久综合网| 亚洲欧洲一区二区天堂久久 | 老牛国产精品一区的观看方式| 国产精品毛片一区二区三区| 一区二区免费看| 欧美一区二区三区视频在线观看| 国产女主播一区二区| 欧美一区二区三区视频在线| 美女视频黄免费的久久| 亚洲三级免费| 国产精品夫妻自拍| 亚洲尤物视频在线| 蜜桃久久精品乱码一区二区| 亚洲精品一级| 国产精品久久久999| 久久男人资源视频| 亚洲乱码国产乱码精品精| 欧美伊人精品成人久久综合97| 精品成人在线视频| 欧美日韩一区二区免费在线观看| 亚洲伊人观看| 亚洲大胆视频| 性欧美1819sex性高清| 伊人激情综合| 欧美亚州一区二区三区| 久久天天躁夜夜躁狠狠躁2022 | 久久激情婷婷| 亚洲三级影片| 国产精品一区三区| 欧美成人一区二区| 国产精品毛片高清在线完整版| 亚洲字幕一区二区| 亚洲国产高清aⅴ视频| 欧美私人网站| 免播放器亚洲一区| 欧美在线视频免费| 99伊人成综合| 欧美激情影音先锋| 久久全国免费视频| 性欧美办公室18xxxxhd| 99在线精品观看| 亚洲高清视频一区二区| 国产日韩欧美在线观看| 欧美性做爰猛烈叫床潮| 欧美激情精品久久久久久黑人| 久久九九久精品国产免费直播| 国产日韩av一区二区| 亚洲欧美综合网| 一本色道**综合亚洲精品蜜桃冫| 欧美黄在线观看|