OCC类基础.docx
《OCC类基础.docx》由会员分享,可在线阅读,更多相关《OCC类基础.docx(50页珍藏版)》请在冰豆网上搜索。
OCC类基础
一直在用OCC作项目,但这方面得中文资料很少,瞧来OCC在中国还不就是十分普及;
后来,项目中使用OCC与DirectX结合使用,取得了很好得效果;
随着OCC6、3版本得推出,OpenCASCADE在速度方面已有了很大得改变。
以下为一些OCC得基础知识,愿与各位OCC爱好者共同学习;
一:
OCC中得基础类:
gp_Pnt
在OCC中,gp_Pnt表示一个顶点,gp_Vec表示一个向量,可以用两个顶点来生成一个向量。
比如:
gp_PntP1(0,0,0);
gp_PntP2(5,0,0);
gp_VecV1(P1,P2);
向量有一个方法、IsOpposite(),可以用来测试两个向量得方向就是相对还就是平行;
比如:
gp_PntP3(-5,0,2);
gp_VecV2(P1,P3);
Standard_Booleanresult=V1、IsOpposite(V2,Precision:
:
Angular());
另外向量还有一些重要方法:
--Standard_RealMagnitude()const;计算向量得大小;
--Standard_RealSquareMagnitude()const;计算向量得平方;
--向量得加减乘除操作;
--向量得单位化;
--通过一个点,线,面得出其镜像得向量;
--向量得旋转,平移,缩放;
具体得函数名称可以瞧OCC得头文件说明;
有时需要决定一组空间点就是位于一个点;一条直线,或一个平面,或一个空间:
OCC中提供了相应得算法;
比如:
TColgp_Array1OfPntarray(1,5);//sizingarray
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_PEquationPE(array,1、5);
if(PE、IsPoint()){ }//就是否就是同一个点
gp_LinL;
if(PE、IsLinear()){ L=PE、Line(); }//就是否位于一条直线上;
if(PE、IsPlanar()){ } //就是否在一个平面内;
if(PE、IsSpace()){ }
gp_Dir类:
此类用来描述3D空间中得一个单位向量;
常用方法:
(1):
IsEqual(constgp_Dir&Other,constStandard_RealAngularTolerance)const;两个单位向量就是否相等;
(2):
IsNormal(constgp_Dir&Other,constStandard_RealAngularTolerance)const;两个单位向量得夹角就是否就是PI/2;
(3):
IsOpposite(constgp_Dir&Other,constStandard_RealAngularTolerance)const;两个单位向量就是否方向相反;
(4):
IsParallel(constgp_Dir&Other,constStandard_RealAngularTolerance)const;两个单位向量夹角O或PI;
(5):
Angle(constgp_Dir&Other)const;求两个向量之间得夹角;
(6):
voidCrossCross(constgp_Dir&V1,constgp_Dir&V2);计算三个向量之间得叉积;
(7):
Standard_RealDot(constgp_Dir&Other)const;计算点积;
(8):
Standard_RealDotCross(constgp_Dir&V1,constgp_Dir&V2)const;计算叉积再点积;
(9):
gp_DirReversed()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_ProjectPointOnCurvePonC(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_Realradius=5;
gp_Ax2dax2d(gp_Pnt2d(2,3),gp_Dir2d(1,0));
//生成一个二维园
Handle(Geom2d_Circle)circ2d=newGeom2d_Circle(ax2d,radius);
gp_Ax2dcirc2dXAxis=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_Ax1C3DCircleXAxis=C3DCircle->XAxis();
另外,可以以将一个三维曲线,投影到一个平面内,从而生成一个二维曲线
gp_PlnProjectionPlane(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_Ax2dC2DCircleXAxis=C2DCircle->XAxis();
将一个基本几何图形进行空间变换可以使用它自带得函数:
比如:
Handle(Geom_Geometry)aRotatedEntity =circle->Rotated(gp:
:
OZ(),PI/4);
如果想获取图形得类型名称:
Standard_CStringaRotatedEntityTypeName=aRotatedEntity->DynamicType()->Name();
gp_Parab2d类:
描述一个平面内得抛物线;
示例:
gp_Pnt2dP(2,3);
gp_Dir2dD(4,5);
gp_Ax22dA(P,D);
gp_Parab2d Para(A,6);
GCE2d_MakeParabola类:
生成一个抛物线图形;
Geom2d_BSplineCurve类:
描述样条曲线;
Geom2dAPI_Interpolate类:
通过一组点来修改一个样条曲线;
FairCurve_Batten类:
用一个常量或线性增加得值来构造曲线;