• <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>

            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

            Location and Orientaion

            eryar@163.com

            摘要Abstract:本文簡要介紹了幾何造型中的邊界表示法(BRep),并結(jié)合程序說明OpenCascade中的邊界表示的具體實現(xiàn),即拓樸與幾何的聯(lián)系。拓樸結(jié)構(gòu)中的位置(Location)和朝向(Orientation)進行了詳細說明。

            關(guān)鍵字Key Words:OpenCascade、BRep、Topology、Geometry、Location、Orientation

            一、引言 Introduction

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

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

            wps_clip_image-7847

            Figure 2.1 Topology data structure in OpenCascade

            wps_clip_image-986

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

            wps_clip_image-23258

            Figure 2.2 TopoDS_Shape member fields

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

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

            wps_clip_image-20741

            Figure 2.3 Topology data structure in OpenCascade

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

            wps_clip_image-4145

            Figure 2.4 TopoDS_TShape class diagram

            二、位置 Location

            ToposDS_Shape有個TopLoc_Location的成員變量myLocation,該變量定義了子形狀相對于該形狀的偏移量。例如,環(huán)(wire)有一個位置變量,該變量沿著向量{0,0,10}移動,意味著環(huán)所有的邊都沿著Z軸移動10個單位。下面以一個程序來具體說明:

             

              1 /*
              2 *    Copyright (c) 2013 eryar All Rights Reserved.
              3 *
              4 *        File    : Main.cpp
              5 *        Author  : eryar@163.com
              6 *        Date    : 2013-09-26
              7 *        Version : V1.0
              8 *
              9 *    Description : Shape location.
             10 *
             11 */
             12 
             13 #define WNT
             14 #include <Geom_Circle.hxx>
             15 
             16 #include <TopoDS_Edge.hxx>
             17 #include <TopoDS_Wire.hxx>
             18 #include <TopoDS_Iterator.hxx>
             19 
             20 #include <BRepBuilderAPI_MakeEdge.hxx>
             21 #include <BRepBuilderAPI_MakeWire.hxx>
             22 
             23 #pragma comment(lib, "TKernel.lib")
             24 #pragma comment(lib, "TKMath.lib")
             25 #pragma comment(lib, "TKG3d.lib")
             26 #pragma comment(lib, "TKBRep.lib")
             27 #pragma comment(lib, "TKTopAlgo.lib")
             28 
             29 const std::string dumpShapeType(const TopAbs_ShapeEnum& type)
             30 {
             31     std::string strType("Shape");
             32 
             33     switch (type)
             34     {
             35     case TopAbs_COMPOUND:
             36         strType = "COMPOUND";
             37         break;
             38 
             39     case TopAbs_COMPSOLID:
             40         strType = "COMPSOLID";
             41         break;
             42 
             43     case TopAbs_SOLID:
             44         strType = "SOLID";
             45         break;
             46 
             47     case TopAbs_SHELL:
             48         strType = "SHELL";
             49         break;
             50 
             51     case TopAbs_FACE:
             52         strType = "FACE";
             53         break;
             54 
             55     case TopAbs_WIRE:
             56         strType = "WIRE";
             57         break;
             58 
             59     case TopAbs_EDGE:
             60         strType = "EDGE";
             61         break;
             62 
             63     case TopAbs_VERTEX:
             64         strType = "VERTEX";
             65         break;
             66 
             67     default:
             68         break;
             69     }
             70 
             71     return strType;
             72 }
             73 
             74 void dumpShapeLocation(const TopoDS_Shape& shape)
             75 {
             76     std::cout << "Shape Type: " << dumpShapeType(shape.ShapeType()) << std::endl;
             77     shape.Location().ShallowDump(std::cout);
             78 
             79     TopoDS_Iterator anItr(shape);
             80 
             81     for (; anItr.More(); anItr.Next())
             82     {
             83         const TopoDS_Shape& aChild = anItr.Value();
             84 
             85         dumpShapeLocation(aChild);
             86     }
             87 }
             88 
             89 int main(void)
             90 {
             91     Handle_Geom_Curve aCircle = new Geom_Circle(gp::XOY(), 5.0);
             92 
             93     TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge(aCircle);
             94     TopoDS_Wire aWire = BRepBuilderAPI_MakeWire(anEdge);
             95 
             96     std::cout << "Before transformation: " << std::endl;
             97     dumpShapeLocation(aWire);
             98 
             99     gp_Trsf trsf;
            100     trsf.SetTranslation(gp_Vec(0010));
            101     TopLoc_Location location(trsf);
            102 
            103     aWire.Location(location);
            104 
            105     std::cout << "After transformation: " << std::endl;
            106     dumpShapeLocation(aWire);
            107 
            108     return 0;
            109 }


            程序結(jié)果如下所示:

             1Before transformation:
             2Shape Type: WIRE
             3TopLoc_Location : Identity
             4
             5Shape Type: EDGE
             6TopLoc_Location : Identity
             7
             8Shape Type: VERTEX
             9TopLoc_Location : Identity
            10
            11Shape Type: VERTEX
            12TopLoc_Location : Identity
            13
            14After transformation:
            15Shape Type: WIRE
            16TopLoc_Location :
            17       Exponent : 1
            18 TopLoc_Datum3D 034100E8
            19  (          1,         0,         0,         0)
            20  (          0,         1,         0,         0)
            21  (          0,         0,         1,        10)
            22
            23
            24Shape Type: EDGE
            25TopLoc_Location :
            26       Exponent : 1
            27 TopLoc_Datum3D 034100E8
            28  (          1,         0,         0,         0)
            29  (          0,         1,         0,         0)
            30  (          0,         0,         1,        10)
            31
            32
            33Shape Type: VERTEX
            34TopLoc_Location :
            35       Exponent : 1
            36 TopLoc_Datum3D 034100E8
            37  (          1,         0,         0,         0)
            38  (          0,         1,         0,         0)
            39  (          0,         0,         1,        10)
            40
            41
            42Shape Type: VERTEX
            43TopLoc_Location :
            44       Exponent : 1
            45 TopLoc_Datum3D 034100E8
            46  (          1,         0,         0,         0)
            47  (          0,         1,         0,         0)
            48  (          0,         0,         1,        10)
            49
            50
            51Press any key to continue . . .

            三、朝向 Orientation

            朝向(orientation)與位置(location)的工作原理相同。當將子對象從實體中分離出來時,父對象的朝向會影響到子對象的朝向。但是有個很重要的例外就是面(Face)上邊(Edge)的朝向不遵守這個規(guī)則。在討論面的朝向時,討論過邊的參數(shù)空間曲線(pcurve)的material問題。這個例外說的是計算面上邊的朝向時不應該受到面的朝向的影響。即若要使用邊的參數(shù)空間曲線(pcurve)就按下面的方式:

            1 TopExp_Explorer aFaceExp (myFace.Oriented (TopAbs_FORWARD), TopAbs_EDGE); 
            2 for (; aFaceExp.More(); aFaceExp.Next()) 
            3 
            4     const TopoDS_Edge& anEdge = TopoDS::Edge (aFaceExp.Current()); 
            5 

            假如你研究得更為深入,這個例外也是可以理解的。讓我們以一個具體例子來理解這個例外,從底層一步步的創(chuàng)建一個面:

             

             1 Handle(Geom_Surface) aSurf = new Geom_Plane (gp::XOY());
             2 //anti-clockwise circles if to look from surface normal
             3 Handle(Geom_Curve) anExtC = new Geom_Circle (gp::XOY(), 10.);
             4 Handle(Geom_Curve) anIntC = new Geom_Circle (gp::XOY(), 5.);
             5 TopoDS_Edge anExtE = BRepBuilderAPI_MakeEdge (anExtC);
             6 TopoDS_Edge anIntE = BRepBuilderAPI_MakeEdge (anExtC);
             7 TopoDS_Wire anExtW = BRepBuilderAPI_MakeWire (anExtE);
             8 TopoDS_Wire anIntW = BRepBuilderAPI_MakeWire (anIntE);
             9 BRep_Builder aB;
            10 TopoDS_Face aFace;
            11 aB.MakeFace (aFace, aSurf, Precision::Confusion());
            12 aB.Update (aFace, aSurf);
            13 aB.Add (aFace, anExtW);
            14 //material should lie on the right of the inner wire
            15 aB.Add (aFace, anIntW.Reversed()); 

            面默認的朝向是向前的(forward),讓我們來遍歷面的邊(edge)和參數(shù)空間曲線(pcurve)。盡管我們沒有顯示地來添加它們,從原來的討論中可知平面上的參數(shù)空間曲線可以默認計算(be computed on the fly):

             1 void TraversePCurves (const TopoDS_Face& theFace)
             2 {
             3     TopExp_Explorer anExp (theFace, TopAbs_EDGE);
             4     for (; anExp.More(); anExp.Next()) 
             5     {
             6         Standard_Real aF = 0.0;
             7         Standard_Real aL = 0.0;
             8         const TopoDS_Edge& anEdge = TopoDS::Edge (anExp.Current());
             9         
            10         Handle(Geom2d_Curve) aPCurve = BRep_Tool::CurveOnSurface (anEdge, theFace, aF, aL);
            11     }
            12 }

            得到的參數(shù)空間曲線(pcurves)如下圖所示,material在紅線的左側(cè),在藍線的右側(cè):

            wps_clip_image-29712

            一切都很正確。現(xiàn)在設想一下,如果把面的朝向反向(reverse),然后再遍歷邊和參數(shù)空間曲線,會發(fā)生什么呢?

            1 TopoDS_Face aRFace = TopoDS::Face (aFace.Reversed()); 
            2 
            3 TraversePCurves (aRFace); 

            所有的邊將會具有相反的朝向,對應邊的參數(shù)空間曲線(pcurve)的material在外環(huán)的外側(cè),在內(nèi)環(huán)的內(nèi)側(cè),這明顯是錯誤的!在前面討論面的朝向時就說過面的朝向僅僅是面的邏輯朝向,而與其底層的曲面(surface)沒有關(guān)系。在上面的例子中反轉(zhuǎn)面aRFace只是一個法向為{0, 0, -1}的面。所以,要獲得邊的正確朝向,必須使用下面的方法來訪問面中的邊:

            1 TopExp_Explorer anExp (theFace.Oriented (TopAbs_FORWARD), TopAbs_EDGE); 

            這樣就確保面上的邊具有正確的朝向,而與曲面(surface,注意在此不是face?。┑姆ㄏ驔]有關(guān)系。OpenCASCADE的算法對這種特殊的情況都做了處理,你也一定記得這樣做。

            四、結(jié)論 Conclusion

            對拓樸形狀(TopoDS_Shape)的位置(location)和朝向(orientation)進行深入理解,整個拓樸結(jié)構(gòu)就變得清晰了,因為一個拓樸形狀中除了子對象外,剩下就是位置和朝向成員變量了。

            wps_clip_image-4346

            理解了拓樸結(jié)構(gòu)后,對OpenCascade的模塊ModelingData就有個較深刻地認識了。

            五、參考資料  Reference

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

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

            3. OpenCascade source code.

             

            久久一本综合| 久久久久夜夜夜精品国产| 热99RE久久精品这里都是精品免费| 色综合久久综精品| 香蕉久久夜色精品国产尤物| 亚洲中文字幕无码久久2017| 青青草国产精品久久久久| 久久久久久久久久免免费精品 | 色综合久久综精品| 久久久久久久久66精品片| 99久久人妻无码精品系列蜜桃| 精品久久人人爽天天玩人人妻| 久久亚洲精品无码VA大香大香| 无码8090精品久久一区 | 久久婷婷成人综合色综合| 日本久久久久久中文字幕| 91麻豆国产精品91久久久| 99久久无码一区人妻| 麻豆一区二区99久久久久| 香蕉99久久国产综合精品宅男自 | 久久中文骚妇内射| 欧洲国产伦久久久久久久| 久久综合久久综合九色| 久久精品中文闷骚内射| 无码任你躁久久久久久老妇App| 岛国搬运www久久| 亚洲乱亚洲乱淫久久| 97久久精品午夜一区二区| 日韩人妻无码精品久久免费一| 久久伊人色| 欧美日韩成人精品久久久免费看| 国产精品激情综合久久| 久久精品国产亚洲沈樵| 国产成人精品久久一区二区三区| 色综合久久无码五十路人妻| 久久久久久久波多野结衣高潮| 亚洲乱码日产精品a级毛片久久| 久久国产免费直播| 久久精品亚洲乱码伦伦中文| 久久午夜综合久久| 国内精品九九久久精品|