opencascade 基础篇 gp_Pln类: 原创
概述:
定义一个平面,构造的方法可以是
点法式:gp_Pln( gp_Pnt P, gp_Dir V)
ABCD系数:gp_Pln(double A, double B, double C, double D)
//! Creates a plane from its cartesian equation :
//! @code
//! theA * X + theB * Y + theC * Z + theD = 0.0
//! @endcode
//! Raises ConstructionError if Sqrt (theAtheA + theBtheB + theC*theC) <= Resolution from gp.
//! 根据其笛卡尔方程创建平面:
//! @代码
//! AX+BY+CZ+theD=0.0
//! @结束代码
//! 如果Sqrt(AaA+theBtheB+theCtheC)<=来自gp的分辨率,则引发构造错误。
//! 平面的坐标系由轴定义
//! 放置A3。
//! A3的“方向”定义平面的法线。
//! A3的“位置”定义了平面的位置(原点)。
//! A3的“X方向”和“Y方向”定义了“X轴”和
//! 用于参数化平面的平面的“Y轴”。
gp_Pln( gp_Ax3 A3)
另外,还提供了一些常用的方法,比如:
–求点到平面,线到平面,平面与平面的距离及平方距离;
–点是否在平面内,线是否在平面内;
–通过一个点,一个轴的镜像平面;
–平面的旋转,缩放与平移;
Geom_ElementarySurface类:
此类用来描述一个表面,此类的派生类有:
平面;园柱面;锥面;球面;园环面;
它的基类是Geom_Surface,是一个抽象类;
Geom_Surface类的基类是Geom_Geometry类;
Geom_RectangularTrimmedSurface类:
用来生成一个有边界的平面;
比如:
Handle(Geom_Plane) aProjectionPlane = GC_MakePlane(ProjectionPlane).Value();
Handle(Geom_RectangularTrimmedSurface) aProjectionPlaneSurface=
new Geom_RectangularTrimmedSurface(aProjectionPlane,-8.,8.,-12.,12.);
DisplaySurface(aDoc,aProjectionPlaneSurface);
此类的基类是Geom_BoundedSurface类;
此类的兄弟类还有
Geom_BezierSurface,
Geom_BSplineSurface
ConicalSurface类:用来创建一个园锥表面;
构造表面的方法有:
–已知一个园锥表面,和空间一点,过此点的平行于已知园锥表面;
–已知一个园锥表面,和一个距离,创建一个平行于已知园锥表面的园锥表面;
–通过四个点构造一个园锥表面;
–通过一个轴和两个点;
–通过两个点和两个半径;
GeomAPI_IntCS类:
此类用来计算一个圆弧和和一个表面的交点或相交线段;
GeomFill_BSplineCurves类:
此类用来构造一个可以填充的BSpline表面,构造它可以用两个三个或四个BSpline曲线作为边界;
填充类型有三种:
enum GeomFill_FillingStyle {
GeomFill_StretchStyle,
GeomFill_CoonsStyle,
GeomFill_CurvedStyle
};
以下示例为用两个样条曲线生成一个表面:
GeomFill_FillingStyle Type = GeomFill_StretchStyle;
GeomFill_BSplineCurves aGeomFill1(SPL1,SPL2,Type);
Handle(Geom_BSplineSurface) aBSplineSurface1 = aGeomFill1.Surface();
GeomFill_Pipe类:
此类用来构造一个pipe,沿着一个路径sweep一个截面,这两个都是曲线类型;一般来说,结果是一个BSpline表面;
常见的有几种方法:
–给定一个路径和一个半径,截面是个园,位置是路径的第一个点,
比如:
GeomFill_Pipe aPipe(SPL1,1);
aPipe.Perform();
Handle(Geom_Surface) aSurface= aPipe.Surface();
Standard_CString aSurfaceEntityTypeName=“Not Computed”;
if (!aSurface.IsNull())
aSurfaceEntityTypeName = aSurface->DynamicType()->Name();
–给定一个路径和一个截面。
比如:
Handle(Geom_Ellipse) E = GC_MakeEllipse( gp::XOY() ,3,1).Value();
GeomFill_Pipe aPipe2(SPL1,E);
aPipe2.Perform();
Handle(Geom_Surface) aSurface2= aPipe2.Surface();
Standard_CString aSurfaceEntityTypeName2=“Not Computed”;
if (!aSurface2.IsNull()) {
aSurfaceEntityTypeName2 = aSurface2->DynamicType()->Name();
aSurface2->Translate(gp_Vec(5,0,0)); }
–给定一个路径和两个截面,中间截面为过度线;
示例:
Handle(Geom_TrimmedCurve) TC1 =
GC_MakeSegment(gp_Pnt(1,1,1),gp_Pnt(5,5,5));
Handle(Geom_TrimmedCurve) TC2 =
GC_MakeSegment(gp_Pnt(1,1,0),gp_Pnt(4,5,6));
GeomFill_Pipe aPipe3(SPL1,TC1,TC2);
aPipe3.Perform();
Handle(Geom_Surface) aSurface3 = aPipe3.Surface();
Standard_CString aSurfaceEntityTypeName3=“Not Computed”;
if (!aSurface3.IsNull())
{
aSurfaceEntityTypeName3 = aSurface3->DynamicType()->Name();
aSurface3->Translate(gp_Vec(10,0,0));
}
–给定一个路径和N个截面,中间为过渡线;
一般情况下,所生结果为:NURBS,但是,在一些特殊的情况下,可以生成平面,园柱,球,园锥等;
参数,U,沿着截面的方向,V沿着路径方向;
Geom_BezierSurface类:
生成一个Bezier表面;
Geom_OffsetSurface类:
用来偏移一个表面;
比如:
Standard_Real offset = 1;
Handle(Geom_OffsetSurface) GOS = new Geom_OffsetSurface(aGeomSurface, offset);
Geom_SweptSurface类:
有两个派生类,分别用来生成一个回转体表面和一个延展体表面;
Geom_SurfaceOfLinearExtrusion:用来描述一个线性延展表面;
它的基类是:Geom_Surface类
比如:
Handle(Geom_BSplineCurve) aCurve =GeomAPI_PointsToBSpline(array).Curve();
gp_Dir aDir(1,2,3);
Handle(Geom_SurfaceOfLinearExtrusion) SOLE =new Geom_SurfaceOfLinearExtrusion(aCurve,aDir);
Handle(Geom_RectangularTrimmedSurface) aTrimmedSurface =new Geom_RectangularTrimmedSurface(SOLE,-10,10,false);
Geom_SurfaceOfRevolution类,表示一个回转体表面;
比如:
Handle(Geom_BSplineCurve) aCurve = GeomAPI_PointsToBSpline(array).Curve();
Handle(Geom_SurfaceOfRevolution) SOR =new Geom_SurfaceOfRevolution(aCurve,gp::OX());
1:利用一个二维数组来生成曲面的方法:
TColgp_Array2OfPnt array3 (1,5,1,5);
array3.SetValue(1,1,gp_Pnt (-4,-4,5));
array3.SetValue(2,1,gp_Pnt (-2,-4,4));
Handle(Geom_BSplineSurface) aSurf2 =GeomAPI_PointsToBSplineSurface(array3).Surface();
2:GeomAPI_ExtremaSurfaceSurface类:
计算两个表面之间的极值点;
主要方法:
(1):Quantity_Length LowerDistance() const;计算两个表面的最短距离;
(2):Standard_EXPORT void LowerDistanceParameters(Quantity_Parameter& U1,Quantity_Parameter& V1,Quantity_Parameter& U2,Quantity_Parameter& V2) const;
得到第一个表面上的极值点的UV参数和第二个表面上的极值点的UV参数;
(3):void NearestPoints(gp_Pnt& P1,gp_Pnt& P2) const;得到第一个表面上的极值点和第二个表面上的极值点;
(4): Quantity_Length Distance(const Standard_Integer Index) const;得到第N个极值点的距离;
(5):Standard_Integer NbExtrema() const;极值的数目;
…
示例:
GeomAPI_ExtremaSurfaceSurface ESS(aSurf1,aSurf2);
Quantity_Length dist = ESS.LowerDistance();
gp_Pnt P1,P2;
ESS.NearestPoints(P1,P2);
gp_Pnt P3,P4;
Handle(Geom_Curve) aCurve;
Standard_Integer NbExtrema = ESS.NbExtrema();
for(Standard_Integer k=1;k<=NbExtrema;k++){
ESS.Points(k,P3,P4);
aCurve= GC_MakeSegment(P3,P4).Value();
DisplayCurve(aDoc,aCurve,Quantity_NOC_YELLOW3,false);
}
介绍
在OCC中,
gp_Pnt表示一个顶点,
gp_Vec表示一个向量,可以用两个顶点来生成一个向量。
比如:
gp_Pnt P1(0,0,0);
gp_Pnt P2(5,0,0);
gp_Vec V1 (P1,P2);
使用
向量是否平行
V1.IsOpposite(V2,Precision::Angular());
向量的大小
Standard_Real Magnitude() const;
向量的平方
Standard_Real SquareMagnitude() const;
向量的单位化
镜像向量
旋转向量
平移向量
缩放向量
一组空间点之间的关系
例子
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()) { }