CAD 系统出于精度的要求,通常使用曲线和曲面对模型进行精确表示,因此曲线、曲面的几何表示,就是比较基础也比较重要的东西了。
通常,曲线、曲面的表示有三种方式:
显示表示:形如:曲线的 y = f(x)
隐式表示:行如: f(x,y) = 0
参数表示,形如: x(t) = u(t),y(t) = v(t)
习惯上,选择参数表示形式,优点是有比较明确的几何意义,方便构造和显示等。
Occt 的 Geometry 曲线和曲面表示形式,符合 STEP 标准中的定义。如下使其继承图(下面以 3D 为主):
Geom_Geometry
----Geom_AxisPlacement
--------Geom_Axis1Placement
--------Geom_Axis2Placement
----Geom_Curve
--------Geom_BoundedCurve
----------------Geom_BezierCurve
----------------Geom_BSplineCurve
----------------Geom_TrimmedCurve
--------Geom_Conic
----------------Geom_Circle
----------------Geom_Ellipse
----------------Geom_Hyperbola
----------------Geom_Parabola
--------Geom_Line
--------Geom_OffsetCurve
--------ShapeExtend_ComplexCurve
----Geom_Point
--------Geom_CartesianPoint
----Geom_Surface
--------GeomPlate_Surface
--------Geom_BoundedSurface
----------------Geom_BezierSurface
----------------Geom_BSplineSurface
----------------Geom_RectangularTrimmedSurface
--------Geom_ElementarySurface
----------------Geom_ConicalSurface
----------------Geom_CylindricalSurface
----------------Geom_Plane
----------------Geom_SphericalSurface
----------------Geom_ToroidalSurface
--------Geom_OffsetSurface
--------Geom_SweptSurface
----------------Geom_SurfaceOfLinearExtrusion
----------------Geom_SurfaceOfRevolution
--------ShapeExtend_CompositeSurface
----Geom_Vector
--------Geom_Direction
--------Geom_VectorWithMagnitude
这里主要看 Curve 和 Surface 。
Curve 是空间的曲线。主要四大类:直线、有界曲线、二次曲线、偏移曲线。
直线很简单,由一点和方向定义。直线是无界曲线,向两端无限延伸。参数公式为:
P (U) = O + U*Dir 其中, U 为参数, O 为一点, Dir 为方向。
有界曲线,顾名思义是有界限的曲线。主要是三类曲线, Bezier 、 Bspline 曲线定义容易知道,最后一个Geom_TrimmedCurve 是将一个 Curve 使用两个参数值界定后得到的裁减曲线,例如,如果要表示一个线段,则需要对直线使用参数范围进行界定,获得。
二次曲线是空间的二次曲线,首先是平面上的曲线。在空间如何定义二次曲线?主要是定义一个坐标系,然后在坐标系内部,二次曲线的定义和平面二次曲线的定义一致。具体来说,各自的参数公式可以看出这点,如下:
Geom_Circle :
P(U) = O + R*Cos(U)*XDir + R*Sin(U)*Ydir
其中 O Xdir Ydir 构成了圆所在平面的坐标系, U 为参数,范围 [0,2PI], 下面类似。
Geom_Ellipse :
P(U) = O + MajorRad*Cos(U)*XDir + MinorRad*Sin(U)*Ydir
和 Circle 类似,只是有长短半径的区别。
Geom_Hyperbola :
P(U) = O + MajRad*Cosh(U)*XDir + MinRad*Sinh(U)*Ydir
注意:是 sinH 、 cosh , U 范围从负无穷到正无穷。
Geom_Parabola :
P(U) = O + U*U/(4.*F)*XDir + U*Ydir
U 范围从负无穷到正无穷。
下面是偏移曲线,即将一条曲线,偏移一定的距离获得的曲线。首先,要求被偏移曲线是平面曲线,否则无法偏移。其次,偏移的方向,是曲线切矢和一个参考矢量叉乘后获取的矢量的方向,通常参考矢量为平面所在平面的法矢。
下面来看曲面的表示。曲面分为四大类:有界曲面、基本曲面、偏移曲面和扫掠曲面。
下面依次来看:
有界曲面:
顾名思义,有界曲面是参数域有界的曲面。这里 bezier 和 bspline 曲面定义比较清楚。Geom_RectangularTrimmedSurface 曲面是一个曲面由参数域 [u1,u2] × [v1,v2] 界定的部分,是最基本的裁剪曲面。
基本曲面:
基本曲面描述了定义在一个局部坐标系内部的参数曲面。下面列出各个曲面的参数公式:
平面:
P(u, v) = O + u*XDir + v*Ydir
这里, O 、 Xdir 、 Ydir 定义了局部坐标系。 U 、 v 为参数,平面是无界曲面,参数域为无穷大区域。
特别注意:局部坐标系不一定非要是右手坐标系,也可能是左手坐标系,主要用于拓朴中 TopoDS_Face 的方向为Reversed 是的曲面表示。这适用于所有基本曲面。
球面: Geom_SphericalSurface
P(u,v) = O + R*cos(v)*(cos(u)*XDir + sin(u)*YDir)+R*sin(v)*Zdir
参数 u 属于 [ 0, 2.*Pi ] , v 属于 [ - Pi/2., + Pi/2. ] 。公式貌似复杂,但只要画个图,运用一点几何知识,公式是显而易见的。
柱面: Geom_CylindricalSurface :
P (U, V) = Loc + Radius * (cos (U) * XDir + sin (U) * YDir) + V * Zdir
锥面: Geom_ConicalSurface
P(u, v) = O + (R + v*tan(Ang)) * (cos(u)*XDir + sin(u)*YDir) + v*Zdir
Geom_ToroidalSurface :
P(u, v) = O + (R + r*cos(v)) * (cos(u)*XDir + sin(u)*YDir ) + r*sin(v)*Zdir
偏移曲面
就是将一个曲面偏移一定的距离获得的曲面。这里仅仅是简单的表示,没有考虑曲面自交等复杂的情况。实际上,偏移曲面是一个很复杂的曲面,需要很多的处理。
扫掠面:
包括拉伸面和旋转面,两种最常使用的曲面,都通过将一个曲线沿另一个曲线扫掠获得的曲面。
拉伸面,将一个曲线沿某个向量拉伸,获得的曲面。
旋转面,将一个曲线绕某个方向旋转,获得的曲面。
还有两个曲面类,是系统内部使用的,不是 STEP 的标准形式。。其中 GeomPlate_Surface 类是生成过渡面时使用的类,用于 N 边补洞等,比较复杂。
上述就曲线和曲面做了一个简单的总结,只有掌握了基本的曲线曲面形式,才能够对很多算法有深入的理解,才能对后面的拓朴结构有比较深入的理解。