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

eryar

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

Geometry Curve of OpenCascade BRep

Posted on 2013-11-30 15:30 eryar 閱讀(4150) 評論(0)  編輯 收藏 引用 所屬分類: 2.OpenCASCADE

Geometry Curve of OpenCascade BRep

eryar@163.com

摘要Abstract:幾何曲線是參數表示的曲線 ,在邊界表示中其數據存在于BRep_TEdge中,BRep_TEdge中不僅包括了幾何曲線,還包含其他類型的幾何信息。本文主要對OpenCascade的BRep表示中幾何曲線進行說明,將在后面分析Topology部分的讀寫程序時來說明這三種拓樸結構中分別包括哪些幾何信息。

關鍵字Key Words:OpenCascade BRep, Geometry Curve, Topology, Refactoring

一、引言 Introduction

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

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

OpenCascade中幾何(Geometry)與拓樸(Topology)的關系也是按上述方式組織的。即幾何信息在BRep中并不是單獨存在的,而是依附于拓樸存在的。通過繼承TopoDS包中的抽象的拓樸類實現了邊界表示(BRep)模型。如下圖所示:

wps_clip_image-3670

Figure 1.1 Topology data structure in OpenCascade

從上面的類圖可以看出只有三種拓樸對象有幾何數據:頂點(vertex)、邊(edge)、面(face),分別為BRep_TVertex、BRep_TEdge、BRep_TFace。BRep_TVertex中主要包含一個空間點(x, y, z)數據;幾何曲線數據主要存在于BRep_TEdge中,BRep_TEdge中不僅包括了幾何曲線,還包含其他類型的幾何信息;BRep_TFace中主要包含幾何曲面及其他的幾何數據,如面的三角剖分等。本文主要對OpenCascade的BRep表示中幾何曲線進行說明,將在后面分析Topology部分的讀寫程序時來說明這三種拓樸結構中分別包括哪些幾何信息。

Draw Test Harness是OpenCascade提供的一種靈活和簡便的測試與演示OCCT造型庫的工具。他不僅可以使用交互的方式來創建、顯示和修改曲線、曲面和拓樸形狀,還可以以腳本(script)的方式來使用,OpenCascade就是用腳本的方式來對其造型內核進行自動化測試(Tests)。本文將示例程序的幾何曲線在Draw Test Harness進行創建與顯示,結合圖形的直觀顯示便于對抽象概念的理解。

二、示例程序 Example Code

在OpenCascade提供的文檔《BRep Format Description White Paper》對其BRep文件數據進行了說明。BRep文件的幾何部分包含了三維曲線,根據文檔中提供的數據,利用其提供的類來將示例數據進行輸出,再調試其相關代碼來分析其實現。示例程序如下所示:

/*
*    Copyright (c) 2013 eryar All Rights Reserved.
*
*        File    : Main.cpp
*        Author  : eryar@163.com
*        Date    : 2013-11-11 21:46
*        Version : 1.0v
*
*    Description : Demonstrate the geometry 3d curve section 
*                  of the BRep file of OpenCascade.
*
*       KeyWords : OpenCascade, BRep File, Geometry Curve
*                  
*/

// OpenCascade library.
#define WNT
#include 
<Geom_Line.hxx>
#include 
<Geom_Circle.hxx>
#include 
<Geom_Ellipse.hxx>
#include 
<Geom_Parabola.hxx>
#include 
<Geom_Hyperbola.hxx>
#include 
<Geom_BezierCurve.hxx>
#include 
<Geom_BSplineCurve.hxx>
#include 
<Geom_TrimmedCurve.hxx>
#include 
<Geom_OffsetCurve.hxx>

#include 
<TColgp_Array1OfPnt.hxx>
#include 
<TColStd_Array1OfReal.hxx>
#include 
<TColStd_Array1OfInteger.hxx>

#include 
<GeomTools.hxx>
#include 
<GeomTools_CurveSet.hxx>

#pragma comment(lib, 
"TKernel.lib")
#pragma comment(lib, 
"TKMath.lib")
#pragma comment(lib, 
"TKG3d.lib")
#pragma comment(lib, 
"TKGeomBase.lib")

int main(void)
{
    gp_Ax2 axis(gp_Pnt(
123), gp::DZ());
    std::ofstream dumpFile(
"geometryCurve.txt");

    
// 3D curve record 1: Line.
    
// Example: 1 1 0 3 0 1 0 
    Handle_Geom_Line theLine = new Geom_Line(gp_Pnt(103), gp_Dir(010));
    GeomTools::Write(theLine, dumpFile);
    GeomTools::Dump(theLine, dumpFile);
    GeomTools::Dump(theLine, std::cout);

    
// 3D curve record 2: Circle.
    
// Example: 2 1 2 3 0 0 1 1 0 -0 -0 1 0 4
    Handle_Geom_Circle theCircle = new Geom_Circle(axis, 4.0);
    GeomTools::Write(theCircle, dumpFile);
    GeomTools::Dump(theCircle, dumpFile);
    GeomTools::Dump(theCircle, std::cout);

    
// 3D curve record 3: Ellipse.
    
// Example: 3 1 2 3 0 0 1 1 0 -0 -0 1 0 5 4
    Handle_Geom_Ellipse theEllipse = new Geom_Ellipse(axis, 5.04.0);
    GeomTools::Write(theEllipse, dumpFile);
    GeomTools::Dump(theEllipse, dumpFile);
    GeomTools::Dump(theEllipse, std::cout);

    
// 3D curve record 4: Parabola.
    
// Example: 4 1 2 3 0 0 1 1 0 -0 -0 1 0 16
    Handle_Geom_Parabola theParabola = new Geom_Parabola(axis, 16.0);
    GeomTools::Write(theParabola, dumpFile);
    GeomTools::Dump(theParabola, dumpFile);
    GeomTools::Dump(theParabola, std::cout);

    
// 3D curve record 5: Hyperbola.
    
// Example: 5 1 2 3 0 0 1 1 0 -0 -0 1 0 5 4
    Handle_Geom_Hyperbola theHyperbola = new Geom_Hyperbola(axis, 5.04.0);
    GeomTools::Write(theHyperbola, dumpFile);
    GeomTools::Dump(theHyperbola, dumpFile);
    GeomTools::Dump(theHyperbola, std::cout);

    
// 3D curve record 6: Bezier Curve.
    
// Example: 6 1 2 0 1 0  4 1 -2 0  5 2 3 0  6 
    TColgp_Array1OfPnt poles(13);
    TColStd_Array1OfReal weights(
13);

    poles.SetValue(
1, gp_Pnt(010));
    poles.SetValue(
2, gp_Pnt(1-20));
    poles.SetValue(
3, gp_Pnt(230));

    weights.SetValue(
14.0);
    weights.SetValue(
25.0);
    weights.SetValue(
36.0);

    Handle_Geom_BezierCurve theBezierCurve 
= new Geom_BezierCurve(poles, weights);
    GeomTools::Write(theBezierCurve, dumpFile);
    GeomTools::Dump(theBezierCurve, dumpFile);
    GeomTools::Dump(theBezierCurve, std::cout);

    
// 3D curve record 7: B-Spline Curve.
    
// Example: 7 1 0  1 3 5  0 1 0  4 1 -2 0  5 2 3 0  6
    
//          0 1 0.25 1 0.5 1 0.75 1 1 1
    Standard_Integer degree = 1;
    TColStd_Array1OfReal knots(
15);
    TColStd_Array1OfInteger multiplicities(
15);

    knots.SetValue(
10);
    knots.SetValue(
20.25);
    knots.SetValue(
30.5);
    knots.SetValue(
40.75);
    knots.SetValue(
51.0);

    
// all knots multiplicity of the B-spline is 1.
    multiplicities.Init(1);

    Handle_Geom_BSplineCurve theBSplineCurve 
= new Geom_BSplineCurve(poles, weights, knots, multiplicities, degree);
    GeomTools::Write(theBSplineCurve, dumpFile);
    GeomTools::Dump(theBSplineCurve, dumpFile);
    GeomTools::Dump(theBSplineCurve, std::cout);

    
// 3D curve record 8: Trimmed Curve.
    
// Example: 8 -4 5
    
//          1 1 2 3 1 0 0 
    Handle_Geom_Line theBaseCurve = new Geom_Line(gp_Pnt(123), gp_Dir(100));
    Handle_Geom_TrimmedCurve theTrimmedCurve 
= new Geom_TrimmedCurve(theBaseCurve, -45);
    GeomTools::Write(theTrimmedCurve, dumpFile);
    GeomTools::Dump(theTrimmedCurve, dumpFile);
    GeomTools::Dump(theTrimmedCurve, std::cout);

    
// 3D curve record 9: Offset Curve.
    
// Example: 9 2
    
//          0 1 0 
    
//          1 1 2 3 1 0 0 
    Handle_Geom_OffsetCurve theOffsetCurve = new Geom_OffsetCurve(theBaseCurve, 2.0, gp::DY());
    GeomTools::Write(theOffsetCurve, dumpFile);
    GeomTools::Dump(theOffsetCurve, dumpFile);
    GeomTools::Dump(theOffsetCurve, std::cout);

    
return 0;
}


上述程序將《BRep Format Description White Paper》中的幾何部分(Geometry Section)的三維曲線(3D Curves)示例數據分別使用類GeomTools的靜態函數輸出到屏幕和文件。

當使用GeomTools::Write()時輸出的內容與BRep文件中一致,當使用GeomTools::Dump()時輸出更易讀的信息。為了便于對比理解,將兩種形式都輸出到文件geometryCurve.txt中,輸出數據如下所示:

 

1 1 0 3 0 1 0 
Line
  Origin :
103 
  Axis   :
010 

2 1 2 3 0 0 1 1 0 -0 -0 1 0 4
Circle
  Center :
123 
  Axis   :
001 
  XAxis  :
10-0 
  YAxis  :
-010 
  Radius :
4

3 1 2 3 0 0 1 1 0 -0 -0 1 0 5 4
Ellipse
  Center :
123 
  Axis   :
001 
  XAxis  :
10-0 
  YAxis  :
-010 
  Radii  :
54

4 1 2 3 0 0 1 1 0 -0 -0 1 0 16
Parabola
  Center :
123 
  Axis   :
001 
  XAxis  :
10-0 
  YAxis  :
-010 
  Focal  :
16

5 1 2 3 0 0 1 1 0 -0 -0 1 0 5 4
Hyperbola
  Center :
123 
  Axis   :
001 
  XAxis  :
10-0 
  YAxis  :
-010 
  Radii  :
54

6 1 2 0 1 0  4 1 -2 0  5 2 3 0  6 
BezierCurve rational
  Degree :
2 
   
1 : 010  4
   
2 : 1-20  5
   
3 : 230  6

7 1 0  1 3 5  0 1 0  4 1 -2 0  5 2 3 0  6
 
0 1 0.25 1 0.5 1 0.75 1 1 1
BSplineCurve rational
  Degree 
13 Poles, 5  Knots
Poles :

   
1 : 010  4
   
2 : 1-20  5
   
3 : 230  6
Knots :

   
1 :  0 1
   
2 :  0.25 1
   
3 :  0.5 1
   
4 :  0.75 1
   
5 :  1 1

8 -4 5
1 1 2 3 1 0 0 
Trimmed curve
Parameters : 
-4 5
Basis curve :
Line
  Origin :
123 
  Axis   :
100 

9 2
0 1 0 
1 1 2 3 1 0 0 
OffsetCurveOffset : 
2
Direction : 
010 
Basis curve :
Line
  Origin :
123 
  Axis   :
100 


三、程序說明 Example Description

3.1 直線 Line

示例:

    // 3D curve record 1: Line.
    
// Example: 1 1 0 3 0 1 0 
    Handle_Geom_Line theLine = new Geom_Line(gp_Pnt(103), gp_Dir(010));
    GeomTools::Write(theLine, dumpFile);

<3D curve record 1>描述的直線數據包含一個三維點P和三維方向D,其參數方程為:

wps_clip_image-2851

示例數據表示的直線為經過點(1,0,3)且方向D為(0,1,0)的直線,其參數方程表示為:

wps_clip_image-18657

在Draw Test Harness中創建并顯示直線如下所示:

wps_clip_image-26276

wps_clip_image-28180

3.2 圓 Circle

示例:

    // 3D curve record 2: Circle.
    
// Example: 2 1 2 3 0 0 1 1 0 -0 -0 1 0 4
    gp_Ax2 axis(gp_Pnt(123), gp::DZ());
    Handle_Geom_Circle theCircle 
= new Geom_Circle(axis, 4.0);
    GeomTools::Write(theCircle, dumpFile);

<3D curve record 2>描述的圓的數據包含表示圓心坐標的三維點P,三個方向N,Dx,Dy表示的坐標系和半徑r。其參數方程如下所示:

wps_clip_image-17551

示例數據表示的圓是圓心坐標為(1,2,3),半徑r為(4),圓所在平面的法向N為(0,0,1),圓的X方向(1,0,0)和Y方向為(0,1,0),其參數方程為:

wps_clip_image-3563

在Draw Test Harness中創建并顯示圓如下所示:

wps_clip_image-20956

wps_clip_image-21166

3.3 橢圓 Ellipse

示例:

    // 3D curve record 3: Ellipse.
    
// Example: 3 1 2 3 0 0 1 1 0 -0 -0 1 0 5 4
    Handle_Geom_Ellipse theEllipse = new Geom_Ellipse(axis, 5.04.0);
    GeomTools::Write(theEllipse, dumpFile);

<3D curve record 3>定義了橢圓。橢圓的數據包含三維點P,三維正交坐標系N、Dmaj、Dmin和兩個非負實數rmaj和rmin,且rmin<=rmaj。橢圓位于中心點P,法向量為N的平面上,且長軸、短軸的方向分別為Dmaj, Dmin,長軸、短軸上的半徑分別為rmaj, rmin。橢圓的參數方程定義如下所示:

wps_clip_image-9270

示例數據表示的橢圓的中心點P=(1,2,3),平面的法向量N=(0,0,1),長軸方向Dmaj=(1,0,-0),短軸方向Dmin=(-0,1,0),長軸半徑為5,短軸半徑為4,

wps_clip_image-17875

在Draw Test Harness中創建并顯示橢圓如下所示:

wps_clip_image-10192

wps_clip_image-20746

3.4 拋物線 Parabola

示例:

    // 3D curve record 4: Parabola.
    
// Example: 4 1 2 3 0 0 1 1 0 -0 -0 1 0 16
    Handle_Geom_Parabola theParabola = new Geom_Parabola(axis, 16.0);
  GeomTools::Write(theParabola, dumpFile);

<3D curve record 4>定義了拋物線。拋物線數據包含三維點P,三維正交坐標系坐標軸方向N,Dx,Dy和一個非負的實數f。拋物線通過點P,且位于法向量為N的平面上,焦點長度為f,其參數方程如下所示:

wps_clip_image-15546

示例數據表示的拋物線過點P=(1,2,3),位于平面的法向N=(0,0,1),拋物線的另兩個軸方向Dx=(1,0,-0),Dy=(-0,1,0),焦點長度f=16。參數方程為:

wps_clip_image-1215

在Draw Test Harness中創建并顯示拋物線如下所示:

wps_clip_image-2018

wps_clip_image-14226

3.5 雙曲線 Hyperbola

示例:

    // 3D curve record 5: Hyperbola.
    
// Example: 5 1 2 3 0 0 1 1 0 -0 -0 1 0 5 4
    Handle_Geom_Hyperbola theHyperbola = new Geom_Hyperbola(axis, 5.04.0);
    GeomTools::Write(theHyperbola, dumpFile);

<3D curve record 5>定義了雙曲線。雙曲線定義數據有三維點P,三維正交坐標系坐標軸方向為N,Dx,Dy和兩個非負實數Kx,Ky。雙曲線過P點且法向量為N的平面上,其參數方程如下所示:

wps_clip_image-23853

示例數據表示的雙曲線過點P=(1,2,3)且位于的平面的法向N=(0,0,1),其它的數據Dx=(1,0,-0),Dy=(-0,1,0),Kx=5和Ky=4。其參數方程為:

wps_clip_image-28300

在Draw Test Harness中創建并顯示雙曲線如下所示:

wps_clip_image-4939

wps_clip_image-15401

3.6 Bezier曲線 Bezier Curve

示例:

// 3D curve record 6: Bezier Curve.
// Example: 6 1 2 0 1 0  4 1 -2 0  5 2 3 0  6 
TColgp_Array1OfPnt poles(13);
TColStd_Array1OfReal weights(
13);

poles.SetValue(
1, gp_Pnt(010));
poles.SetValue(
2, gp_Pnt(1-20));
poles.SetValue(
3, gp_Pnt(230));

weights.SetValue(
14.0);
weights.SetValue(
25.0);
weights.SetValue(
36.0);

Handle_Geom_BezierCurve theBezierCurve 
= new Geom_BezierCurve(poles, weights);
GeomTools::Write(theBezierCurve, dumpFile);

<3D curve record 6>定義了Bezier曲線。Bezier曲線數據包含有理標志r,曲線的次數m(degree m <= 25查看源代碼可知OpenCascade可處理的B樣條次數不超過25)和帶權的控制點(weight poles)。當有理標志位r=0時,weight poles就是m+1個三維點:B0,B1...Bn;當有理標志位r=1時,weight poles就是帶權的控制點B0 h0... Bm hm。Bi是三維點,hi是[0,m]正實數,即權因子。當有理標志位r=0時,即不是有理Bezier曲線時,hi=1。Bezier曲線參數方程如下所示:

wps_clip_image-22321

示例數據表示的Bezier曲線是有理Bezier曲線,因其有理標志位r=1,次數m=2,帶權控制點及權因子分別為:B0=(0,1,0),h0=4,B1=(1,-2,0),h1=5,B2=(2,3,0),h2=6。Bezier曲線的參數方程如下所示:

wps_clip_image-29795

在Draw Test Harness中創建并顯示Bezier曲線如下所示:

wps_clip_image-1119

wps_clip_image-18019

3.7 B樣條曲線 B-Spline Curve

示例:

// 3D curve record 7: B-Spline Curve.
// Example: 7 1 0  1 3 5  0 1 0  4 1 -2 0  5 2 3 0  6
//          0 1 0.25 1 0.5 1 0.75 1 1 1
Standard_Integer degree = 1;
TColStd_Array1OfReal knots(
15);
TColStd_Array1OfInteger multiplicities(
15);

knots.SetValue(
10);
knots.SetValue(
20.25);
knots.SetValue(
30.5);
knots.SetValue(
40.75);
knots.SetValue(
51.0);

// all knots multiplicity of the B-spline is 1.
multiplicities.Init(1);

Handle_Geom_BSplineCurve theBSplineCurve 
= new Geom_BSplineCurve(poles, weights, knots, multiplicities, degree);
GeomTools::Write(theBSplineCurve, dumpFile);

<3D curve record 7>定義了B-Spline曲線。B-Spline曲線包含了有理標志位r,曲線次數m<=25,控制點數n>=2,節點數k,帶權控制點wieght poles和節點重數multiplicity knots。

當有理標志位r=0時,是非有理B樣條曲線,weight poles有n個三維點B1,...,Bn;當有理標志位r=1時,是有理B樣條曲線,weight poles是n個帶權控制點對:B1, h1, .... Bn, hn。這里Bi表示一個三維點,hi表示一個[0,1]正實數。當有理標志位r=0時,hi=1。

重節點有k對u1, q1, ... uk, qk。這里ui是重復度為qi>=1的節點。

wps_clip_image-28765

B-Spline曲線的參數方程如下所示:

wps_clip_image-4237

其中基函數Ni,j有如下的遞歸定義:

wps_clip_image-19218

wps_clip_image-10741

示例數據表示的B樣條曲線為:有理標志位r=1,次數m=1,控制點數n=3,節點數k=5,帶權控制點:B1=(0,1,0),h1=4,B2=(1,-2,0),h2=5,B3=(2,3,0),h3=6;節點及其重數u1=0,q1=1,u2=0.25,q2=1,u3=0.5,q3=1,u4=0.75,q4=1,u5=1,q5=1。B-Spline曲線的參數方程如下所示:

wps_clip_image-739

在Draw Test Harness中創建并顯示B-Spline曲線如下所示:

wps_clip_image-29832

wps_clip_image-21180

3.8 裁剪曲線 Trimmed Curve

示例:

// 3D curve record 8: Trimmed Curve.
// Example: 8 -4 5
//          1 1 2 3 1 0 0 
Handle_Geom_Line theBaseCurve = new Geom_Line(gp_Pnt(123), gp_Dir(100));
Handle_Geom_TrimmedCurve theTrimmedCurve 
= new Geom_TrimmedCurve(theBaseCurve, -45);
GeomTools::Write(theTrimmedCurve, dumpFile);

<3D curve record 8>定義了裁剪曲線(trimmed curve)。裁剪曲線數據包含:兩個實數umin,umax和<3D curve record>,且umin<umax。裁剪曲線是將<3D curve record>描述的曲線B限制在[umin,umax]。裁剪曲線的參數方程如下所示:

wps_clip_image-25962

示例數據表示的裁剪曲線為:umin=-4,umax=5,曲線B(u)=(1,2,3)+u(1,0,0)。裁剪曲線的參數方程如下所示:

wps_clip_image-4464

3.9 偏移曲線 Offset Curve

示例:

 // 3D curve record 9: Offset Curve.
 
// Example: 9 2
 
//          0 1 0 
 
//          1 1 2 3 1 0 0 
 Handle_Geom_OffsetCurve theOffsetCurve = new Geom_OffsetCurve(theBaseCurve, 2.0, gp::DY());
 GeomTools::Write(theOffsetCurve, dumpFile);

<3D curve record 9>定義了偏移曲線(offset curve)。偏移曲線的數據包含偏移距離d,偏移方向D和曲線數據<3D curve record>。偏移曲線是將<3D curve record>描述的曲線沿矢量wps_clip_image-23898偏移距離d后的結果。偏移曲線的參數方程如下所示:

wps_clip_image-21785

示例數據表示的偏移曲線為偏移距離d=2,方向D=(0,1,0),基曲線B(u)=(1,2,3)+u(1,0,0),其參數方程如下所示:

wps_clip_image-14616

四、程序分析 Refactoring the Code

wps_clip_image-21076

Figure 4.1 Class diagram of Geom_Curve

根據幾何曲線的類圖可知,幾何曲線有個共同的基類Geom_Curve。而在對幾何數據進行輸出與讀入時,用了很多條件判斷。輸出部分程序代碼如下所示:

 

//=======================================================================
//function : Print
//purpose  : 
//=======================================================================
void GeomTools_CurveSet::PrintCurve(const Handle(Geom_Curve)& C,
                    Standard_OStream
& OS,
                    
const Standard_Boolean compact)
{
  Handle(Standard_Type) TheType 
= C->DynamicType();

  
if ( TheType ==STANDARD_TYPE(Geom_Line)) {
    Print(Handle(Geom_Line)::DownCast(C),OS,compact);
  }
  
else if ( TheType ==  STANDARD_TYPE(Geom_Circle)) {
    Print(Handle(Geom_Circle)::DownCast(C),OS,compact);
  }
  
else if ( TheType == STANDARD_TYPE(Geom_Ellipse)) {
    Print(Handle(Geom_Ellipse)::DownCast(C),OS,compact);
  }
  
else if ( TheType == STANDARD_TYPE(Geom_Parabola)) {
    Print(Handle(Geom_Parabola)::DownCast(C),OS,compact);
  }
  
else if ( TheType == STANDARD_TYPE(Geom_Hyperbola)) {
    Print(Handle(Geom_Hyperbola)::DownCast(C),OS,compact);
  }
  
else if ( TheType == STANDARD_TYPE(Geom_BezierCurve)) {
    Print(Handle(Geom_BezierCurve)::DownCast(C),OS,compact);
  }
  
else if ( TheType == STANDARD_TYPE(Geom_BSplineCurve)) {
    Print(Handle(Geom_BSplineCurve)::DownCast(C),OS,compact);
  }
  
else if ( TheType == STANDARD_TYPE(Geom_TrimmedCurve)) {
    Print(Handle(Geom_TrimmedCurve)::DownCast(C),OS,compact);
  }
  
else if ( TheType == STANDARD_TYPE(Geom_OffsetCurve)) {
    Print(Handle(Geom_OffsetCurve)::DownCast(C),OS,compact);
  }
  
else {
    GeomTools::GetUndefinedTypeHandler()
->PrintCurve(C,OS,compact);
    
//if (!compact)
    
//  OS << "****** UNKNOWN CURVE TYPE ******\n";
    
//else 
    
//  cout << "****** UNKNOWN CURVE TYPE ******" << endl;
  }
}

讀入部分的程序代碼如下所示:

 

//=======================================================================
//function : ReadCurve
//purpose  : 
//=======================================================================
Standard_IStream& GeomTools_CurveSet::ReadCurve(Standard_IStream& IS,
                        Handle(Geom_Curve)
& C)
{
  Standard_Integer ctype;

  
try {
    OCC_CATCH_SIGNALS
    IS 
>> ctype;
    
switch (ctype) {

    
case LINE :
      {
        Handle(Geom_Line) CC;
        IS 
>> CC;
        C 
= CC;
      }
      
break;

    
case CIRCLE :
      {
        Handle(Geom_Circle) CC;
        IS 
>> CC;
        C 
= CC;
      }
      
break;

    
case ELLIPSE :
      {
        Handle(Geom_Ellipse) CC;
        IS 
>> CC;
        C 
= CC;
      }
      
break;

    
case PARABOLA :
      {
        Handle(Geom_Parabola) CC;
        IS 
>> CC;
        C 
= CC;
      }
      
break;

    
case HYPERBOLA :
      {
        Handle(Geom_Hyperbola) CC;
        IS 
>> CC;
        C 
= CC;
      }
      
break;

    
case BEZIER :
      {
        Handle(Geom_BezierCurve) CC;
        IS 
>> CC;
        C 
= CC;
      }
      
break;

    
case BSPLINE :
      {
        Handle(Geom_BSplineCurve) CC;
        IS 
>> CC;
        C 
= CC;
      }
      
break;

    
case TRIMMED :
      {
        Handle(Geom_TrimmedCurve) CC;
        IS 
>> CC;
        C 
= CC;
      }
      
break;

    
case OFFSET :
      {
        Handle(Geom_OffsetCurve) CC;
        IS 
>> CC;
        C 
= CC;
      }
      
break;
      
    
default:
      {
        Handle(Geom_Curve) CC;
        GeomTools::GetUndefinedTypeHandler()
->ReadCurve(ctype,IS,CC);
        C 
= CC;
      }
    }
  }
  
catch(Standard_Failure) {
#ifdef DEB
    Handle(Standard_Failure) anExc 
= Standard_Failure::Caught();
    cout 
<<"EXCEPTION in GeomTools_CurveSet::ReadCurve(..)!!!" << endl;
    cout 
<< anExc << endl;
#endif
    C 
= NULL;
  }
  
return IS;
}

正如《Refactoring-Improving the Design of Existing Code》書中以多態取代條件表達式(Replace Conditional with Polymorphism)所說,在面向對象術語中,聽上去最高貴的詞非“多態”莫屬。多態最根本的好處就是如果你需要根據對象的不同類型而采取不同的行為,多態使你不必編寫明顯的條件表達式。正因為有了多態,所以你會發現“類型碼的switch語句”以及“基于類型名稱的if-then-else語句”在面向對象程序中很少出現。

多態能夠帶給你很多好處。如果同一組條件表達式在程序許多地方出現,那么使用多態的收益是最大的。使用條件表達式時,如果你想添加一種新類型,就必須查找并更新所有條件表達式。但如果改用多態,只需要一個新的子類,并在其中提供適當的函數就行了。類的用戶不需要了解這個子類,這就大降低了系統各部分之間的依賴,使系統升級更容易。

OpenCascade的幾何曲線已經有一個基類Geom_Curve了,可將輸出做為虛函數,就不需要做判斷了。在讀入(創建)時引入工廠模式,對于UndefinedTypeHandler()可以引入Null對象。經過這樣重構之后的程序可讀性應該會更好吧!

五、結論 Conclusion

在邊界表示BRep的形狀中,參數表示的幾何曲線并不會孤立存在,他總是依附于拓樸邊中。在OpenCascade的BRep格式的文件中三維幾何曲線共有九種,通過將這九種幾何曲線輸出,理解參數表示的幾何曲線的數據結構。

通過查看其讀寫幾何曲線的源程序,提出重構的方法。當在面向對象的程序中出現很條件表達式時,那么程序就有“壞味道”了,需要進行重構改進。

六、參考資料 References

1. OpenCascade. BRep Format Description White Paper

2. Martin Fowler. Refactoring:Improving the Design of Existing Code. Addison-Wesley

3. Les Piegl, Wayne Tiller. The NURBS Book. Springer-Verlag

 

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            激情欧美一区二区三区在线观看| 影音先锋另类| 亚洲国产视频直播| 亚洲免费av观看| 亚洲精品一区二区网址| 亚洲国产小视频在线观看| 亚洲高清激情| 一区二区欧美激情| 性欧美暴力猛交69hd| 久久精品色图| 亚洲第一中文字幕在线观看| 99精品视频免费在线观看| 中国女人久久久| 欧美中文在线观看国产| 久久久人人人| 国产精品久久久久久久久婷婷| 国产性色一区二区| 亚洲肉体裸体xxxx137| 亚洲制服av| 欧美**字幕| 亚洲婷婷综合色高清在线| 久久一区二区三区av| 欧美日韩国产电影| 国产欧美日韩视频在线观看 | 久久综合久久综合久久| 欧美美女日韩| 欧美中文在线观看| 亚洲精品乱码| 一区二区高清在线观看| 欧美一区二区免费观在线| 免费成人小视频| 久久久女女女女999久久| 老司机精品视频网站| 99精品国产在热久久婷婷| 欧美有码视频| 国产精品久久久久77777| 亚洲高清av在线| 久久99在线观看| 在线中文字幕一区| 欧美成人在线影院| 国产欧美日韩91| 亚洲综合好骚| 亚洲麻豆视频| 欧美精品v国产精品v日韩精品| 国产亚洲精品久| 亚洲一区精品视频| 亚洲美女91| 欧美极品在线视频| 亚洲国产你懂的| 免费视频一区| 久久久国产一区二区| 国产精品免费aⅴ片在线观看| 9久草视频在线视频精品| 美女国产一区| 久久精品综合| 激情综合久久| 美女网站在线免费欧美精品| 欧美影院精品一区| 国产日韩在线一区| 久久精品成人| 久久国产精品网站| 一区视频在线播放| 米奇777超碰欧美日韩亚洲| 欧美在线视频免费| 国产色产综合产在线视频| 欧美一区二区三区日韩| 国产精品美女| 欧美大尺度在线| 日韩视频在线永久播放| 亚洲三级免费电影| 欧美久久视频| 亚洲一区二区三区免费观看| 99在线精品免费视频九九视| 欧美视频免费看| 亚洲欧美日韩中文播放| 香蕉成人久久| 亚洲大片在线| 亚洲国产影院| 国产精品久久久久久妇女6080 | 国产精品国产三级国产普通话三级| 中国成人黄色视屏| 亚洲色在线视频| 亚洲免费视频一区二区| 亚洲性视频h| 国语自产偷拍精品视频偷| 免费在线欧美视频| 欧美精品日韩精品| 亚洲欧美国产精品va在线观看| 欧美一区二区三区男人的天堂| 国产亚洲人成a一在线v站 | 日韩亚洲在线观看| 欧美日韩精品伦理作品在线免费观看| a4yy欧美一区二区三区| 亚洲一区成人| 亚洲国产一区二区三区高清| 99国产精品久久久久老师| 国产偷自视频区视频一区二区| 免费亚洲电影在线观看| 亚洲制服欧美中文字幕中文字幕| 今天的高清视频免费播放成人 | 午夜精品一区二区三区在线| 久久精品亚洲乱码伦伦中文| 一本色道久久综合狠狠躁篇的优点 | 欧美一区二区观看视频| 久久影院午夜论| 午夜欧美精品久久久久久久| 牛人盗摄一区二区三区视频| 午夜在线视频观看日韩17c| 麻豆freexxxx性91精品| 欧美一区二区精品| 欧美午夜精品理论片a级按摩| 老牛国产精品一区的观看方式| 欧美日韩免费观看中文| 免费在线看成人av| 国产日韩欧美在线看| 中日韩美女免费视频网站在线观看| 亚洲国产精品欧美一二99| 一本色道久久综合| 亚洲精品一区中文| 久久综合色播五月| 久久亚洲风情| 国产亚洲成年网址在线观看| 在线一区视频| 一区二区电影免费在线观看| 免费永久网站黄欧美| 免费久久99精品国产自| 国产一区在线视频| 亚洲伊人伊色伊影伊综合网 | 在线电影院国产精品| 香蕉乱码成人久久天堂爱免费| 精品999久久久| 性色av一区二区三区红粉影视| 亚洲欧美日韩国产一区| 欧美色图天堂网| 亚洲免费观看高清完整版在线观看熊 | 国产精品一二三四区| 久久久综合网| 亚洲毛片一区二区| 韩国一区电影| 亚洲伊人伊色伊影伊综合网| 亚洲理论在线| 欧美 日韩 国产在线| 麻豆精品在线视频| 国产一区二区日韩| 欧美一级视频| 久久久久久成人| 国产乱肥老妇国产一区二 | 久久久免费观看视频| 国产酒店精品激情| 久久成人18免费网站| 欧美成人精品在线观看| 亚洲黄一区二区三区| 欧美电影在线观看完整版| 亚洲第一中文字幕在线观看| 国内久久精品视频| 久久久综合免费视频| 亚洲风情亚aⅴ在线发布| 99在线精品视频| 国产精品国产亚洲精品看不卡15 | 欧美亚洲色图校园春色| 欧美性大战久久久久久久蜜臀| 制服诱惑一区二区| 欧美一区二区三区日韩视频| 国产在线拍偷自揄拍精品| 另类亚洲自拍| 亚洲人成人一区二区三区| 亚洲一区二区欧美日韩| 国产乱理伦片在线观看夜一区| 久久久亚洲国产美女国产盗摄| 亚洲国产精品高清久久久| 亚洲男女自偷自拍| 黄色精品免费| 欧美日韩一区三区| 久久久99国产精品免费| 亚洲美女中文字幕| 久久国内精品自在自线400部| 亚洲人www| 国产日韩精品视频一区| 欧美刺激性大交免费视频| 亚洲综合日韩在线| 欧美激情片在线观看| 欧美在线视频免费| 夜夜爽www精品| 伊人夜夜躁av伊人久久| 国产精品麻豆成人av电影艾秋| 蜜桃av一区二区在线观看| 亚洲欧美中文字幕| 亚洲理伦电影| 欧美激情aaaa| 久久综合影视| 欧美在线免费观看亚洲| 一区二区三区欧美在线| 欧美一级在线视频| 欧美韩日一区二区| 亚洲一区二区免费在线| 亚洲激情成人网| 久久综合婷婷| 久久精品国产99| 亚洲欧美日韩一区二区在线| 99国产精品99久久久久久|