OpenCASCADE基础介绍(1)一直在用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);//sizingarrayarray.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);brD=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_Parab2dPara(A,6);GCE2d_MakeParabola类:生成一个抛物线图形;Geom2d_BSplineCurve类:描述样条曲线;Geom2dAPI_Interpolate类:通过一组点来修改一个样条曲线;FairCurve_Batten类:用一个常量或线性增加的值来构造曲线;可以用来设计木纹或塑料板条;图形为二维的,可以模拟物理样条或板条.Geom2d_TrimmedCurve类:此类通过两个值,定义曲线的一部分,--可以用来计算曲线的参数值和点坐标;--可以得到曲线的一般特征,比如连续的等级,封闭特点,周期性,边界参数;--当用一个矩阵应用于曲线或原始曲线转化后进行相应参数的改变;所有的曲线必须几何连续,曲线至少一阶可导。一般来说,在生成一个曲线时,要先检查一下所应用的参数是否可以生成一个光滑曲线;否则会出现错误;另外注意一点:不可以构造空长度的曲线或自相交的曲线;此类的基类是Geom2d_BoundedCurve类:它是一个抽象类;描述二维空间中的边界曲线的一般行为;除了Geom2d_TrimmedCurve是它的一个派生类外,它还有二个派生类:-Geom2d_BezierCurve-Geom2d_BSplineCurveGeom2d_BoundedCurve类的基类是Geom2d_Curve类:Geom2d_Curve:抽象类;此抽象类描述了2D空间的曲线的一般特征;派生出的类有多个:包括直线,园,二次曲线,Bizier,BSpline曲线等;这些曲线的特点是可以参数化;Geom2d_Curve类的基类是Geom2d_Geometry类;此抽象类主要定义了曲线的变换,平移,旋转,缩放及拷贝等方法;Geom2d_Geometry类的基类是MMgt_TShared类;此抽象类为管理对象的基类,可以引用计数,及删除方法;Standard_Transient:此抽象类为所有类共同的基类;Geom2dAPI_InterCurveCurve类:此类用来实现二维曲线的相交;一种情况是曲线与曲线的相交,另外一种情况是曲线自身的相交;主要方法有:--Standard_IntegerNbPoints()const;相交点数;--Standard_IntegerNbSegments()const;切线相交数;--voidSegment(constStandard_IntegerIndex,Handle(Geom2d_Curve)&Curve1,Handle(Geom2d_Curve)&Curve2)const;返回其中一个线段;下面的示例是两个曲线相交的例子:首先,生成第一个曲线,在这里,应用点数组来生成一个曲线;--定义数组Handle(TColgp_HArray1OfPnt2d)harray=newTColgp_HArray1OfPnt2d(1,5);//sizingharray--输入点数组的值harray-SetValue(1,gp_Pnt2d(0,0));harray-SetValue(2,gp_Pnt2d(-3,1));harray-SetValue(3,gp_Pnt2d(-2,5));harray-SetValue(4,gp_Pnt2d(2,9));harray-SetValue(5,gp_Pnt2d(-4,14));--检测一下点与点之间是否为同一点;0.01为公差值,依实际需要可以更改此参数;Geom2dAPI_InterpolateanInterpolation(harray,Standard_False,0.01);--生成曲线anInterpolation.Perform();Handle(Geom2d_BSplineCurve)SPL=anInterpolation.Curve();--第二个曲线用两点来生成gp_Pnt2dP1(-1,-2);gp_Pnt2dP2(0,15);gp_Dir2dV1=gp::DY2d();Handle(Geom2d_TrimmedCurve)TC1=GCE2d_MakeSegment(P1,V1,P2);--下面进行曲线的求交Standard_Realtolerance=Precision::Confusion();Geom2