OCC类基础.docx
- 文档编号:5711375
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:52
- 大小:38.24KB
OCC类基础.docx
《OCC类基础.docx》由会员分享,可在线阅读,更多相关《OCC类基础.docx(52页珍藏版)》请在冰豆网上搜索。
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类:
用一个常量或线性增加的值来构造曲线;可以用来设计木纹或塑料板条;图形为二维的,可以模拟物理样条或板条.
Geom2d_TrimmedCurve类:
此类通过两个值,定义曲线的一部分,
——可以用来计算曲线的参数值和点坐标;
——可以得到曲线的一般特征,比如连续的等级,封闭特点,周期性,边界参数;
--当用一个矩阵应用于曲线或原始曲线转化后进行相应参数的改变;
所有的曲线必须几何连续,曲线至少一阶可导。
一般来说,在生成一个曲线时,要先检查一下所应用的参数是否可以生成一个光滑曲线;否则会出现错误;
另外注意一点:
不可以构造空长度的曲线或自相交的曲线;
此类的基类是Geom2d_BoundedCurve类:
它是一个抽象类;描述二维空间中的边界曲线的一般行为;除了Geom2d_TrimmedCurve是它的一个派生类外,它还有二个派生类:
—Geom2d_BezierCurve
—Geom2d_BSplineCurve
Geom2d_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();
Geom2dAPI_InterCurveCurveICC(SPL,TC1,tolerance);
——得到交点
Standard_IntegerNbPoints=ICC。
NbPoints();
gp_Pnt2dPK;
for(Standard_Integerk=1;k<=NbPoints;k++)
{
PK=ICC。
Point(k);
// 针对每个交点,进行相应处理;
}
Geom2d_OffsetCurve类:
此类用来实现偏移曲线;
比如:
—-生成一个曲线
TColgp_Array1OfPnt2darray(1,5);//sizingarray
array.SetValue(1,gp_Pnt2d(—4,0));array.SetValue(2,gp_Pnt2d(-7,2));
array。
SetValue(3,gp_Pnt2d(—6,3));array.SetValue(4,gp_Pnt2d(-4,3));
array.SetValue(5,gp_Pnt2d(—3,5));
Handle(Geom2d_BSplineCurve)SPL1=Geom2dAPI_PointsToBSpline(array);
—-生成一个偏移曲线
Standard_Realdist=1;
Handle(Geom2d_OffsetCurve)OC=
newGeom2d_OffsetCurve(SPL1,dist);
Standard_Booleanresult=OC—〉IsCN
(2);
GccAna_Pnt2dBisec类
此类实现两点之间的等分线.
示例:
gp_Pnt2dP1(1,2);
gp_Pnt2dP2(4,5);
gp_Lin2dL;
GccAna_Pnt2dBisecB(P1,P2);
if(B。
IsDone())
{L=B.ThisSolution();}
因为所生成的为直线,所以显示时要转化为线段:
if(B。
IsDone())
{
Handle(Geom2d_TrimmedCurve)aLine=GCE2d_MakeSegment(L,-8,8);
Handle(ISession2D_Curve)aCurve=newISession2D_Curve(aLine);
aDoc—〉GetISessionContext()—>Display(aCurve,Standard_False);
}
gce_MakeCirc2d类
用来创建园:
创建园的方法很多,主要构造方法有:
--园心和通过的一点;
—-通过一个园和一个距离值,创建一个同心园;
—-三点决定一个园;
--园心和半径;
gp_Elips2d类:
可以生成一个椭园,也可以生成椭园上的一段园弧;
比如:
Standard_Realmajor=12;
Standard_Realminor=4;
gp_Ax2daxis=gp:
:
OX2d();
gp_Elips2dEE(axis,major,minor);;
Handle(Geom2d_TrimmedCurve)arc=GCE2d_MakeArcOfEllipse(EE,0。
0,PI/4); 上面是利用长短轴的方法构造椭圆,也可以用二次方程的方式来构造椭园;
其中椭园类中方法可以求出焦点1和焦点2的位置,两焦点之间的位置,离心率;旋转,平移,缩放等操作。
三、关于面的类
gp_Pln类:
定义一个平面,构造的方法可以是点法式,或通过ABCD系数;
另外,还提供了一些常用的方法,比如:
-—求点到平面,线到平面,平面与平面的距离及平方距离;
-—点是否在平面内,线是否在平面内;
--通过一个点,一个轴的镜像平面;
——平面的旋转,缩放与平移;
Geom_ElementarySurface类:
此类用来描述一个表面,此类的派生类有:
平面;园柱面;锥面;球面;园环面;
它的基类是Geom_Surface,是一个抽象类;
Geom_Surface类的基类是Geom_Geometry类;
Geom_RectangularTrimmedSurface类:
用来生成一个有边界的平面;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OCC 基础