zoukankan      html  css  js  c++  java
  • Locations Section of OpenCascade BRep

    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>

    示例: 

    wps_clip_image-13782

    BNF 定义: 

    wps_clip_image-24805

    详细说明: 

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

    wps_clip_image-7287

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

    wps_clip_image-16501

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

    1) 平移变换矩阵: 

    wps_clip_image-27021

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

    wps_clip_image-9085

    3) 缩放变换矩阵: 

    wps_clip_image-14514

    4) 中心对称变换矩阵: 

    wps_clip_image-18420

    5) 轴对称变换矩阵: 

    wps_clip_image-9661

    6) 平面对称变换矩阵: 

    wps_clip_image-16676

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

    wps_clip_image-2646

    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.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 */
    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 Locations
     6  -------
     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 6
     2 1
     3               1               0               0               0 
     4               0               1               0               0 
     5               0               0               1               0 
     6 2  1 2 0
     7 1
     8               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 : Read
     3 //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. 复合变换:存储数据为初等变换矩阵的编号及其幂次。 

  • 相关阅读:
    ASP.Net核心对象HttpRequest
    HTTP状态码和常用对照表
    Http协议之Get和Post的区别
    Http协议之Request和Response
    HTTP协议的几个概念
    表单内容提交到数据库案例
    关于表单提交的规则
    HttpHandler简介
    DHCP(五)
    DHCP(四)
  • 原文地址:https://www.cnblogs.com/opencascade/p/3446718.html
Copyright © 2011-2022 走看看