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

eryar

PipeCAD - Plant Piping Design Software.
RvmTranslator - Translate AVEVA RVM to OBJ, glTF, etc.
posts - 603, comments - 590, trackbacks - 0, articles - 0

Topology and Geometry in OpenCascade-Vertex

Posted on 2013-08-20 19:53 eryar 閱讀(5715) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

Topology and Geometry in OpenCascade-Vertex

eryar@163.com

摘要Abstract:本文簡要介紹了幾何造型中的邊界表示法(BRep),并結合程序說明OpenCascade中的邊界表示的具體實現(xiàn),即拓樸與幾何的聯(lián)系。對具有幾何信息的拓樸結構頂點(vertex)、邊(edge)、面(face)進行了詳細說明。本文只對頂點數(shù)據(jù)進行說明。

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

一、引言 Introduction

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

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

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

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

wps_clip_image-13951

Figure 1.1 Structure of a shell formed from two faces

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

環(huán)TW1引用邊TE1~TE4;環(huán)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-26435

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

注:OpenCascade中的這個數(shù)據(jù)結構中不包含“回溯引用(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中的邊界表示 BRep in OpenCascade

2.1 拓樸結構 TopoDS_Shape data structure

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

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

wps_clip_image-23948

Figure 2.1 Topology data structure in OpenCascade

wps_clip_image-14563

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

wps_clip_image-9340

Figure 2.2 TopoDS_Shape member fields

2.2 拓樸與幾何的聯(lián)系 Connection with Geometry

現(xiàn)在我們來考慮一下拓樸結構與幾何的關系。通過繼承TopoDS包中的抽象的拓樸類實現(xiàn)了邊界表示模型。如下圖所示:

wps_clip_image-67

Figure 2.3 Topology data structure in OpenCascade

從上面的類圖可以看出只有三種拓樸對象有幾何表示數(shù)據(jù):頂點(vertex)、邊(edge)、面(face),分別為BRep_TVertex、BRep_TEdge、BRep_TFace。

wps_clip_image-2791

Figure 2.4 TopoDS_TShape class diagram

三、頂點 Vertex

頂點(vertex)的位置用幾何點(gp_Pnt)來表示。點是幾何造型中的最基本元素,自由曲線、曲面或其他形體均可用有序的點集表示。用計算機存儲、管理、輸出形體的實質(zhì)就是對點集及其連接關系的處理。在正則形體定義中,不允許孤立點存在。

頂點的另一個重要屬性是容差(Tolerance),用來表示位置精度。頂點容差T的幾何意義為以頂點為圓心半徑為T的球。這個球必須包含所有與這個頂點相連的邊的曲線的端點。

wps_clip_image-25604

Figure 3.1 Vertex Tolerance

與其他幾何庫有全局精度(global precision)不同,OpenCascade把容差作為局部屬性(local properties)。由圖2.4可知,容差是頂點、邊、面的屬性。這種方法有助于用更一般的方式來描述高精度的模型。如下圖所示:

wps_clip_image-13508

Figure 3.2 Vertex with different tolerance

如果從底層來創(chuàng)建形狀,最好的方法就是指定最小的允許誤差。默認值Precision::Confusion()為1e-07。

下面討論頂點的朝向(orientation)屬性。它沒有直接的幾何意義,但是根據(jù)約定,若頂點的朝向?qū)傩灾禐門opAbs_FORWARD,它就必須與表示邊的曲線的參數(shù)值小的端部匹配。相應地,TopAbs_REVERSED的頂點與參數(shù)值大的端部匹配。例如,有條邊位于圓弧上,圓弧半徑為1且在Z=0的平面上,起點為(1,0,0),向-Z軸向,曲線為逆時針方向。所以頂點(1,0,0)的朝向為TopAbs_FORWARD,頂點(0,1,0)的朝向為TopAbs_REVERSED。如下圖所示:

wps_clip_image-6315

Figure 3.3 Vertex Orientation attribute

實現(xiàn)上圖所示的程序代碼如下所示:

 

  1 /*
  2 *    Copyright (c) 2013 eryar All Rights Reserved.
  3 *
  4 *        File    : Main.cpp
  5 *        Author  : eryar@163.com
  6 *        Date    : 2013-08-17 21:46
  7 *        Version : 1.0v
  8 *
  9 *    Description : Demonstrate how to build a edge bottom-up by BRepBuilderAPI_MakeEdge,
 10 *                  and how to access vertex infomation by BRep_Tool.
 11 *                  
 12 */
 13 
 14 // OpenCascade library.
 15 #define WNT
 16 #include <gp_Circ.hxx>
 17 #include <GC_MakeArcOfCircle.hxx>
 18 
 19 #include <TopoDS_Edge.hxx>
 20 #include <BRep_Tool.hxx>
 21 #include <BRepBuilderAPI_MakeEdge.hxx>
 22 #include <BRepBuilderAPI_MakeVertex.hxx>
 23 
 24 #pragma comment(lib, "TKernel.lib")
 25 #pragma comment(lib, "TKMath.lib")
 26 #pragma comment(lib, "TKBRep.lib")
 27 #pragma comment(lib, "TKGeomBase.lib")
 28 #pragma comment(lib, "TKTopAlgo.lib")
 29 
 30 /**
 31 * @breif Dump orientation types.
 32 *        Orientation definitaion:
 33 *        enum TopAbs_Orientation {
 34 
 35 *            TopAbs_FORWARD,
 36 
 37 *            TopAbs_REVERSED,
 38 
 39 *            TopAbs_INTERNAL,
 40 
 41 *            TopAbs_EXTERNAL
 42 
 43 *        };
 44 */
 45 std::string DumpOrientation(const TopAbs_Orientation& orient)
 46 {
 47     std::string strType;
 48 
 49     switch (orient)
 50     {
 51     case TopAbs_FORWARD:
 52         strType = "TopAbs_FORWARD";
 53         break;
 54 
 55     case TopAbs_REVERSED:
 56         strType = "TopAbs_REVERSED";
 57         break;
 58 
 59     case TopAbs_INTERNAL:
 60         strType = "TopAbs_INTERNAL";
 61         break;
 62 
 63     case TopAbs_EXTERNAL:
 64         strType = "TopAbs_EXTERNAL";
 65         break;
 66     }
 67 
 68     return strType;
 69 }
 70 
 71 /**
 72 * @breif Dump attributes of the vertex.
 73 */
 74 void DumpVertex(const TopoDS_Vertex& v)
 75 {
 76     gp_Pnt p = BRep_Tool::Pnt(v);
 77     Standard_Real dTolerance = BRep_Tool::Tolerance(v);
 78 
 79     std::cout<<"Vertex position: ("<<p.X()<<""<<p.Y()<<""<<p.Z()<<")"<<std::endl;
 80     std::cout<<"Vertex Tolerance: "<<dTolerance<<std::endl;
 81     std::cout<<"Vertex orientation: "<<DumpOrientation(v.Orientation())<<std::endl;
 82     std::cout<<std::endl;
 83 }
 84 
 85 int main(int argc, char* argv[])
 86 {
 87     gp_Circ circle;
 88     TopoDS_Edge edge;
 89     TopoDS_Vertex vertex1;
 90     TopoDS_Vertex vertex2;
 91     BRepBuilderAPI_MakeEdge edgeBuilder;
 92 
 93     circle.SetRadius(1.0);
 94     circle.SetAxis(gp::OZ());
 95 
 96     edgeBuilder.Init(GC_MakeArcOfCircle(circle, 0.0, M_PI/2.0, Standard_True));
 97 
 98     // Test single vertex.
 99     /*vertex1 = BRepBuilderAPI_MakeVertex(gp_Pnt(100.0, 200.0, 300.0));
100     vertex2 = BRepBuilderAPI_MakeVertex(gp_Pnt(500.0, 600.0, 700.0));
101 
102     std::cout<<"Single vetex test: "<<std::endl;
103 
104     std::cout<<"Vertex 1 attributes: "<<std::endl;
105     DumpVertex(vertex1);
106 
107     std::cout<<"Vertex 2 attributes: "<<std::endl;
108     DumpVertex(vertex2);*/
109 
110     edge = edgeBuilder.Edge();
111     vertex1 = edgeBuilder.Vertex1();
112     vertex2 = edgeBuilder.Vertex2();
113 
114     std::cout<<"Test vertex belong to edge:"<<std::endl;
115 
116     std::cout<<"Vertex 1 attributes: "<<std::endl;
117     DumpVertex(vertex1);
118 
119     std::cout<<"Vertex 2 attributes: "<<std::endl;
120     DumpVertex(vertex2);
121 
122     return 0;
123 }


程序運行結果如下圖所示:

wps_clip_image-27439

Figure 3.4 Code example result

BRep_Builder是從底層創(chuàng)建拓樸結構的類。如下代碼所示為從底層創(chuàng)建頂點的示例:

1 gp_Pnt aPoint(100.0200.0300.0
2 
3 BRep_Builder aBuilder; 
4 
5 TopoDS_Vertex aVertex; 
6 
7 aBuilder.MakeVertex(aVertex, aPoint, Precision::Confusion()); 
8 
9 aVertex.Orientation(TopAbs_REVERSED); 

有一個方便的類也可用來創(chuàng)建頂點BRepBuilderAPI_MakeVertex,其內(nèi)部也是使用了類BRep_Builder。所以,若想從底層創(chuàng)建拓樸結構,必須要熟悉BRep_Builder。

BRep_Tool是用來訪問拓樸結構中幾何信息的工具,他的大部分的函數(shù)是靜態(tài)的。如下代碼所示為獲取頂點的容差和幾何點的方法:

1 Standard_Real aTolerance = BRep_Tool::Tolerance(aVertex); 
2 
3 gp_Pnt aPoint = BRep_Tool::Pnt(aVertex); 
4 

 

四、BRep文件中Vertex的數(shù)據(jù)

結合《BRep Format Description White Paper》中對<vertex data>的描述,及程序代碼中對頂點數(shù)據(jù)的讀取,分析OpenCascade的BRep表示中的頂點。

wps_clip_image-14063

Figure 4.1 NBF-like definition of Vertex

詳細說明:

<vertex data representation u parameter>u的使用方法說明如下:

<vertex data representation data 1> 和參數(shù)u定義了三維曲線C上的點V的位置。參數(shù)u是曲線C上點V對應的參數(shù):C(u)=V。

<vertex data representation data 2>和參數(shù)u定義了曲面上的二維曲線C上點V的位置。參數(shù)u是曲線C上點V對應的參數(shù):C(u)=V。

<vertex data representation data 3>和參數(shù)u及<vertex data representation v parameter>v定義了曲面S上的點V:S(u,v)=V。

<vertex data tolerance>t定義如下所示:

wps_clip_image-4091

讀取Vertex部分的程序代碼摘抄如下:

 1 //---------
 2     // vertex
 3     //---------
 4 
 5   case TopAbs_VERTEX :
 6     {
 7       TopoDS_Vertex& V = TopoDS::Vertex(S);
 8       
 9       // Read the point geometry
10       IS >> tol;
11       IS >> X >> Y >> Z;
12       myBuilder.MakeVertex(V,gp_Pnt(X,Y,Z),tol);
13       Handle(BRep_TVertex) TV = Handle(BRep_TVertex)::DownCast(V.TShape());
14 
15       BRep_ListOfPointRepresentation& lpr = TV->ChangePoints();
16       TopLoc_Location L;
17 
18       do {
19         IS >> p1 >> val;
20         
21         Handle(BRep_PointRepresentation) PR;
22         switch (val) {
23 
24         case 1 :
25           {
26             IS >> c;
27 
28 //  Modified by Sergey KHROMOV - Wed Apr 24 13:59:09 2002 Begin
29         if (myCurves.Curve(c).IsNull())
30           break;
31 //  Modified by Sergey KHROMOV - Wed Apr 24 13:59:13 2002 End
32 
33             Handle(BRep_PointOnCurve) POC =
34               new BRep_PointOnCurve(p1,
35                                     myCurves.Curve(c),
36                                     L);
37             PR = POC;
38           }
39           break;
40 
41         case 2 :
42           {
43             IS >> pc >> s;
44 
45 //  Modified by Sergey KHROMOV - Wed Apr 24 13:59:09 2002 Begin
46         if (myCurves2d.Curve2d(pc).IsNull() ||
47         mySurfaces.Surface(s).IsNull())
48           break;
49 //  Modified by Sergey KHROMOV - Wed Apr 24 13:59:13 2002 End
50 
51             Handle(BRep_PointOnCurveOnSurface) POC =
52               new BRep_PointOnCurveOnSurface(p1,
53                                              myCurves2d.Curve2d(pc),
54                                              mySurfaces.Surface(s),
55                                              L);
56             PR = POC;
57           }
58           break;
59 
60         case 3 :
61           {
62             IS >> p2 >> s;
63 
64 //  Modified by Sergey KHROMOV - Wed Apr 24 13:59:09 2002 Begin
65         if (mySurfaces.Surface(s).IsNull())
66           break;
67 //  Modified by Sergey KHROMOV - Wed Apr 24 13:59:13 2002 End
68 
69             Handle(BRep_PointOnSurface) POC =
70               new BRep_PointOnSurface(p1,p2,
71                                       mySurfaces.Surface(s),
72                                       L);
73             PR = POC;
74           }
75           break;
76         }
77 
78         if (val > 0) {
79           IS >> l;
80       if (!PR.IsNull()) {
81         PR->Location(Locations().Location(l));
82         lpr.Append(PR);
83       }
84         }
85       } while (val > 0);
86     }
87     break;


從BRep文件中可知,大部分的Vertex只有如下數(shù)據(jù):

1 0101101 
2 * 
3 Ve 
4 1e-007 
5 2 3 0 
6 0 0 

即只使用了BRep_Builder.MakeVertex()創(chuàng)建創(chuàng)建頂點(vertex),還可記錄頂點的類型:

1. 若頂點在三維空間中的曲線上Geom_Curve,則記錄三維曲線的索引號及參數(shù)u;

2. 若頂點在二維空間中的曲線上Geom2d_Curve,則記錄二維曲線的索引號及參數(shù)u;

3. 若頂點在曲面上Geom_Surface,則記錄曲面的索引號及參數(shù)(u,v);

五、結論 Conclusion

結合博客“OpenCascade notes”及《BRep format Description white paper》對OpenCascade的拓樸結構中的頂點(vertex)的屬性數(shù)據(jù)進行說明。結合程序說明了頂點的容差及朝向的意義及從底層創(chuàng)建頂點的方法。通過BRep_Tool的靜態(tài)函數(shù)可以獲取頂點的幾何數(shù)據(jù)及其他屬性。

發(fā)現(xiàn)在BRep文件中還對頂點進行了分類:三維曲線上的點、二維曲線上的點和曲面上的點。

六、參考資料 

1. OpenCascade notes: opencascade.blogspot.com

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

 

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日韩精品二区| 午夜精品久久久久99热蜜桃导演| 亚洲图片在线| 中文亚洲欧美| 亚洲视屏在线播放| 亚洲欧美综合v| 久久精品国产综合| 老司机一区二区三区| 美女成人午夜| 99精品免费视频| 亚洲欧美卡通另类91av| 久久精品一区二区| 久久综合激情| 欧美日韩大片| 国产一区二区三区四区五区美女| 亚洲大胆av| 亚洲一区免费| 欧美不卡视频一区发布| 日韩亚洲综合在线| 欧美一区二区三区在线观看视频| 久久精品五月| 欧美日韩亚洲网| 国产亚洲精品一区二区| 亚洲区在线播放| 久久爱另类一区二区小说| 欧美激情亚洲激情| 亚洲免费在线视频| 欧美激情片在线观看| 国产三区二区一区久久| 亚洲美女淫视频| 久久久久欧美| 亚洲视频电影图片偷拍一区| 久久亚洲精品一区二区| 国产精品va在线播放| 在线视频国产日韩| 欧美影院午夜播放| 99re6热在线精品视频播放速度| 欧美一区二视频| 欧美性jizz18性欧美| 亚洲精品在线视频观看| 久久综合色天天久久综合图片| 亚洲精品日韩久久| 免费欧美网站| 影音先锋久久久| 欧美一区二视频| 99re6热在线精品视频播放速度| 免费不卡亚洲欧美| 国内精品久久久久久久97牛牛| 亚洲欧美日韩综合一区| 亚洲精品国产精品国产自| 亚洲综合二区| 国产精品女主播一区二区三区| 亚洲人精品午夜| 欧美国产一区二区在线观看| 欧美一区二区精品在线| 国产午夜精品久久久| 校园激情久久| 亚洲午夜久久久久久久久电影院| 欧美日韩精品系列| 国产精品99久久久久久久女警| 亚洲黄色av一区| 欧美激情一区二区久久久| 亚洲精品欧美专区| 日韩亚洲欧美在线观看| 国产精品video| 亚洲欧美日韩爽爽影院| 亚洲一区二区三区免费在线观看| 欧美视频网址| 亚洲欧美在线网| 午夜视频在线观看一区二区三区| 国产精品电影网站| 欧美一区二区在线免费播放| 亚洲欧美日韩在线高清直播| 国产日韩欧美精品在线| 久久麻豆一区二区| 免费日韩视频| 亚洲色图自拍| 香蕉免费一区二区三区在线观看 | 一本色道久久加勒比88综合| 亚洲国产精品日韩| 欧美日韩国产精品一区二区亚洲| 一本色道久久综合狠狠躁篇怎么玩| 99精品国产99久久久久久福利| 国产精品v欧美精品v日韩| 亚洲欧美一区二区原创| 欧美一区二区在线视频| 在线欧美不卡| 日韩图片一区| 国内精品久久久久久久果冻传媒| 亚洲大片免费看| 国产精品扒开腿做爽爽爽视频| 久久岛国电影| 欧美激情中文不卡| 欧美在线免费观看| 免费在线成人| 翔田千里一区二区| 欧美二区视频| 欧美与欧洲交xxxx免费观看| 久久久久国产精品人| 99精品视频网| 久久精品欧美日韩精品| 一区二区电影免费观看| 久久国产天堂福利天堂| 日韩午夜三级在线| 久久超碰97人人做人人爱| 亚洲免费观看高清完整版在线观看熊 | 久久综合色婷婷| 欧美日韩三区| 免费不卡欧美自拍视频| 国产精品卡一卡二卡三| 亚洲第一在线| 国产一区二区三区久久 | 久久久www成人免费无遮挡大片 | 久久久久久久久久久久久女国产乱| 亚洲精品国产精品国产自| 亚洲欧美激情视频在线观看一区二区三区 | 免费不卡视频| 国产一区999| 中国日韩欧美久久久久久久久| 伊人激情综合| 羞羞色国产精品| 亚洲视频一区二区| 老司机免费视频一区二区三区 | 欧美一区激情| 欧美日韩免费一区| 亚洲黄色小视频| 亚洲欧洲精品一区二区三区不卡| 欧美一区综合| 欧美亚洲在线观看| 国产精品久久久久久亚洲毛片| 亚洲人成在线播放| 一区二区在线不卡| 欧美一区二区三区在线观看视频| 亚洲免费在线| 国产精品免费在线| 亚洲无线观看| 亚洲欧美视频一区| 国产精品免费一区二区三区在线观看 | 久久国产精品网站| 欧美一区二区在线视频| 国产精品色网| 午夜国产欧美理论在线播放| 亚洲欧美日韩直播| 国产精品亚洲综合久久| 亚洲淫性视频| 久久精品国产综合| 在线精品一区二区| 蜜臀91精品一区二区三区| 亚洲国内精品| 亚洲一品av免费观看| 国产精品久久久久久久久借妻| 亚洲视频电影图片偷拍一区| 香蕉亚洲视频| 激情欧美日韩| 欧美国产高清| 亚洲视频在线观看视频| 午夜视频一区在线观看| 国产一区二区三区免费不卡| 久久久久欧美精品| 亚洲人午夜精品免费| 亚洲欧美日韩精品在线| 国产无一区二区| 欧美成人在线网站| 一区二区三区四区国产| 久久精品一区二区三区不卡| 一区二区三区中文在线观看| 欧美成人福利视频| 亚洲天堂男人| 鲁鲁狠狠狠7777一区二区| 亚洲精选成人| 国产欧美日韩精品在线| 久久婷婷蜜乳一本欲蜜臀| 亚洲乱码视频| 麻豆精品在线观看| 亚洲午夜在线| 在线观看欧美日韩| 欧美天天在线| 久久久久一区二区| 一区二区三区日韩精品| 免费看精品久久片| 午夜精品一区二区三区电影天堂| 在线观看欧美视频| 国产精品伊人日日| 欧美日韩高清不卡| 久久美女性网| 亚洲性视频h| 亚洲激情综合| 久久麻豆一区二区| 午夜精品久久久久久久| 亚洲精品国产精品国自产在线 | 伊人婷婷欧美激情| 国产精品资源| 欧美色精品在线视频| 麻豆9191精品国产| 香蕉久久国产| 亚洲一二三区视频在线观看| 亚洲国产精品尤物yw在线观看 | 亚洲欧美国产另类| 99热这里只有成人精品国产| 猛干欧美女孩|