Locations Section of OpenCascade BRep

eryar@163.com

摘要Abstract:本文结合OpenCascade的BRep格式描述文档和源程序,对BRep格式进行分析,详细说明BRep的数据组织形式。本文主要通过对BRep文件中的Locations部分的读写代码进行分析,来完全理解OpenCascade中的Location部分。

关键字Key Words:OpenCascade, BRep Format, Location, Location Set

一、引言 Introduction

为了跟踪拓朴体的位置(Shape Location),每个形状都有一个局部坐标系。局部坐标系可以通过如下两种方式来表示:

l 一个右手法则表示的三个互相垂直的向量,对应的类是gp_Ax2;

l 一个相对于世界坐标系的变换(the transformation of coordinates between local and global references frames),对应的类是gp_Trsf;

类TopLoc_Location表示了初等矩阵经过一系列变换后得到的坐标系,保存累积变换后的结果避免了矩阵变换的重新计算。

二、<locations>部分 Section <locations>

示例:

BNF 定义:

详细说明:

<location data 1>定义了3X4的矩阵Q,描述了三维空间的线性变换,并满足如下约定:

矩阵Q是线性变换矩阵,它可以通过矩阵乘法将一个点(x, y, z)变换成另外一点(u, v, w):

Q也可能是以下基本变换矩阵的组合:

1) 平移变换矩阵:

2) 绕任意轴旋转的变换矩阵,轴的方向为D(Dx, Dy, Dz),旋转角度ψ:

3) 缩放变换矩阵:

4) 中心对称变换矩阵:

5) 轴对称变换矩阵:

6) 平面对称变换矩阵:

<location data 2>解释为组合变换的幂。<location data 2>是整数对li, pi的序列。这个序列将被解释为:

Lli是<location record>部分的变换矩阵。

三、示例程序

通过分析Location数据输出和读取的程序,可以完全理解Location类的作用。Location的输出与读取都是通过类TopTools_LocationSet来实现的。调试跟踪其代码,可以理解其具体实现了。

3.1 输出位置数据 Output Location data

将Location中的数据输出有两种方式,一种是在Debug模式下,可以输出到屏幕显示;一种是输出到文件。输出到文件还可以被读取。示例程序如下所示:

 /*
2 * Copyright (c) 2013 eryar All Rights Reserved.
3 *
4 * File : Main.cpp
5 * Author : eryar@163.com
6 * Date : 2013-11-16 20:08
7 * Version : 1.0v
8 *
9 * Description : Keeping track of shape location.
10 * The TopLoc_Location class represents a marker composed of
11 * references to elementary markers. The resulting cumulative
12 * transformation is stored in order to avoid recalculating the
13 * sum of the transformations for the whole list.
14 */ #define WNT
#include <gp_Trsf.hxx>
#include <TopLoc_Location.hxx>
#include <TopTools_LocationSet.hxx> #pragma comment(lib, "TKernel.lib")
#pragma comment(lib, "TKMath.lib")
#pragma comment(lib, "TKBRep.lib") int main(void)
{
ofstream dumpFile("LocationTest.txt"); TopTools_LocationSet locationSet; // 1. Null transformation, identity matrix.
gp_Trsf trsfNull;
TopLoc_Location locationNull(trsfNull); locationSet.Add(locationNull);
locationSet.Add(locationNull.Powered()); // 2. Translate transformation.
gp_Trsf trsfTranslate;
trsfTranslate.SetTranslation(gp_Vec(, , ));
TopLoc_Location locationTranslate(trsfTranslate); locationSet.Add(locationTranslate);
locationSet.Add(locationTranslate.Powered()); // 3. Rotate transformation.
gp_Trsf trsfRotate;
trsfRotate.SetRotation(gp::OX(), M_PI_2);
TopLoc_Location locationRotate(trsfRotate); locationSet.Add(locationRotate);
locationSet.Add(locationRotate.Powered()); // dump the location set and write to file.
locationSet.Dump(std::cout);
locationSet.Write(dumpFile); return ;
}

Debug模式下屏幕上输出结果为:


   -------
Dump of Locations
------- :
Elementary location
( )
( )
( )
:
Complex : L1^
( )
( )
( )
:
Elementary location
( )
( )
( )
:
Complex : L3^
( )
( )
( )
:
Elementary location
( )
( 1.11022e-016 - )
( 1.11022e-016 )
:
Complex : L5^
( )
( - -6.66134e-016 )
( 6.66134e-016 - )
Press any key to continue . . .

输出到文件中的内容为:

  Locations 

                1.11022302462516e-016              -
1.11022302462516e-016

从输出结果可以看出,输出到文件中的内容与BRep文件中的内容一致。Location有两种类型,当类型为1时,即是一个初等变换矩阵(Elementary location);当类型为2时,是一个复合变换(Complex),即在初等变换矩阵的基础上做的一些变换操作。

3.2 读取位置数据 Input Location data

读取<locations>部分的类为TopTools_LocationSet,程序代码如下所示:

 //=======================================================================
//function : Read
//purpose :
//======================================================================= void TopTools_LocationSet::Read(Standard_IStream& IS)
{
myMap.Clear(); char buffer[];
Standard_Integer l1,p; IS >> buffer;
if (strcmp(buffer,"Locations")) {
cout << "Not a location table "<<endl;
return;
} Standard_Integer i, nbLoc;
IS >> nbLoc; TopLoc_Location L;
gp_Trsf T; //OCC19559
Message_ProgressSentry PS(GetProgress(), "Locations", , nbLoc, );
for (i = ; i <= nbLoc&& PS.More(); i++, PS.Next()) {
if ( !GetProgress().IsNull() )
GetProgress()->Show(); Standard_Integer typLoc;
IS >> typLoc; if (typLoc == ) {
ReadTrsf(T,IS);
L = T;
} else if (typLoc == ) {
L = TopLoc_Location();
IS >> l1;
while (l1 != ) {
IS >> p;
TopLoc_Location L1 = myMap(l1);
L = L1.Powered(p) *L;
IS >> l1;
}
} if (!L.IsIdentity()) myMap.Add(L);
}
}

从读取Location部分的代码可以看出,分两情况来处理。一种是初等变换矩阵,类型值为1,直接读取矩阵数据;一种是复合变换,类型值为2,它是在初等变换矩阵的基础上通过Power来实现的复合变换。BRep中记录复合变换的数据为初等变换矩阵的编号及其幂次。通过编号Map得出其对应的初等变换矩阵。结合读取Location的代码,对BRep中Location部分的数据有了清晰认识。

四、结论

通过对OpenCascade中BRep文件中的Locations部分的数据的输出与读取,理解其实现。即对Location分为两种类型:

1. 初等变换矩阵:存储数据为3X4变换矩阵;

2. 复合变换:存储数据为初等变换矩阵的编号及其幂次。

Locations Section of OpenCascade BRep的更多相关文章

  1. OpenCascade BRep Format Description

    OpenCascade BRep Format Description eryar@163.com 摘要Abstract:本文结合OpenCascade的BRep格式描述文档和源程序,对BRep格式进 ...

  2. Topology Shapes of OpenCascade BRep

    Topology Shapes of OpenCascade BRep eryar@163.com 摘要Abstract:通过对OpenCascade中的BRep数据的读写,理解边界表示法的概念及实现 ...

  3. Geometry Surface of OpenCascade BRep

    Geometry Surface of OpenCascade BRep eryar@163.com 摘要Abstract:几何曲面是参数表示的曲面 ,在边界表示中其数据存在于BRep_TFace中, ...

  4. Geometry Curve of OpenCascade BRep

    Geometry Curve of OpenCascade BRep eryar@163.com 摘要Abstract:几何曲线是参数表示的曲线 ,在边界表示中其数据存在于BRep_TEdge中,BR ...

  5. OpenCascade BRep Format Description (2)

    OpenCascade BRep Format Description eryar@163.com 摘要Abstract:本文结合OpenCascade的BRep格式描述文档和源程序,对BRep格式进 ...

  6. OpenCASCADE BRep Projection

    OpenCASCADE BRep Projection eryar@163.com 一网友发邮件问我下图所示的效果如何在OpenCASCADE中实现,我的想法是先构造出螺旋线,再将螺旋线投影到面上. ...

  7. OpenCASCADE BRep vs. OpenNURBS BRep

    OpenCASCADE BRep vs. OpenNURBS BRep eryar@163.com Abstract. BRep short for Boundary Representation. ...

  8. Representation Data in OpenCascade BRep

    Representation Data in OpenCascade BRep eryar@163.com 摘要Abstract:现在的显示器大多数是光栅显示器,即可以看做一个像素的矩阵.在光栅显示器 ...

  9. OpenCascade Primitives BRep - Sphere

    OpenCascade Primitives BRep - Sphere eryar@163.com Abstract. BRep is short for Boundary Representati ...

随机推荐

  1. HTML5中的 Canvas

    什么是Canvas? Canvas元素是HTML5的一部分,允许脚本语言动态渲染位图像.Canvas由一个可绘制地区HTML代码中的属性定义决定高度和宽度.JavaScript代码可以访问该地区,通过 ...

  2. player.swf播放flv方式

    <embed src="../images/player.swf" allowFullScreen="true" quality="high&q ...

  3. Pair Project:电梯控制程序

    12061160刘垚鹏 & 12061166宋天舒 1.1结对编程的优缺点结对编程相对于个人编程有很多优点.首先,督促作用,在讨论过程中能够很快投入工作,为了不耽误对方时间,我们会尽快完成各自 ...

  4. centos 安装apache 和 php5.6

    centos 安装 php5.6,安装前需要先安装数据库和apache 安装 apache2.4 安装基础依赖:# yum install gcc gcc-c++ glibc glibc-devel ...

  5. hosts文件的一个小发现

    今天才发现原来同一个ip可以在hosts文件中配置多个域名.之间老是换一个网站就改一下,现在终于不用这么麻烦了 127.0.0.1 gg.pclady.com.cn 127.0.0.1 gg.pcon ...

  6. linux编译php的c扩展

    第一步:安装php5 第二步:打开终端[为来方便,这里使用root用户],使用CD命令进入到php5源码包的ext目录 第三步:在终端键入以下命令 ./ext_skel --extname=extes ...

  7. iOS开发-NSOperation与GCD区别

    Mac OS X 10.6及iOS4.0之后导入了可以使全体线程更高效运行,并且使并行处理应用更易开发的架构,GCD(Grand Central  Dispatch),同时引入的还有Run Loop, ...

  8. phoenix 开发API系列 目录

    phoenix 开发API系列(一)创建简单的http api phoenix 开发API系列(二)phoenix 各类 api 实现方式 phoenix 开发API系列(三)phoenix api ...

  9. 打开mysql时,提示 1040,Too many connections

    打开mysql时,提示 1040,Too many connections,这样就无法打开数据库,看不了表里边的内容了. 出现这个问题的原因是,同时对数据库的连接数过大,mysql默认的最大连接数是1 ...

  10. 如何基于RabbitMQ实现优先级队列

    概述 由于种种原因,RabbitMQ到目前为止,官方还没有实现优先级队列,只实现了Consumer的优先级处理. 但是,迫于种种原因,应用层面上又需要优先级队列,因此需求来了:如何为RabbitMQ加 ...