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

            Posted on 2013-08-24 20:38 eryar 閱讀(4987) 評論(2)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

            Topology and Geometry in OpenCascade-Edge

            eryar@163.com

            摘要Abstract:本文簡要介紹了幾何造型中的邊界表示法(BRep),并結合程序說明OpenCascade中的邊界表示的具體實現,即拓樸與幾何的聯系。對具有幾何信息的拓樸結構頂點(vertex)、邊(edge)、面(face)進行了詳細說明。本文只對拓樸邊數據進行說明,著重介紹了OpenCascade中兩個種特別的邊縫合邊(seam edge)和退化邊(degenerated edge)。

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

            一、引言 Introduction

            邊(Edge)是兩個鄰面(對正則形體而言)或多個鄰面(對非正則形體而言)的交集。邊有方向,它由起始頂點和終止頂點來界定;邊的形狀由邊的幾何信息來表示,可以是直線,也可以是曲線,曲線邊可用一系列控制點或型值點來描述,也可以用顯示、隱式或參數方程來描述。

            邊(Edge)是邊界表示法中的重要結構,因為邊界表示法(BRep)是用形體的邊界來描述形體的一種方法。BRep認為形體是由有限數量的邊界表面(平面或曲面)構成,而每個表面又由若干邊界邊與頂點構成,所有的單元面構成了形體的邊界,形體的邊界將形體和周圍的環境分隔開來。

            邊界表示法不僅詳細記錄了構成形體的面、邊方程的系數和頂點坐標值的幾何信息,而且描述了這些幾何元素之間的拓樸信息,即體、面、邊、頂點的組成關系等。在保證對形體面的定義確定并且無二義性的前提下,它允許根據形體的拓樸結構、面表示的方便性等因素確定一個面是以一個整體表示,還是以幾個部分之和進行表示。

            在OpenCascade中邊包含了一系列的曲線,其結構如下圖所示:

            wps_clip_image-4387

            Figure 1.1 BRep_TEdge members

            其中,包含一系列的曲線由下面幾種:

            wps_clip_image-601

            Figure 1.2 BRep_CurveRepresentation class diagram

            二、邊 Edge

            邊(edge)是對應于一維對象-曲線的拓樸實體。邊可以是面的邊界(如長方體的12條邊之一);也可以只是一條不屬于任何面的“懸空”邊(floating edge),想像一下在構建錐形體或掃掠體之前的輪廓線;面的邊可以被兩個或更多面共享,或者只屬于一個面。如下圖所示:

            wps_clip_image-23008

            Figure 2.1 Model used to illustrate Edge

            在上圖中用不同的顏色將不同類型的邊區別開來:

            l 紅色:不屬于任何面的懸空邊(floating edge);

            l 綠色:只屬于一個面的自由邊(free edge);

            l 黃色:屬于兩個或多個面的共享邊(shared edge);

            邊Edge包含幾種幾何表示:

            n 三維空間中的曲線C(t),由Geom_Curve實現。這是邊的基本表示方式;

            n 曲線P(t)為二維空間的參數曲線,用來表示屬于面的邊,通常被稱為pcurves,由類Geom2d_Curve實現;

            n 多段線(Polygonal)由一組三維點表示,且由類Poly_Polygon3D實現。

            n 多段線(Polygonal)也可由一組三角剖分面上點的索引來表示,且由類Poly_PolygonOnTriangulation實現。

            他們的表示都可以使用前面提到的類BRep_Tool來獲取。例如:

             

            Standard_Real aFirst, aLast, aPFirst, aPLast; 
            Handle(Geom_Curve) aCurve3d 
            = BRep_Tool::Curve (anEdge, aFirst, aLast); 
            Handle(Geom2d_Curve) aPCurve 
            = BRep_Tool::CurveOnSurface (anEdge, aFace, aPFirst, aPLast); 

            邊必須有曲面上的參數曲線(pcurves),除了平面以外。邊中所有曲線必須一致,即朝向相同。這樣邊上的點可以使用任意表示方式計算得到,如曲線C(t),可以用[first, last]區間上的t來計算;也可根據u在區間[first1, last1]上取得曲面S1(P1x(u), P1y(u))上的點Pi,這里Pi是曲面Si上的參數曲線pcurve上的一點。

            1. 邊的標志位 Edge Flags

            邊中的標志位有三種:

            1 static const Standard_Integer ParameterMask       = 1
            2 static const Standard_Integer RangeMask           = 2
            3 static const Standard_Integer DegeneratedMask     = 4

            這里對前兩種標志位進行說明:

            l RangeMask “same range”:(BRep_Tool::SameRange())取值區間相同,即幾何表示的曲線參數取值區間相同;

            l ParameterMask “same parameter”:(BRep_Tool::SameParameter())參數相同,即當C(t)=S1(P1x(t), P1y(t))時,對于同樣的參數t,C(t)和曲面S1上的點P1(t)相同。即任何邊上的點都對應參數曲線上相同的參數值。

            許多算法假定設置了這兩個標志位,因此建議你注意這種情況,一定要設置這些標志位。

            2. 邊的容差 Tolerance

            邊的容差(Tolerance)是其三維曲線和其他任何表示方式之間的最大偏差。其幾何意義就是以容差為半徑沿邊的一個包含邊的三維曲線及其他任何形式表示的管子。如下圖所示:

            wps_clip_image-28483

            Figure 2.2 Edge Tolerance

            3. 特殊類型的邊 Special edge types

            在OpenCascade有兩種特別類型的邊,他們是:

            l 縫合邊(seam edge):即在同一個面上出現兩次的邊(如:在同一個面上具有2個參數曲線);

            l 退化邊(degenerated edge):這種邊位于曲面的奇異點處,在三維空間中退化為一個點;

            球面中這兩種類型的邊都有。縫合邊位于經線(U iso-lines),參數為0和2*PI。退化邊位于南北極點,對應于緯線(V iso-lines),參數為-PI/2和PI/2。因為球面的參數方程為:

            wps_clip_image-17127

            當參數u取0和2*PI時,球面的參數方程計算如下:

            wps_clip_image-5507

            從計算結果可以看出,縫合邊是位于Dx和Dz所在平面上的半圓弧。

            當參數v取-PI/2和PI/2時,球面的參數方程計算如下:

            wps_clip_image-23112

            從計算結果可以看出,曲面上的兩個邊分別退化為兩個點。即v取-PI/2和PI/2時球面的兩個退化邊分別位于南北極點上。如下圖所示:

            wps_clip_image-9886

            Figure 2.3 seam edge and degenerated edge of sphere

            另外例子:環形體(torus)、圓柱體(cylinder)、圓錐體(cone)。環形體torus有兩條縫合邊(seam edge),對應于它的參數空間的邊界;圓柱體(cylinder)有一條縫合邊(seam edge)。圓錐(cone)頂點處為退化邊(degenerated edge)。

            檢查邊是否是縫化邊或退化邊,可以使用函數BRep_Tool::IsClosed()和BRep_Tool::Degenerated()。

            4. 邊的朝向

            邊的朝向為正向(forward edge orientation)意味著邊的邏輯方向與曲線的方向相同。反向(reversed)意味著邏輯方向與曲線方向相反。所以,縫合邊(seam-edge)在一個面中總是有兩個朝向:一個反向(reversed),一個正向(forward)。

            三、示例程序 Example Code

            以邊界表示BRep表示的球面為例,說明其邊的類型。程序代碼如下所示:

              1 /*
              2 *    Copyright (c) 2013 eryar All Rights Reserved.
              3 *
              4 *        File    : Main.cpp
              5 *        Author  : eryar@163.com
              6 *        Date    : 2013-08-24 16:11
              7 *        Version : 1.0v
              8 *
              9 *    Description : Demonstrate seam edge and degenerated edge of sphere.
             10 *                  
             11 */
             12 
             13 #include <iostream>
             14 
             15 // OpenCascade Library.
             16 #define WNT
             17 #include <TopoDS.hxx>
             18 #include <TopoDS_Edge.hxx>
             19 #include <TopExp_Explorer.hxx>
             20 #include <BRepPrimAPI_MakeSphere.hxx>
             21 
             22 #pragma comment(lib, "TKernel.lib")
             23 #pragma comment(lib, "TKMath.lib")
             24 #pragma comment(lib, "TKBRep.lib")
             25 #pragma comment(lib, "TKPrim.lib")
             26 #pragma comment(lib, "TKTopAlgo.lib")
             27 
             28 /**
             29 * @breif Dump orientation types.
             30 *        Orientation definitaion:
             31 *        enum TopAbs_Orientation {
             32 
             33 *            TopAbs_FORWARD,
             34 
             35 *            TopAbs_REVERSED,
             36 
             37 *            TopAbs_INTERNAL,
             38 
             39 *            TopAbs_EXTERNAL
             40 
             41 *        };
             42 */
             43 std::string dumpOrientation(const TopAbs_Orientation& orient)
             44 {
             45     std::string strType;
             46 
             47     switch (orient)
             48     {
             49     case TopAbs_FORWARD:
             50         strType = "TopAbs_FORWARD";
             51         break;
             52 
             53     case TopAbs_REVERSED:
             54         strType = "TopAbs_REVERSED";
             55         break;
             56 
             57     case TopAbs_INTERNAL:
             58         strType = "TopAbs_INTERNAL";
             59         break;
             60 
             61     case TopAbs_EXTERNAL:
             62         strType = "TopAbs_EXTERNAL";
             63         break;
             64     }
             65 
             66     return strType;
             67 }
             68 
             69 /**
             70 * @breif Dump edge information.
             71 */
             72 void processEdge(const TopoDS_Edge& edge, const TopoDS_Face& face)
             73 {
             74     Standard_Real dTolerance = BRep_Tool::Tolerance(edge);
             75 
             76     Standard_Boolean bIsGeometric = BRep_Tool::IsGeometric(edge);
             77     Standard_Boolean bIsSameParameter = BRep_Tool::SameParameter(edge);
             78     Standard_Boolean bIsSameRange = BRep_Tool::SameRange(edge);
             79     Standard_Boolean bIsDegenerated = BRep_Tool::Degenerated(edge);
             80     Standard_Boolean bIsClosed = BRep_Tool::IsClosed(edge, face);
             81 
             82     TopAbs_Orientation nOrientation = edge.Orientation();
             83 
             84     // Dump edge info.
             85     std::cout<<"====== Edge Info ======="<<std::endl;
             86     std::cout<<"Tolerance: "<<dTolerance<<std::endl;
             87     std::cout<<"Orientation: "<<dumpOrientation(nOrientation)<<std::endl;
             88     std::cout<<"Geometric: "<<(bIsGeometric?"True":"False")<<std::endl;
             89     std::cout<<"Same Parameter: "<<(bIsSameParameter?"True":"False")<<std::endl;
             90     std::cout<<"Same Range: "<<(bIsSameRange? "True":"False")<<std::endl;
             91     std::cout<<"Degenerated edge: "<<(bIsDegenerated?"True":"False")<<std::endl;
             92     std::cout<<"Seam edge: "<<(bIsClosed? "True":"False")<<std::endl;
             93 
             94     // Dump vertex of the edge.
             95     for (TopExp_Explorer vertexItr(edge, TopAbs_VERTEX); 
             96         vertexItr.More(); 
             97         vertexItr.Next())
             98     {
             99         const TopoDS_Vertex& aVertex = TopoDS::Vertex(vertexItr.Current());
            100         gp_Pnt pnt = BRep_Tool::Pnt(aVertex);
            101 
            102         std::cout<<"Vertex: ("<<pnt.X()<<""<<pnt.Y()<<""<<pnt.Z()<<")"<<std::endl;
            103     }
            104 }
            105 
            106 int main(void)
            107 {
            108     Standard_Integer nSphereFaceCount = 0;
            109     Standard_Integer nSphereEdgeCount = 0;
            110 
            111     TopoDS_Shape sphere = BRepPrimAPI_MakeSphere(1.0);
            112 
            113     for (TopExp_Explorer faceItr(sphere, TopAbs_FACE); 
            114         faceItr.More(); 
            115         faceItr.Next())
            116     {
            117         const TopoDS_Face& aFace = TopoDS::Face(faceItr.Current());
            118 
            119         ++nSphereFaceCount;
            120 
            121         for (TopExp_Explorer edgeItr(aFace, TopAbs_EDGE); 
            122             edgeItr.More(); 
            123             edgeItr.Next())
            124         {
            125             const TopoDS_Edge& aEdge = TopoDS::Edge(edgeItr.Current());
            126 
            127             processEdge(aEdge, aFace);
            128 
            129             ++nSphereEdgeCount;
            130         }
            131     }
            132 
            133     std::cout<<"Sphere face count: "<<nSphereFaceCount<<std::endl;
            134     std::cout<<"Sphere edge count: "<<nSphereEdgeCount<<std::endl;
            135 
            136     return 0;
            137 }


            程序運行結果如下所示:

             1 ====== Edge Info =======
             2 Tolerance: 1e-007
             3 Orientation: TopAbs_REVERSED
             4 Geometric: True
             5 Same Parameter: True
             6 Same Range: True
             7 Degenerated edge: True
             8 Seam edge: False
             9 Vertex: (6.12323e-017-1.49976e-0321)
            10 Vertex: (6.12323e-017-1.49976e-0321)
            11 ====== Edge Info =======
            12 Tolerance: 1e-007
            13 Orientation: TopAbs_FORWARD
            14 Geometric: True
            15 Same Parameter: True
            16 Same Range: True
            17 Degenerated edge: False
            18 Seam edge: True
            19 Vertex: (6.12323e-017-1.49976e-0321)
            20 Vertex: (6.12323e-017-1.49976e-032-1)
            21 ====== Edge Info =======
            22 Tolerance: 1e-007
            23 Orientation: TopAbs_FORWARD
            24 Geometric: True
            25 Same Parameter: True
            26 Same Range: True
            27 Degenerated edge: True
            28 Seam edge: False
            29 Vertex: (6.12323e-017-1.49976e-032-1)
            30 Vertex: (6.12323e-017-1.49976e-032-1)
            31 ====== Edge Info =======
            32 Tolerance: 1e-007
            33 Orientation: TopAbs_REVERSED
            34 Geometric: True
            35 Same Parameter: True
            36 Same Range: True
            37 Degenerated edge: False
            38 Seam edge: True
            39 Vertex: (6.12323e-017-1.49976e-0321)
            40 Vertex: (6.12323e-017-1.49976e-032-1)
            41 Sphere face count: 1
            42 Sphere edge count: 4
            43 Press any key to continue . . .


            從運行結果可以看,當球的邊為退化邊時,邊的兩個頂點的坐標值相同。退化邊位于球的南北極點上。縫合邊為連接兩個退化邊的曲線。

            根據遍歷順序,

            第一條邊為退化邊(degenerated edge),其朝向為反向(reversed);

            第二條邊為縫合邊(seam-edge),其朝向為正向(forward);

            第三條邊為退化邊,其朝向為正向(forward);

            第四條邊為縫合邊,其朝向為反向(reversed)。

            由上可見,縫合邊有兩個朝向,一個正向一個反向。

            四、結論 Conclusion

            對與幾何相關的拓樸邊(edge)的類的屬性數據進行詳細說明。并結合程序代碼詳細說明邊的標志位(myFlags)屬性的意義,從參數方程出發,理解縫合邊(seam-edge)和退化邊(degenerated edge),即標志位中DegeneratedMask的意義。

            五、參考資料

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

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

            3. OpenCascade source code.

             

            Feedback

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

            2014-04-29 09:45 by johnsondu
            您好,您的博客對我的幫助非常非常大,首先感謝您的辛勤撰寫。然后我想問一下,如果對于一個體元,如何才能得到這個體元的各種信息,包括點,線,以及各個線的方向關系。

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

            2014-04-29 13:00 by eryar
            Hi johnsondu,
            你好。
            可以使用TopExp_Explorer來遍歷一個Shape來得到相關的數據。
            @johnsondu
            久久国产精品久久精品国产| 91精品婷婷国产综合久久| 亚洲欧美日韩精品久久亚洲区| 国产成人精品久久亚洲| 精品久久久久久无码中文字幕| 国产免费久久精品99久久| 久久免费香蕉视频| 无码久久精品国产亚洲Av影片| 2021精品国产综合久久| 国产亚洲成人久久| 久久精品国产久精国产一老狼| 久久人人爽人人爽人人片av高请| 久久婷婷国产麻豆91天堂| 欧美日韩中文字幕久久久不卡| 中文字幕热久久久久久久| 久久99精品国产麻豆| 久久激情亚洲精品无码?V| 欧美伊人久久大香线蕉综合| 久久久久久精品久久久久| 99久久综合狠狠综合久久止| 国产激情久久久久影院老熟女免费| 一本色道久久综合| 久久精品国产亚洲Aⅴ香蕉| 伊人久久综合无码成人网| 99久久亚洲综合精品网站| 亚洲国产精品无码成人片久久| 国产精品丝袜久久久久久不卡| 久久精品卫校国产小美女| 久久se这里只有精品| 99久久无码一区人妻a黑| 久久久久亚洲av毛片大| 久久九九青青国产精品| 久久久SS麻豆欧美国产日韩| 九九精品99久久久香蕉| 久久久精品国产免大香伊 | 久久婷婷人人澡人人| 久久99国产精品尤物| 久久99精品久久久大学生| 久久久久无码专区亚洲av| 丰满少妇人妻久久久久久4| 久久精品毛片免费观看|