并构成程序表达OpenCascade中的边界表示的现实贯彻,它形成物体边界表示的

Topology and Geometry in
OpenCascade-Face

Topology Shapes of OpenCascade BRep

eryar@163.com

摘要Abstract:通过对OpenCascade中的BRep数据的读写,精晓边界表示法的概念及落实。通晓了拓朴形状的数据结构,就对ModelingData模块有了清晰认识,方便OpenCascade其余模块如ModelingAlgorithms和Visiualization模块的掌握。 

关键字Key Words:OpenCascade, BRep, Topology, BRep Format 

eryar@163.com

一、引言 Introduction

边界表示(Boundary
Representation)也号称BRep表示,它是几何样子中最成熟、无二义的表示法。实体的边际经常是由面包车型客车并集表示,而各类面又由它所在曲面包车型客车概念加上其边界来表示,面包车型地铁边界是边的并集,而边又是由点来代表。如下图1.一所示,曲面的交界处形成曲线,而曲线的交界处形成点。所以点、线、面是讲述2个形状所需求的大旨组成单元。 

图片 1

Figure 1.1 BRep Shape demo 

分界表示的二个主要特色是描述形象的音讯包蕴几何新闻(geometry)和拓朴(topology)音信三个地点。拓朴消息描述形象上的终点、边、面包车型地铁连接关系,它形成物体边界表示的“骨架”。形状的几何新闻仿佛附着在“骨架”上的肌肉。在OpenCascade中,形状的几何消息包涵曲线和曲面包车型客车参数解析表示吉优m_Curve/Geom_Surface。 

这般我们就足以用平面方程和柱面方程来叙述曲面,用直线或圆弧方程来讲述曲线。那时会并发1个标题,即代数表明式只好定义无边界的几何体。除了单个点、圆以及球体,经典的剖析几何仅能代表最佳延伸的曲线和曲面。为了消除那么些题材,边界表示法按下述方法明显地定义曲线或曲面的境界: 

l 曲线的分界由位于曲线上的1对点来规定; 

l 曲面包车型客车边界由位于曲面上的1组曲线来规定; 

通过这么些方法,就能够定义一段曲线或一片曲面。这时,不相同几何成分之间的关系的公司难题就涌出了,为此大家将记录如下音讯: 

l 哪些点范围什么曲线; 

l 哪些曲线界定什么曲面; 

那么些有关何人关联何人的消息,便是几何样子系统时常涉及的拓朴。在分界表示法中,理论上意味着二个大人体模型型只需求八个拓朴体(顶点TopoDS_Vertex、边TopoDS_Edge和面TopoDS_Face),但在其实使用中,为了抓实计算机处理的快慢或提供高级的操作功能,还要引进其余一些概念,如环TopoDS_Wire、壳TopoDS_Shell、复合体TopoDS_Compound等。 

摘要Abstract:本文简要介绍了几何样子中的边界表示法(BRep),并结合程序表达OpenCascade中的边界表示的有血有肉落到实处,即拓朴与几何的联络。对拥有几何消息的拓朴结构顶点(vertex)、边(edge)、面(face)实行了详实表达。本文仅对面(Face)进行认证。 

2、边界表示造型中的几何数据 吉优metry of BRep shapes

对造型数据的读写主若是由类BRepTools_ShapeSet来达成的,当中在类的函数AddGeometry中对拓朴形状中的几何数据开始展览了拍卖,代码如下所示:

//=================================================================
//function : AddGeometry
//purpose  : 
//=================================================================
void BRepTools_ShapeSet::AddGeometry(const TopoDS_Shape& S)
{
  // Add the geometry

  if (S.ShapeType() == TopAbs_VERTEX) {

    Handle(BRep_TVertex) TV = Handle(BRep_TVertex)::DownCast(S.TShape());
    BRep_ListIteratorOfListOfPointRepresentation itrp(TV->Points());

    while (itrp.More()) {
      const Handle(BRep_PointRepresentation)& PR = itrp.Value();

      if (PR->IsPointOnCurve()) {
        myCurves.Add(PR->Curve());
      }

      else if (PR->IsPointOnCurveOnSurface()) {
        myCurves2d.Add(PR->PCurve());
        mySurfaces.Add(PR->Surface());
      }

      else if (PR->IsPointOnSurface()) {
        mySurfaces.Add(PR->Surface());
      }

      ChangeLocations().Add(PR->Location());
      itrp.Next();
    }

  }
  else if (S.ShapeType() == TopAbs_EDGE) {

    // Add the curve geometry
    Handle(BRep_TEdge) TE = Handle(BRep_TEdge)::DownCast(S.TShape());
    BRep_ListIteratorOfListOfCurveRepresentation itrc(TE->Curves());

    while (itrc.More()) {
      const Handle(BRep_CurveRepresentation)& CR = itrc.Value();
      if (CR->IsCurve3D()) {
        if (!CR->Curve3D().IsNull()) {
          myCurves.Add(CR->Curve3D());
          ChangeLocations().Add(CR->Location());
        }
      }
      else if (CR->IsCurveOnSurface()) {
        mySurfaces.Add(CR->Surface());
        myCurves2d.Add(CR->PCurve());
        ChangeLocations().Add(CR->Location());
        if (CR->IsCurveOnClosedSurface())
          myCurves2d.Add(CR->PCurve2());
      }
      else if (CR->IsRegularity()) {
        mySurfaces.Add(CR->Surface());
        ChangeLocations().Add(CR->Location());
        mySurfaces.Add(CR->Surface2());
        ChangeLocations().Add(CR->Location2());
      }
      else if (myWithTriangles) { // for XML Persistence
        if (CR->IsPolygon3D()) {
          if (!CR->Polygon3D().IsNull()) {
            myPolygons3D.Add(CR->Polygon3D());
            ChangeLocations().Add(CR->Location());
          }
        }
        else if (CR->IsPolygonOnTriangulation()) {
          myTriangulations.Add(CR->Triangulation());
          myNodes.Add(CR->PolygonOnTriangulation());
          ChangeLocations().Add(CR->Location());
          if (CR->IsPolygonOnClosedTriangulation())
            myNodes.Add(CR->PolygonOnTriangulation2());
        }
        else if (CR->IsPolygonOnSurface()) {
          mySurfaces.Add(CR->Surface());
          myPolygons2D.Add(CR->Polygon());
          ChangeLocations().Add(CR->Location());
          if (CR->IsPolygonOnClosedSurface())
          myPolygons2D.Add(CR->Polygon2());
        }
      }
      itrc.Next();
    }
  }

  else if (S.ShapeType() == TopAbs_FACE) {

    // Add the surface geometry
    Handle(BRep_TFace) TF = Handle(BRep_TFace)::DownCast(S.TShape());
    if (!TF->Surface().IsNull())  mySurfaces.Add(TF->Surface());

    if (myWithTriangles) { // for XML Persistence
      Handle(Poly_Triangulation) Tr = TF->Triangulation();
      if (!Tr.IsNull()) myTriangulations.Add(Tr);
    }

    ChangeLocations().Add(TF->Location());
  }
}

根据上述代码可见,OpenCascade在保留和读写BRep表示的模样时,只保留了巅峰、边和面包车型大巴音讯,因为唯有那四个拓朴结构中富含了几何新闻及显示用的离散点和三角网格数据。有了这个音信,就能够生成一个境界表示的形制了。 

几何之间的关联也保存起来了,那也是拓朴数据的一种样式,在下节详细表明。 

关键字Key Words:OpenCascade、BRep、Topology、Geometry、Face 

三、边界表示造型中的拓朴数据 Topology of BRep shapes

关于拓朴顶点TopoDS_Vertex、边TopoDS_Edge、面TopoDS_Face更详实的音信,请参报考博士博士客: 

l Topology and Geometry in
OpenCascade-Vertex

l Topology and Geometry in
OpenCascade-Edge

l Topology and Geometry in
OpenCascade-Face

l Topology and Geometry in
OpenCascade-Topology

正文只对Open卡斯卡特拓朴结构中的几何数据的涉嫌消息举办解析。 

一、引言 Introduction

面(Face)由一个外环和多少个内环来代表,内环完全在外环之内。根据环(Wire)的定义,在表面沿环的大势前行,右边总在面内,左边总在面外。面有方向性,壹般用其外法矢方向作为该面包车型地铁正向。若1个面的法矢向外,称为正向面;反之,称为反向面。面包车型客车形态(三星平板)由面包车型地铁几何消息来代表,能够是平面或曲面,平面可用平面方程来叙述,曲面能够用控制多边形或型值点来描述(NURBS曲面),也可用曲面方程(隐式、显式或参数格局)来叙述。对于参数曲面,常常在其二维参数域上定义环,那样就足以由壹些2维的有向边来表示环,集合运算中对面包车型地铁划分也可在2维参数域上拓展。 

OpenCascade中的面结构如下图所示: 

图片 2

Figure 1.1 OpenCascade Face 

遵照其类图可见,面除了其参数曲面mySurface外,还包括显示曲面包车型客车剖分(由三角形组成)。当面在着色显示情势下时会总括出面包车型大巴三角形。可视化的算法是由BRepMesh::Mesh()来为每种面三角剖分后用来体现。 

3.1 顶点 TopoDS_Vertex

组合《BRep Format Description 惠特e Paper》中对<vertex
data>的讲述,及程序代码中对极端数据的读取,分析OpenCascade的BRep表示中的顶点。 

图片 3

Figure 3.1.1 NBF-like definition of Vertex 

详细表明: 

<vertex data representation u parameter>u的运用方法求证如下: 

<vertex data representation data 壹>
和参数u定义了三个维度曲线C上的点V的岗位。参数u是曲线C上点V对应的参数:C(u)=V。对应的类是:BRep_PointOnCurve; 

<vertex data representation data
贰>和参数u定义了曲面上的2维曲线C上点V的岗位。参数u是曲线C上点V对应的参数:C(u)=V。对应的类是:BRep_PointOnCurveOnSurface; 

<vertex data representation data 3>和参数u及<vertex data
representation v
parameter>v定义了曲面S上的点V:S(u,v)=V。对应的类是:BRep_PointOnSurface; 

在这几个类中都将顶点对应的曲线、曲面及其上点的参数都保存起来了。有了那几个信息就能够判断与终极有关联的边或面,因为曲线、曲面属于边和面。 

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

图片 4

下边结合程序示例片段,创造贰个终端并将其出口为BRep文件,并在OpenCascade中进行彰显。

void TestVertex(void)
{
    ofstream dumpFile("vertex.brep");

    TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex(gp_Pnt(1.0, 2.0, 3.0));

    BRepTools::Dump(aVertex, std::cout);
    BRepTools::Write(aVertex, dumpFile);
}

当使用BRepTools::Dump时,呈现更易读的新闻。可将数据dump到荧屏,也可将数据dump到文件;当使用Write时,生成的消息正是BRep文件格式的数据。能够透过Read生成形状,也可径直读入到OpenCascade中显得,如下图3.1.2所示: 

图片 5

Figure 3.1.2 Import a Vertex from brep file 

二、面 Face

面(Face)是用来讲述三个维度实体边界的拓朴实体。面是由底层的曲面及1个或三个环(Wire)来叙述。例如,一个圆柱体包涵两个面:底面、顶面和侧面。各个面都以最最的(无界的)(Geom_Plane和Geom_CylindricalSurface),通过边界来限制无限的面获得面。即用位于吉优m_Circle上的边形成的环,限定出底面和顶面。侧面包涵肆条边:其中两条边与顶面和底面其享,剩下的两条边是缝合边(seam
edge),参看在此以前的议论。限定侧面包车型客车环包罗缝合边四遍,多个缝合边具有分化的向阳。 

3.2 边 TopoDS_Edge

图片 6

详尽表明: 

标志位<edge data same parameter flag>,<edge data same range
flag>,<edge data degenerated flag>有专门的用处。 

<edge data representation data
一>表示贰个三个维度曲线,对应类:吉优m_Curve; 

<edge data representation data 二>表示曲面上的贰个二维曲线, 

对应类Geom_Curve/Geom_Surface; 

<curve values for parameter minimal and maximal
values>只在2版本中使用; 

<edge data representation data 三>表示闭合曲面上的2个二维曲线; 

对应类Geom_Curve/Geom_Surface; 

<curve values for parameter minimal and maximal
values>只在贰版本中使用; 

<edge data representation data
四>表示Regularity的边,使用到的类有: 

Geom_Curve/Geom_Surface; 

<edge data representation data 伍>表示一个三个维度的多段线(3D
polyline); 

对应的类:Poly_Polygon3D,是边的类似表示,主要用于呈现; 

<edge data representation data 陆>表示三角剖分上一条多段线; 

相应的类:Poly_PolygonOnTriangulation,也是边在三角剖分上的接近表示; 

<edge data tolerance> t的概念如下所示: 

图片 7

上面的示范程序片段将圆的边导出为BRep文件,并在Open卡斯卡特中显得。程序代码如下所示:

void TestEdge(bool bSubdivision = false)
{
    ofstream dumpFile("edge.brep");

    TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge(gp_Circ(gp::XOY(), 6.0));

    if (bSubdivision)
    {
        BRepMesh::Mesh(anEdge, 1.0);
    }

    BRepTools::Dump(anEdge, std::cout);
    BRepTools::Write(anEdge, dumpFile);
}

中间参数bSubdivision用来扭转突显用的离散多段线数据,那里会生成<edge
data representation data
伍>的Poly_Polygon3D,将转变的BRep文件导入进行展现如下图所示: 

图片 8

Figure 3.2.1 Import a Face from brep file 

2.1 曲面 Surface

让我们大约回想一下哪些是曲面(三星平板)。如若您在高中时学过数学分析(mathematical
analysis),那么你恐怕对这几个定义已经熟记于心。假使没学过,那么大概要求读些小说来自学。在wikipedia上有关于参数曲面包车型地铁简易例子。 

曲面将2维参数空间{u, v}映射到三个维度空间。如下图所示: 

图片 9

Figure 2.1 Map parameter space{u, v} into 3D space 

参数区间能够有界,也足以是无界的,也能够只在三个主旋律上有界。如平面(Plane)的参数空间是无界的;NURBS是有界的;圆柱面(Cylindrical
Surface)在U方向上有界(U∈[0,2π]),在V方向上是无界的。 

Geom_Surface::Value()重临3个应和于参数空间中的参数(U,V)的空间点(X,Y,Z)。例如:地球上的轻易一点都由纬度(V)和经度(U)表示,不过在世界坐标系中得以看做三个维度点(借使地球的大旨概念为原点)。那个函数是纯虚函数,全体派生自吉优m_Surface的类都有对那一个函数的完毕,使计量各类曲面上相应参数的空间点的主意统一。 

让大家回看一下,边必须具有三个维度曲线(3D
Curve)和曲面空间中的参数曲线(pcurve)。而OpenCascade须求面的界线(环wire)在三维和二维空间中务必是关闭的。因而,圆柱的侧面是利用前面我们谈谈的那么来描述的。 

3.3 面 TopoDS_Face

图片 10

详见表明: 

<face data>描述了面F的曲面S和三角剖分T。曲面S只怕为空:<平板电脑number>=0. 

<face data tolerance> t的概念如下所示: 

图片 11

注脚位<face data natural restriction flag>有特意的用处。 

面中的数据相比较不难,有参数表示的曲面包车型大巴索引号。若曲面已经被三角剖分,将会把剖分后的网格数据也保存起来。下边包车型大巴演示程序片段将四个球面导出为brep文件:

void TestFace(bool bSubdivision = false)
{
    ofstream dumpFile("face.brep");

    TopoDS_Face aFace = BRepBuilderAPI_MakeFace(gp_Sphere(gp::XOY(), 6.0));

    if (bSubdivision)
    {
        BRepMesh::Mesh(aFace, 1.0);
    }

    BRepTools::Dump(aFace, std::cout);
    BRepTools::Write(aFace, dumpFile);
}

其中参数bSubdivision用来扭转展现用的网格数据,那里会转变Poly_Triangulation,将转变的BRep文件导入实行浮现如下图所示: 

图片 12

Figure 3.3.1 Import a Face from brep 

2.2 朝向 Orientation

面包车型客车朝向表示面包车型地铁法向与曲面法向里面包车型客车涉及(Face orientation shows how
face normal is aligned with its 苹果平板normal)。若面包车型地铁朝向是TopAbs_FO奥德赛WASportageD(向前),则面包车型地铁法向与曲面包车型客车法向壹致;若面包车型地铁通往是TopAbs_REVE大切诺基SED(反向),则面包车型地铁法向与曲面包车型地铁法向相反。面包车型大巴法向表示材质的岗位,质地位于面包车型地铁西边。在科学描述的实体中,全部面的法向都是向外的,如下图所示: 

图片 13

Figure 2.2 In a correct solid body all face normals go outward 

表面包车型地铁素材是由边的通向明确的。方向是由曲面不是面()的法向和边的微分的叉积明确。若边的朝向向前,则边的导数等于它的三个维度曲线的导数;若边的通向反向,则边的导数与它的三个维度曲线的导数相反。恐怕思索边的参数曲线会更易于明白:若是边是向前的,质感在它的左手,假诺是反向的,则材质在它的出手。那让作者想起了格林公式中对平面区域的边界曲线正向的规定:对平面区域D的边际曲线L,大家规定L的正向如下:当观看者沿L的那么些势头行进时,D内在他周边处的那有个别总在她的左侧。 

图片 14

Figure 2.3 Orientation of the edge 

当用积分区域的定义来精晓边的通向时好像要便于些。把参数空间作为积分区域D,其铁锈红色的边表示材质在参数曲线的左侧;栗褐的边表示材质在边的左侧。 

4、示例程序 Example Code

将上述代码放在一块儿,完整的程序代码如下所示: 

/*
*    Copyright (c) 2013 eryar All Rights Reserved.
*
*           File : Main.cpp
*         Author : eryar@163.com
*           Date : 2013-12-21 21:18
*        Version : 1.0v
*
*    Description : Use BRepTools to dump and write BRep files.
*
*      Key Words : OpenCascade, BRep, Vertex, Edge, Face
*                  
*/

// OpenCascade library.
#define WNT
#include <gp_Pnt.hxx>
#include <gp_Circ.hxx>
#include <gp_Sphere.hxx>

#include <TopoDS_Vertex.hxx>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Face.hxx>

#include <BRepMesh.hxx>
#include <BRepTools.hxx>

#include <BRepBuilderAPI_MakeVertex.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <BRepBuilderAPI_MakeFace.hxx>

#pragma comment(lib, "TKernel.lib")
#pragma comment(lib, "TKMath.lib")
#pragma comment(lib, "TKBRep.lib")
#pragma comment(lib, "TKMesh.lib")
#pragma comment(lib, "TKTopAlgo.lib")


void TestVertex(void)
{
    ofstream dumpFile("vertex.brep");

    TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex(gp_Pnt(1.0, 2.0, 3.0));

    BRepTools::Dump(aVertex, std::cout);
    BRepTools::Write(aVertex, dumpFile);
}


void TestEdge(bool bSubdivision = false)
{
    ofstream dumpFile("edge.brep");

    TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge(gp_Circ(gp::XOY(), 6.0));

    if (bSubdivision)
    {
        BRepMesh::Mesh(anEdge, 1.0);
    }

    BRepTools::Dump(anEdge, std::cout);
    BRepTools::Write(anEdge, dumpFile);
}


void TestFace(bool bSubdivision = false)
{
    ofstream dumpFile("face.brep");

    TopoDS_Face aFace = BRepBuilderAPI_MakeFace(gp_Sphere(gp::XOY(), 6.0));

    if (bSubdivision)
    {
        BRepMesh::Mesh(aFace, 1.0);
    }

    BRepTools::Dump(aFace, std::cout);
    BRepTools::Write(aFace, dumpFile);
}


int main(void)
{
    TestVertex();

    TestEdge(true);

    TestFace(true);

    return 0;
}

也能够把更易懂的音信dump出来,那样能够越来越好地理解brep文件的格式。当将球面导出为brep文件时,会变卦很多音讯,如下所示: 

Shape : 7, FORWARD

Dump of 7 TShapes

-----------------

Flags : Free, Modified, Checked, Orientable, Closed, Infinite, Convex

TShape # 1 : FACE      1101000 01807868
    +2
NaturalRestriction
    Tolerance : 1e-007
    - Surface : 1

TShape # 2 : WIRE      0101100 01807CE8
    -5 +4 +5 -3

TShape # 3 : EDGE      0101000 01808C10
    +6 -6
    Tolerance : 1e-007
     same parametrisation of curves
     same range on curves
     degenerated
    - PCurve : 4 on surface 1, range : 0 6.28319
  UV Points : 0, 1.5708 6.28319, 1.5708

TShape # 4 : EDGE      0101000 01807AA0
    +7 -7
    Tolerance : 1e-007
     same parametrisation of curves
     same range on curves
     degenerated
    - PCurve : 3 on surface 1, range : 0 6.28319
  UV Points : 0, -1.5708 6.28319, -1.5708

TShape # 5 : EDGE      0101000 018078C8
    +7 -6
    Tolerance : 1e-007
     same parametrisation of curves
     same range on curves
    - Curve 3D : 1, range : -1.5708 1.5708
    - PCurve : 1, 2 (C0) on surface 1, range : -1.5708 1.5708
  UV Points : 6.28319, -1.5708 6.28319, 1.5708
  UV Points : 0, -1.5708 0, 1.5708

TShape # 6 : VERTEX    0101101 018076F0

    Tolerance : 1e-007
    - Point 3D : 3.67394e-016, 0, 6

TShape # 7 : VERTEX    0101101 01807680

    Tolerance : 1e-007
    - Point 3D : 3.67394e-016, 0, -6


 -------
Dump of 4 Curve2ds
 -------

   1 : Line
  Origin :6.28319, 0
  Axis   :0, 1

   2 : Line
  Origin :0, 0
  Axis   :0, 1

   3 : Line
  Origin :0, -1.5708
  Axis   :1, 0

   4 : Line
  Origin :0, 1.5708
  Axis   :1, 0


 -------
Dump of 1 Curves
 -------

   1 : Trimmed curve
Parameters : 4.71239 7.85398
Basis curve :
Circle
  Center :0, 0, 0
  Axis   :0, -1, 0
  XAxis  :1, 0, 0
  YAxis  :-0, 0, 1
  Radius :6

 -------
Dump of 0 Polygon3Ds
 -------
 -------
Dump of 0 PolygonOnTriangulations
 -------

 -------
Dump of 1 surfaces
 -------

   1 : SphericalSurface
  Center :0, 0, 0
  Axis   :0, 0, 1
  XAxis  :1, 0, -0
  YAxis  :-0, 1, 0
  Radius :6

 -------
Dump of 0 Triangulations
 -------



 -------
 Dump of 0 Locations
 -------

基于上边包车型地铁数量,可以很好地明白BRep中拓朴形状的连带数据。当先四分之二数额也许很直观,便于通晓的。当中有个数据大概必要表达即PCurve(Parametric
Curve),它是在参数(u,v)空间的曲面上的参数曲线。只怕有点倒霉精通,结合程序代码看下PCurve的利用,就会Aha!峰回路转的:

//=================================================================//function : D0
//purpose  : 
//=================================================================
void BRep_CurveOnSurface::D0(const Standard_Real U, gp_Pnt& P) const
{
  // shoud be D0 NYI
  gp_Pnt2d P2d = myPCurve->Value(U);
  P = mySurface->Value(P2d.X(),P2d.Y());
  P.Transform(myLocation.Transformation());
}

此函数的功力是求PCurve上相应参数u的曲面上的点,即0次微分D0。依据PCurve上的2个参数u,能够求出对应参数u的PCurve上的点,把这么些点的x,y分别作为参数曲面包车型客车参数u,v,即求出了曲面上的点。 

2.3 容差 Tolerance

面包车型大巴容差的几何意义是包围面包车型地铁三个持有厚度的板。如下图所示: 

图片 15

Figure 2.4 Face Tolerance 

与边和顶峰的容差相比较,建模算法中用到面包车型地铁容差的景况相对要少。平日都施用暗中认可值Precision::Confusion()。日常状态下,OpenCascade必要注意以下标准: 

当边位于面上,顶点位于边上时,面包车型地铁容差<=边的容差<=顶点的容差。 

五、结论 Conclusion

通进程序代码将《BRep Format Description 惠特e
帕佩r》中数量开始展览读写,深刻通晓OpenCascade的界线表示法的数据结构模块ModelingData,为精晓别的模块打下基础。 

在边际表示法中,理论上意味着2个大人体模型型只需求四个拓朴体(顶点TopoDS_Vertex、边TopoDS_Edge和面TopoDS_Face),所以在对brep文件输出时,只处理了那三种拓朴体的新闻。在生成形状时,首要也是拍卖那三种拓朴体,再依据他们转移别的拓朴体。 

顶点、边和面包车型大巴几何之间的维系在brep中也保存起来了,有了这么些音信,就足以判断1个极限是还是不是旁边的点等。通过演示程序,来精通参数曲线PCurve。 

略知一2了brep表示的结构后,下一步准备来商量下造型算法模块ModelingAlgorithms。 

2.肆 三角剖分 Triangulation

除此之外面包车型大巴参数表示,为了面包车型地铁展现,须要对面进行三角剖分,剖分获得的三角也保留在面包车型客车数据结构中。当在着色渲染格局下时,可视化算法内部调用了BRepMesh::Mesh()来对各类面进行三角剖分,并将三角剖分获得的三角形加到面包车型地铁数据结构中。 

陆、参考资料 References

  1. BRepTools_ShapeSet.cpp of OpenCascade 

  2. TopTools_ShapeSet.cpp of OpenCascade 

  3. BRepTools.cpp Of OpenCascade 

  4. BRep Format Description White Paper of OpenCascade 

  5. 孙家广等. 总括机图形学. 武大东军事和政院学出版社, 三千 

  6. 詹海生等, 基于ACIS的几何样子技术与系统开发, 浙大东军事和政院学出版社, 二零零二 

 

PDF Version: Topology Shapes of OpenCascade
BRep

二.5 附加地方 Additional location

与边和终端不相同,面有附加地方音信(TopLoc_Location),它是面(BRep_TFace)的积极分子变量。所以,在使用底层曲面或三角剖分获得的三角时,不要忘了将其考虑进来。 

3、示例程序 Example Code

三.1 底层创制面并访问其数量 Creating a face bottom-up and accessing the
data 

与创建边和终点一样,供给类BRep_Builder和Brep_Tool来从最底层创造面和访问面中的数目。代码如下所示:  

BRep_Builder aBuilder;
TopoDS_Face aFace;
aBuilder.MakeFace (aFace, aSurface, Precision::Confusion());
...
TopLoc_Location aLocation;
Handle(Geom_Surface) aSurf = BRep_Tool::Surface (aFace, aLocation);
gp_Pnt aPnt = aSurf->Value (aU, aV).Transformed (aLocation.Transformation());
//or to transform a surface at once
//Handle(Geom_Surface) aSurf = BRep_Tool::Surface (aFace);
//gp_Pnt aPnt = aSurf->Value (aU, aV);
Handle(Poly_Triangulation) aTri = BRep_Tool::Triangulation (aFace, aLocation);
aPnt = aTri->Nodes.Value (i).Transformed (aLocation.Transformation());

毫无疑问要思考面的附加地点新闻。 

四、结论 Conclusion

面是境界表示法BRep中有几何数据的最终三个拓朴结构。为了面包车型大巴展现,要求对其展开三角剖分,三角剖分后的多少也是保存在面包车型大巴数据结构中。面还有附加地点数据须要思索,若不思索外加地方,剖分后的三角形都以相持于原点的。 

从尾部创设面和访问面包车型客车属性数据,与终端和边一样,使用类BRep_Builder和类BRep_Tool来实现。 

5、参考资料 

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

  2. 孙家广等. 总结机图形学. 浙大东军事和政院学出版社 

  3. OpenCascade source code. 

 

PDF Version: Topology and Geometry in
OpenCascade-Face

相关文章

网站地图xml地图