Package gp in the OpenCASCADE
Package gp in the OpenCASCADE
eryar@163.com China
一、简介 Introduction to Package gp
gp是几何处理程序包(Geometric Processor package),简称gp。包gp提供以下功能:
- 代数计算;如坐标计算、矩阵计算;
- 基本解析几何元素;如变换、点、矢量、线、面、轴、二次曲线和初等曲面;
这些实体同时在二维和三维空间中定义,且包中的类都是非持续的(non-persistent),即这些类的实例都是以值的方式处理而不是引用。当复制这种对象时,是对象本体。改变一个实例不会影响到其他的实例。
可用的几何实体如下所示:
- 2D&3D Cartesian coordinates(x,y,z); 二维&三维笛卡尔坐标;
- Matrices; 矩阵;
- Cartesian points; 笛卡尔坐标点;
- Vector; 矢量;
- Direction; 方向;
- Axis; 轴;
- Line; 直线;
- Circle; 圆;
- Ellipse; 椭圆;
- Hyperbola; 双曲线;
- Parabola; 抛物线;
- Plane; 面;
- Infinite cylindrical surface; 柱面;
- Spherical surface; 球面;
- Toroidal surface; 环面;
- Conical surface; 锥面;
二、几何元素的集合 Collections of Primitive Geometric Types
创建几何对象之前,根据你是将几何对象用于二维还是三维来确定。若你需要一个几何对象集而不是单一的几何对象,即用来处理一类几何元素,包TColgp就是提供这种功能的。
Package TColgp提供类如:XY, XYZ, Pnt, Pnt2d, Vec, Vec2d, Lin, Lin2D, Circ, Circ2d的TCollection的实例。包中的类简单列举如下:
- TColgp_Array1OfCirc;
- TColgp_Array1OfDir;
- TColgp_Array1OfPnt;
- TColgp_Array1OfVec;
- TColgp_Array2OfCirc2d;
- TColgp_Array2OfPnt;
- TColgp_HArray1OfCirc2d;
- TColgp_HArray2OfDir;
- TColgp_HSequenceOfDir;
- TColgp_SequenceOfDir;
- TColgp_SequenceOfPnt;
- TColgp_SequenceOfXYZ;
个人意见,若使用标准C++的容器类(The STL Template Container),就不需要创建这么多类了。
三、基本几何库 Basic Geometric Libraries
有几个库提供了曲线和曲面的基本计算功能。若要处理由包gp创建的几何对象,初等曲线曲面的有用算法库在包:ElCLib和ElSLib中。包Precision提供两个数字比较的功能。
- Package ElCLib; ElCLib代表:Elementary Curves Library. 提供初等曲线曲面的基本几何计算功能;
- Package ElSLib; ElSLib代表:Elementary Surfaces Library. 提供初等曲面的基本几何计算。
- Package Bnd;提供二维和三维空间中几何元素包围盒的计算功能;
- Package Precision; 由于浮点数在计算机内实际上是一个近似表示,在手工计算看来为正确的结果,在计算机中运算未必得出正确的结果。所以,我们得到一个重要的经验:使用浮点数进行相等(==)和不等(!=)比较的操作通常是有问题的。浮点数的相等比较,一般总是使用两者相减的值是否落在0的邻域中来判断。这就是邻域比较技术。在OpenCASCADE中专门提供包Precision来处理两个数值的比较问题。
四、代码示例 Code Sample
//------------------------------------------------------------------------------
// Copyright (c) 2012 eryar All Rights Reserved.
//
// File : Main.cpp
// Author : eryar@163.com
// Date : 2012-6-23 21:30
// Version : 1.0v
//
// Description : Test primitive Geometric Types in OpenCASCADE.
//
// The Geometric Processor package, called gp.
//
// The pg package offers classes for both 2D and 3D objects which
// are handled by value rather than by reference. When this sort of object
// is copied, it is copied entirely. Changes in one instance will not be
// reflected in another.
//
//==============================================================================
// Use Toolkit TKernel.
#pragma comment(lib,"TKernel.lib")
// Use Toolkit TKMath.
#pragma comment(lib, "TKMath.lib")
#include <gp.hxx>
#include <gp_Pnt.hxx>
#include <gp_Trsf.hxx>
#include <Precision.hxx>
void DumpPoint(const gp_Pnt& p);
int main(int argc, char* argv[])
{
gp_Pnt aPoint(0, 0, 0);
// 1. Translate a point in a direction.
// The direction determined by a gp_Vec or two gp_Pnt.
cout<<"Before translated:";
DumpPoint(aPoint);
aPoint.Translate(gp_Pnt(2, 2, 3), gp_Pnt(10, 10, 0));
cout<<"After translated:";
DumpPoint(aPoint);
// 2. Rotate a point.
// Rotate a point by an axis and the rotate angle.
cout<<"Before rotated:";
DumpPoint(aPoint);
// Roate 45 degree about Z axis.
// Positive angle value will be rotated counterclockwise.
aPoint.Rotate(gp::OZ(), PI/4);
cout<<"After rotated 45 degree about Z axis:";
DumpPoint(aPoint);
// 2.1 Test Package Precision.
if (aPoint.X() < Precision::Confusion() && aPoint.X() > -Precision::Confusion())
{
cout<<"Point X value:"<<aPoint.X()<<endl;
cout<<"Precision::Confusion() value:"<<Precision::Confusion()<<endl;
}
aPoint.Rotate(gp::OZ(), PI/4);
cout<<"After rotate 45 degree about Z axis:";
DumpPoint(aPoint);
// 3. Transform a point by gp_Trsf.
gp_Trsf transform;
transform.SetMirror(gp::OX());
cout<<"Before gp_Trsf:";
DumpPoint(aPoint);
aPoint.Transform(transform);
cout<<"After gp_Trsf:";
DumpPoint(aPoint);
// 4. Mirror a point.
// 4.1 Performs the symmetrical transformation of
// a point with respect to an axis placement which
// is the axis of the symmetry.
cout<<"Before mirrored with a symmetric axis:";
DumpPoint(aPoint);
aPoint.Mirror(gp::OY());
cout<<"After mirrored with a symmetric axis:";
DumpPoint(aPoint);
// 4.2 Performs the symmetrical transformation of
// a point with respect to a plane.
cout<<"Before mirrored with a symmetric plane:";
DumpPoint(aPoint);
aPoint.Mirror(gp::XOY());
cout<<"After mirrored with a symmetric plane";
DumpPoint(aPoint);
// 5. Scale a point.
aPoint.SetCoord(1, 2, 1);
cout<<"Before Scaled:";
DumpPoint(aPoint);
/*
// Scale point source code...
inline void gp_Pnt::Scale (const gp_Pnt& P,
const Standard_Real S)
{
gp_XYZ XYZ = P.coord;
XYZ.Multiply (1.0 - S);
coord.Multiply (S);
coord.Add (XYZ);
}
*/
aPoint.Scale(gp_Pnt(1, 2, 2), 2);
cout<<"After Scaled:";
DumpPoint(aPoint);
return 0;
}
/**
* Description: Dump point information.
*/
void DumpPoint( const gp_Pnt& p )
{
cout<<"("<<p.X()<<","<<p.Y()<<","<<p.Z()<<")"<<endl;
}
输出结果如下:
1: Before translated:(0,0,0)
2: After translated:(8,8,-3)
3: Before rotated:(8,8,-3)
4: After rotated 45 degree about Z axis:(8.88178e-016,11.3137,-3)
5: Point X value:8.88178e-016
6: Precision::Confusion() value:1e-007
7: After rotate 45 degree about Z axis:(-8,8,-3)
8: Before gp_Trsf:(-8,8,-3)
9: After gp_Trsf:(-8,-8,3)
10: Before mirrored with a symmetric axis:(-8,-8,3)
11: After mirrored with a symmetric axis:(8,-8,-3)
12: Before mirrored with a symmetric plane:(8,-8,-3)
13: After mirrored with a symmetric plane(8,-8,3)
14: Before Scaled:(1,2,1)
15: After Scaled:(1,2,0)
16: Press any key to continue . . .
五、结论
包gp提供了基本的几何元素表示及初等解析几何计算功能。对于几何元素的集合也有自己的类库。对于两个数值的比较采用了邻域比较技术。
Package gp in the OpenCASCADE的更多相关文章
- TKmath Package gp数据类型
点,向量,方向 二维:gp_Pnt2d, gp_Vec2d, gp_Dir2d:它们的内部都存储 gp_XY 三维:gp_Pnt, gp_Vec, gp_Dir:它们的内部都存储 gp_XYZ 轴向与 ...
- OpenCASCADE 包说明
转载地址:http://www.cppblog.com/eryar/archive/2012/06/30/180916.html 一.简介 Introduction to Package gp gp是 ...
- OpenCASCADE PCurve of Topological Face
OpenCASCADE PCurve of Topological Face eryar@163.com Abstract. OpenCASCADE provides a class BRepBuil ...
- OpenCASCADE Root-Finding Algorithm
OpenCASCADE Root-Finding Algorithm eryar@163.com Abstract. A root-finding algorithm is a numerical m ...
- Delaunay Triangulation in OpenCascade
Delaunay Triangulation in OpenCascade eryar@163.com 摘要:本文简要介绍了Delaunay三角剖分的基础理论,并使用OpenCascade的三角剖分算 ...
- OpenCASCADE Shape Location
OpenCASCADE Shape Location eryar@163.com Abstract. The TopLoc package of OpenCASCADE gives resources ...
- OpenCASCADE Interpolation - Lagrange
OpenCASCADE Interpolation - Lagrange eryar@163.com Abstract. Power basis polynomial is the most simp ...
- Make Helix Curve in OpenCASCADE
Make Helix Curve in OpenCASCADE eryar@163.com Abstract. OpenCASCADE does not provide helix curve dir ...
- Create views of OpenCASCADE objects in the Debugger
Create views of OpenCASCADE objects in the Debugger eryar@163.com Abstract. The Visual Studio Natvis ...
随机推荐
- android 中View的优化
在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由的定义listview每一列的布局,但当listview有大量的数据需要加载的时候, ...
- c++ STL中的vector与list为什么没有提供find操作?
map里有,set里也有,vector,list没有,太不公平了吧. 其实应该考虑为什么map,set里有find操作. include<algorithm>里有通用的find操作,通用的 ...
- 【dubbo】dubbo项目基本结构及provider构建
dubbo项目基本结构如下,分别部署于不同服务器: 1.provider(接口API 实现) 2.consumer(web) 3.zookeeper 4.DB provider构建 1.api构建 i ...
- Drupal 7 安装时的数据库问题
在安装D7时,需要用PhpMyAdmin创建数据库,不建议使用ROOT帐号而需要建立一个新的帐号.一般,建立一个新的账号,如foo,并同时建一个同名的数据库,选择localhost(如果是本地).但是 ...
- 插入排序-java
排序-插入排序 基本思想:将待排序表看作左右两部分,其中左边为有序区,右边为无序区, 整个排序过程就是将右边无序区中的元素逐个插入到左边的有序区中,以构成新的有序区. 平均时间:O(n2) 最好情况: ...
- tar.xz文件解压
原文:http://blog.csdn.net/rheostat/article/details/7614451 感谢CSDN的<帝都码农> ======================= ...
- 基于EasyUi ComBotree树修改 父节点选择问题
本人在使用 Easy UI 期间发现了一个不太适合项目的bug,可能也不算bug把 . 毕竟不同项目背景 取舍不同. 我在做网元树选择的时候 发现当选取父节点后,子节点都会被选择 返回 .但是如 ...
- unity渲染层级关系小结(转存)
最近连续遇到了几个绘制图像之间相互遮挡关系不正确的问题,网上查找的信息比较凌乱,所以这里就把自己解决问题中总结的经验记录下来. Unity中的渲染顺序自上而下大致分为三层. 最高层为Camera层,可 ...
- Encrypt
begin#BE37F2FB34350DCA6242ADC91F33FA9ABDB6F502F5CA07E3D0CE0C3FAF8799AB3F4622564487B3729F111D9E132A08 ...
- [转载]并发编程之Operation Queue和GCD
并发编程之Operation Queue http://www.cocoachina.com/applenews/devnews/2013/1210/7506.html 随着移动设备的更新换代,移动设 ...