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模式下,可以输出到屏幕显示;一种是输出到文件。输出到文件还可以被读取。示例程序如下所示:

1 /*2 *    Copyright (c) 2013 eryar All Rights Reserved.3 *4 *        File    : Main.cpp5 *        Author  : eryar@163.com6 *        Date    : 2013-11-16 20:087 *        Version : 1.0v8 *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 */
15
16 #define WNT
17 #include <gp_Trsf.hxx>
18 #include <TopLoc_Location.hxx>
19 #include <TopTools_LocationSet.hxx>
20
21 #pragma comment(lib, "TKernel.lib")
22 #pragma comment(lib, "TKMath.lib")
23 #pragma comment(lib, "TKBRep.lib")
24
25 int main(void)
26 {
27     ofstream dumpFile("LocationTest.txt");
28
29     TopTools_LocationSet locationSet;
30
31     // 1. Null transformation, identity matrix.
32     gp_Trsf trsfNull;
33     TopLoc_Location locationNull(trsfNull);
34
35     locationSet.Add(locationNull);
36     locationSet.Add(locationNull.Powered(2));
37
38     // 2. Translate transformation.
39     gp_Trsf trsfTranslate;
40     trsfTranslate.SetTranslation(gp_Vec(100, 200, 0));
41     TopLoc_Location locationTranslate(trsfTranslate);
42
43     locationSet.Add(locationTranslate);
44     locationSet.Add(locationTranslate.Powered(3));
45
46     // 3. Rotate transformation.
47     gp_Trsf trsfRotate;
48     trsfRotate.SetRotation(gp::OX(), M_PI_2);
49     TopLoc_Location locationRotate(trsfRotate);
50
51     locationSet.Add(locationRotate);
52     locationSet.Add(locationRotate.Powered(6));
53
54     // dump the location set and write to file.
55     locationSet.Dump(std::cout);
56     locationSet.Write(dumpFile);
57
58     return 0;
59 }

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

1 2 3 4  -------5  Dump of 6 Locations6  -------7 8     1 :9 Elementary location
10 (               1               0               0               0  )
11 (               0               1               0               0  )
12 (               0               0               1               0  )
13     2 :
14 Complex : L1^2
15 (               1               0               0               0  )
16 (               0               1               0               0  )
17 (               0               0               1               0  )
18     3 :
19 Elementary location
20 (               1               0               0             100  )
21 (               0               1               0             200  )
22 (               0               0               1               0  )
23     4 :
24 Complex : L3^3
25 (               1               0               0             300  )
26 (               0               1               0             600  )
27 (               0               0               1               0  )
28     5 :
29 Elementary location
30 (               1               0               0               0  )
31 (               0    1.11022e-016              -1               0  )
32 (               0               1    1.11022e-016               0  )
33     6 :
34 Complex : L5^6
35 (               1               0               0               0  )
36 (               0              -1   -6.66134e-016               0  )
37 (               0    6.66134e-016              -1               0  )
38 Press any key to continue . . .

输出到文件中的内容为:

 1 Locations 62 13               1               0               0               0 4               0               1               0               0 5               0               0               1               0 6 2  1 2 07 18               1               0               0             100 9               0               1               0             200
10               0               0               1               0
11 2  3 3 0
12 1
13               1               0               0               0
14               0 1.11022302462516e-016              -1               0
15               0               1 1.11022302462516e-016               0
16 2  5 6 0

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

3.2 读取位置数据 Input Location data

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

1 //=======================================================================2 //function : Read3 //purpose  : 4 //=======================================================================5 6 void  TopTools_LocationSet::Read(Standard_IStream& IS)7 {8   myMap.Clear();9
10   char buffer[255];
11   Standard_Integer l1,p;
12
13   IS >> buffer;
14   if (strcmp(buffer,"Locations")) {
15     cout << "Not a location table "<<endl;
16     return;
17   }
18
19   Standard_Integer i, nbLoc;
20   IS >> nbLoc;
21
22   TopLoc_Location L;
23   gp_Trsf T;
24
25   //OCC19559
26   Message_ProgressSentry PS(GetProgress(), "Locations", 0, nbLoc, 1);
27   for (i = 1; i <= nbLoc&& PS.More(); i++, PS.Next()) {
28     if ( !GetProgress().IsNull() )
29       GetProgress()->Show();
30
31     Standard_Integer typLoc;
32     IS >> typLoc;
33
34     if (typLoc == 1) {
35       ReadTrsf(T,IS);
36       L = T;
37     }
38
39     else if (typLoc == 2) {
40       L = TopLoc_Location();
41       IS >> l1;
42       while (l1 != 0) {
43     IS >> p;
44     TopLoc_Location L1 = myMap(l1);
45     L = L1.Powered(p) *L;
46     IS >> l1;
47       }
48     }
49
50     if (!L.IsIdentity()) myMap.Add(L);
51   }
52 }

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

四、结论

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

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

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

PDF Version: Location Section of BRep File

转载于:https://www.cnblogs.com/opencascade/p/3446718.html

Locations Section of OpenCascade BRep相关推荐

  1. OpenCascade BRep Format Description

    为什么80%的码农都做不了架构师?>>>    OpenCascade BRep Format Description eryar@163.com 摘要Abstract:本文结合Op ...

  2. Geometry Curve of OpenCascade BRep

    为什么80%的码农都做不了架构师?>>>    Geometry Curve of OpenCascade BRep eryar@163.com 摘要Abstract:几何曲线是参数 ...

  3. Geometry Surface of OpenCascade BRep

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

  4. OpenCASCADE BRep vs. OpenNURBS BRep

    为什么80%的码农都做不了架构师?>>>    OpenCASCADE BRep vs. OpenNURBS BRep eryar@163.com Abstract. BRep sh ...

  5. Topology Shapes of OpenCascade BRep

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

  6. OpenCASCADE BRep Projection

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

  7. OpenCascade Primitives BRep - Box

    为什么80%的码农都做不了架构师?>>>    OpenCascade Primitives BRep - Box eryar@163.com Abstract. BRep is s ...

  8. OpenCascade Primitives BRep - Sphere

    为什么80%的码农都做不了架构师?>>>    OpenCascade Primitives BRep - Sphere eryar@163.com Abstract. BRep i ...

  9. OpenCascade Primitives BRep-Cylinder

    为什么80%的码农都做不了架构师?>>>    OpenCascade Primitives BRep-Cylinder eryar@163.com Abstract. BRep i ...

最新文章

  1. scala函数式编程(二) scala基础语法介绍
  2. 百度Tera数据库介绍——类似cassandra,levelDB
  3. 4.Lucene3.案例介绍,创建索引,查询等操作验证
  4. 关于APP更新,两包共存的解决方案
  5. php53 php55区别,详解 PHP 中的三大经典模式
  6. 服务器电脑 默认虚拟内存,服务器是否需要设置虚拟内存
  7. 计算机中集线器hub功能,usb集线器是什么东东_usb集线器功能介绍
  8. 【解决】maven install出现fatal error compiling
  9. python倒数切片_python的切片操作
  10. 领域驱动设计(domain driven design)战略篇之一 战略 Bounded Context
  11. vue cli 脚手架 重新安装步骤
  12. 阿里云虚拟机 php $_SESSION 失效问题
  13. 凭借近2亿的年销量,小米三年超越苹果的可能性有多大?
  14. 阿里云视频点播+项目实战
  15. 支付宝 收款通知 mysql_基于支付宝微信通知的一种个人收款回调方案(转)
  16. android ContentValues类
  17. 高分屏笔记本显示模糊解决方法
  18. 畅游Python 二十一:Web框架 - Tornado
  19. 淘宝订单API获取订单代码说明
  20. Maya: Rendering with Arnold 5 Maya教程之Arnold5渲染 Lynda课程中文字幕

热门文章

  1. web前端常用代码于面试等资源
  2. 【经验分享】Hydra(爆破神器)使用方法
  3. Fiddle:使用断点:bpu,bpafter
  4. Codeigniter 4.0-dev 版源码学习笔记之四——详细路由过程
  5. centos 下 mysql 主从库搭建
  6. sublime text3:提示 There are no packages available installation 解决方案
  7. 62、滑动窗口的最大值
  8. ExtJs5.0在WebStorm上的使用之入门教程(一)编写第一个网页 HelloExt
  9. C/C++预处理宏的总结
  10. ORACLE 数据库安装后,PL/SQL的登录问题完美解决