一直在用OCC作项目,但这方面得中文资料很少,瞧来OCC在中国还不就是十分普及; 后来,项目中使用OCC与DirectX结合使用,取得了很好得效果;
随着OCC6、3版本得推出,Open CASCADE在速度方面已有了很大得改变。以下为一些OCC得基础知识,愿与各位OCC爱好者共同学习; 一:OCC中得基础类: gp_Pnt
在OCC中,gp_Pnt表示一个顶点,gp_Vec表示一个向量,可以用两个顶点来生成一个向量。 比如:
gp_Pnt P1(0,0,0); gp_Pnt P2(5,0,0); gp_Vec V1 (P1,P2);
向量有一个方法、IsOpposite(),可以用来测试两个向量得方向就是相对还就是平行; 比
如:
gp_Pnt P3(-5,0,2);
gp_Vec V2
(P1,P3);
Standard_Boolean result =V1、IsOpposite(V2,Precision::Angular());
另外向量还有一些重要方法:
--Standard_Real Magnitude() const;计算向量得大小; --Standard_Real SquareMagnitude() const;计算向量得平方; --向量得加减乘除操作; --向量得单位化;
--通过一个点,线,面得出其镜像得向量; --向量得旋转,平移,缩放;
具体得函数名称可以瞧OCC得头文件说明;
有时需要决定一组空间点就是位于一个点;一条直线,或一个平面,或一个空间: OCC中提供了相应得算法; 比如:
TColgp_Array1OfPnt array (1,5); // sizing array array、
SetValue(1,gp_Pnt(0,0,1));
array、
SetValue(2,gp_Pnt(1,2,2));
array、
SetValue(3,gp_Pnt(2,3,3));
array、
SetValue(4,gp_Pnt(4,4,4));
array、
SetValue(5,gp_Pnt(5,5,5));
GProp_PEquation PE (array,1、
5 ); if (PE、IsPoint()){ } //就是否就是同一个点
gp_Lin
L;
if (PE、IsLinear()) { L = PE、Line(); } //就是否位于一条直线上;
if (PE、IsPlanar()){ } //就是否在一个平面内; if (PE、IsSpace()) { } gp_Dir类:
此类用来描述3D空间中得一个单位向量; 常用方法:
(1):IsEqual(const gp_Dir& Other,const Standard_Real AngularTolerance) const;两个单位向量就是否相等;
(2):IsNormal(const gp_Dir& Other,const Standard_Real AngularTolerance) const;两个单位向量得夹角就是否就是PI/2;
(3):IsOpposite(const gp_Dir& Other,const Standard_Real AngularTolerance) const;两个单位向量就是否方向相反;
(4):IsParallel(const gp_Dir& Other,const Standard_Real AngularTolerance) const;两个单位向量夹角O或PI;
(5):Angle(const gp_Dir& Other) const;求两个向量之间得夹角;
(6):void CrossCross(const gp_Dir& V1,const gp_Dir& V2) ;计算三个向量之间得叉积; (7):Standard_Real Dot(const gp_Dir& Other) const;计算点积;
(8):Standard_Real DotCross(const gp_Dir& V1,const gp_Dir& V2) const;计算叉积再点积;
(9):gp_Dir Reversed() const;得到反方向,
在OCC中用 gp_Lin2d 类,来生成一个二维空间得直线,有它得原点与单位向量;
gp_Ax2d 类:
通过原点与X方向单位与Y方向单位建立一个二维坐标系;利用sense参数可以决定就是右手系还就是左手系;
可以利用平移、旋转、缩放、镜像来更改坐标系; 类似地,gp_Ax3类:
用来描述一个3D空间得坐标系。而gp_Ax2类用来表示一个二维空间坐标系;可以为右手系,也可以就是左手系; 二、曲线类
GeomAPI与GeomConvert包:
GeomAPI开发包提供了一个几何体得可编程应用程序接口; 比如:
求点P与曲线C得距离D:
D = GeomAPI_ProjectPointOnCurve(P,C); 或者
GeomAPI_ProjectPointOnCurve PonC(P,C); D = PonC、LowerDistance();
GeomConvert包提供了一些全局函数,可以用来实现转化一个Geom曲线为BSpline曲线等; 比如:
Handle(Geom_BSplineSurface) aPipeSurface
=
Handle(Geom_BSplineSurface)::DownCast(aPipe、Surface()); Handle(Geom_BSplineSurface) anotherBSplineSurface =
GeomConvert::SplitBSplineSurface(aPipeSurface,1,2,3,6);
OCC中三维几何曲线得类型有:
--线 --园 --椭圆 --二次曲线 --抛物线 --Bezier曲线 --BSpline曲线
可以将一个二维得几何曲线转化为某个平面内得一个三维曲线: 比如:
Standard_Real radius =
5; gp_Ax2d ax2d(gp_Pnt2d(2,3),gp_Dir2d(1,0)); //生成一个二维
园 Handle(Geom2d_Circle) circ2d = new
Geom2d_Circle(ax2d,radius);
gp_Ax2d circ2dXAxis = circ2d->XAxis();
// 然后,在这个平面里转化为三维曲线;
Handle(Geom_Curve) C3D = GeomAPI::To3d(circ2d,gp_Pln(gp_Ax3(gp::XOY()))); Handle(Geom_Circle) C3DCircle =
Handle(Geom_Circle)::DownCast(C3D);
gp_Ax1 C3DCircleXAxis = C3DCircle->XAxis();
另外,可以以将一个三维曲线,投影到一个平面内,从而生成一个二维曲线
gp_Pln
ProjectionPlane(gp_Pnt(1,1,0),gp_Dir( 1,1,1 ));
Handle(Geom2d_Curve) C2D =
GeomAPI::To2d(C3D,ProjectionPlane); Handle(Geom2d_Circle) C2DCircle
=Handle(Geom2d_Circle)::DownCast(C2D); gp_Ax2d C2DCircleXAxis = C2DCircle->XAxis();
将一个基本几何图形进行空间变换可以使用它自带得函数: 比如:
Handle(Geom_Geometry) aRotatedEntity = circle->Rotated(gp::OZ(),PI/4); 如果想获取图形得类型名称:
Standard_CString aRotatedEntityTypeName = aRotatedEntity->DynamicType()->Name();
gp_Parab2d类:
描述一个平面内得抛物线; 示例:
gp_Pnt2d P(2,3); gp_Dir2d D(4,5); gp_Ax22d A(P,D); gp_Parab2d Para(A,6);
GCE2d_MakeParabola类: 生成一个抛物线图形;
Geom2d_BSplineCurve类: 描述样条曲线;
Geom2dAPI_Interpolate类: 通过一组点来修改一个样条曲线;
FairCurve_Batten类:
用一个常量或线性增加得值来构造曲线;可以用来设计木纹或塑料板条;图形为二维得,可以模拟物理样条或板条、 Geom2d_TrimmedCurve类:
此类通过两个值,定义曲线得一部分, --可以用来计算曲线得参数值与点坐标;