OCCT使用指南:Modeling Data

1、介绍

        “Modeling Data” 提供了数据结构来代表2D和3D几何模型。本手册将解释如何使用“Modeling Data”。

2、几何图形实用程序

        几何工具提供以下服务:通过插值和近似来创建形状,形状的直接构造,将曲线和曲面转换为 BSpline 曲线和曲面,二维和三维曲线上的点坐标的计算,形状之间的极值计算。

2.1、插值和近似

        在建模过程中,通常需要将点近似或插值到曲线和曲面上。在插值过程中,当曲线或曲面通过所有点时,过程完成;在近似过程中,当它尽可能接近这些点时,过程完成。

        曲线和曲面的近似组合了2D和3D几何中使用的各种函数,用于:使用2D BSpline或Bezier曲线对一组2D点进行插值;使用2D BSpline或Bezier曲线对一组2D点进行近似;使用3D BSpline或Bezier曲线或BSpline曲面对一组3D点进行插值;使用3D BSpline或Bezier曲线或BSpline曲面对一组3D点进行近似。

        你可以用两种方法来编程近似值:使用高级函数,旨在提供一种简单的方法,以最少的编程获得近似值,使用低级函数,专为需要更多近似控制的用户而设计。     

        插值是指根据一组已知的数据点,估计或推断出在给定范围内的新数据点的值。近似是指用一个简单的函数或模型来近似复杂的函数或数据集,以简化问题或方便计算。

        精确度:插值方法通常要求插值函数经过已知的数据点,因此对已知数据的精确度较高,但可能对未知数据的预测性较差。近似方法不一定要经过所有已知的数据点,而是尝试用简单的函数或模型来近似复杂的函数或数据集,因此对已知数据的精确度可能较低,但对未知数据的预测性可能较好。

        计算复杂性:插值方法通常需要更多的计算资源和时间,因为需要计算每个数据点的插值。近似方法通常更简单和快速,因为只需要用一个简单的函数或模型来近似复杂的数据集。

        应用场景:当需要精确地表示已知数据时,使用插值方法。例如在金融分析、气象预报和地质勘探等领域中需要精确的数据表示。当需要快速近似复杂函数或数据集时,使用近似方法。例如在物理建模、工程设计和数据分析等领域中需要简化问题或方便计算。

        一组点的分析:GProp 包中的类PEquation允许分析一个点集或点云,并验证它们在给定的精度内是否重合、共线或共面。如果是,算法会计算点的平均点、平均线或平均平面。如果不是,算法会计算包含所有点的最小框。

        基本插值和近似:Geom2dAPI和GeomAPI包提供了简单的近似和插值方法,只需要最少的编程

        二维插值:Geom2dAPI包中的类Interpolate允许构建一个受约束的二维BSpline曲线,该曲线由曲线通过的点表定义。如果需要,可以为表中的每个点给出切线的参数值和向量。

        3D 插值:GeomAPI包中的类Interpolate允许构建受约束的3D BSpline曲线,该曲线由曲线通过的点表定义。如果需要,可以为表中的每个点给出切线的参数值和向量。   

        2D 近似:Geom2dAPI包中的类PointsToBSpline允许构建2DBSpline曲线,该曲线近似一组点。您必须定义曲线的最低和最高阶数、连续性和公差值。公差值用于检查点是否彼此太近,或切线向量是否太小。产生的BSpline曲线将是C2或二阶连续的,除非在曲线通过的点上定义了切线约束。在这种情况下,它将仅是C1连续的。

        3D 近似:GeomAPI包中的类PointsToBSpline允许构建一个3DBSplinecurve,它近似于一组点。有必要定义曲线的最低和最高阶数、连续性和公差。公差值用于检查点是否彼此距离太近,或切向量是否太小。

         曲面近似:GeomAPI包中的类PointsToBSplineSurface允许构建一个BSpline曲面,该曲面近似或插值一组点。

        高级近似:AppDef和AppParCurves包提供了低级功能,允许对近似值进行更多控制。
低级函数为第二API提供了以下函数:定义近似的强制切线。这些切线有原点和端点。近似一组平行的曲线以遵循相同的参数化。平滑近似。这是为了产生一个公平的曲线。
        您还可以找到要计算的函数:包含一组点的最小框,一组共面、共线或重合点的平均平面、直线或点。

        多点约束近似:AppDef包提供了低级工具,允许使用多点约束将点组并行近似为贝塞尔曲线或B样条曲线。提供以下低级别服务:点约束数组的定义:MultiLine类允许定义给定数量的多点约束,以构建多线,多条线通过有序的多点限制。

        此图像中:Pi、Qi、Ri……Si可以是二维或三维点。定义为组:Pn、Qn、Rn、...Sn构成一个多点约束。它们具有相同的通道、切线和曲率约束。P1、P2、…Pn或Q、R、…或S系列表示要近似的线。

         一组点约束的定义:多点约束类允许定义多点约束,并计算点集到几条曲线的近似值。根据一组点计算贝塞尔曲线的近似值:类 Compute 允许对一组点进行贝塞尔曲线的近似

        根据一组点计算 BSpline 曲线的近似值:B SplineCompute 类允许对一组点进行 B Spline 曲线的近似。

        变分准则的定义:TheVariational类允许使用最小二乘法结合变分准则(通常是每个约束点的权重)将近似曲线光顺到给定数量的点。

        变分准则是数学物理中极值问题的解决方案,它允许我们通过寻找满足某些特定条件的函数来解决这些问题。这些条件可能是函数的端点值、极值或某些特定的约束。

        示例:如何根据切线近似曲线,要根据切线近似曲线,请执行以下步骤:从要近似的点集中创建类型为AppDef_MultiPointConstraints的对象,并使用SetTang方法设置相切向量。从AppDef_MultiPointConstraint创建一个类型为AppDef_MMultiLine的对象。使用AppDef_BSplineCompute,它实例化Approv_BSPplineComputeLine来执行近似。

2.2、直接施工

        gce、GC和GCE2d包中的直接构造方法提供了简化的算法来构建基本的几何实体,如直线、圆和曲线。它们补充了gp、Geom和Geom2d包提供的参考定义。

        由gce、GCE2d和GC包实现的算法很简单:没有创建由高级位置约束定义的对象(有关此主题的更多信息,请参阅Geom2dGcc和GccAna,它们通过约束描述几何)。例如,使用gp包从点和半径构造一个圆,在创建圆之前需要构造轴Ax2d。如果使用gce包,并且以Ox为轴,则可以直接从点和半径创建一个圆。另一个例子是类 gce_MakeCirc,它提供了一个框架,用于定义在圆的几何构造中遇到的八个问题,并实现八个相关的构造算法。

        创建(或实现)的对象是一种算法,可以参考该算法来发现,特别是:其结果为gp_Circ,以及其地位。在这里,状态指示构建是否成功。

        此外,gce、GCE2d和GC每个都有一个Root类。这个类是包中所有返回状态的类的根。返回的状态(构造成功或构造错误)由枚举gce_ErrorType描述。请注意,构造几何变换的类不会返回状态,因此不会从Root继承。

        gp包中的每个类,如Circ、Circ2d、Mirror、Mirror2d等,都有来自gce包的相应MakeCirc、MakeCirc2d、MakeMirror、MakeMirror2d等等类。

        GCE2d包中的每个类,如Circle、Ellipse、Mirror等,都有来自Geom2d包的相应MakeCircle、MakeEllipse和MakeMirror等类。此外,类MakeArcOfCircle从Geom2d返回一个类型为TrimmedCurve的对象。

        GC包中的每个类,如Circle、Ellipse、Mirror等,都有来自Geom包的相应MakeCircle、MakeEllipse和MakeMirror等类。以下类从Geom返回TrimmedCCurve类型的对象:MakeArcOfCircle,MakeArcOfEllipse,MakeArcOfHyperbola,MakeArcOfParabola,MakeSegment。

2.3、B样条曲线的转化

        “转换到样条线和从样条线转换”组件有两个不同的用途:

        首先,它提供了一种可用于描述任何曲线或表面的均匀配方。这对于为单个数据结构模型编写算法非常有用。B样条线公式可用于表示由描述几何数据结构的组件(“基本几何类型”、“2D几何类型”和“3D几何类型”组件)提供的最基本的几何对象。

        其次,它可以用于将B样条曲线或曲面划分为一系列曲线或曲面,从而提供更高程度的连续性。这对于编写算法非常有用,因为这些算法需要在应用它们的对象中具有特定程度的连续性。不连续性仅位于对象的边界上。

        “转换到BSplines和从BSplines转换”组件由三个包组成。Convert软件包提供了将以下内容转换为B样条曲线或曲面的算法:基于来自gp包的基本2D曲线(直线、圆或圆锥曲线)的有界曲线,基于来自gp包的基本表面(圆柱体、圆锥体、球体或环面)的有界表面,由其极点定义的一系列相邻的2D或3D贝塞尔曲线。

        这些算法计算定义生成的B样条曲线或曲面所需的数据。然后,可以在算法中直接使用这些基本数据(度数、周期特性、极点和权重、节数和乘法),或者可以通过调用类Geom2d_BSplineCurve、Geom_BSplineCurve或Geom_BSplineSurface提供的适当构造函数来构造曲线或曲面。

        Geom2dConvert软件包提供以下功能:全局函数,用于基于来自Geom2d包的2D曲线从有界曲线构造B样条曲线,该分割算法计算2D B样条曲线应该被切割的点,以便获得具有相同连续度的弧,用于构造通过该分割算法或通过对B样条曲线的其他类型的分割所创建的B样条线曲线的全局函数,将2D B样条曲线转换为一系列相邻贝塞尔曲线的算法。

        GeomConvert软件包还提供以下功能:全局函数,用于基于来自Geom包的曲线从有界曲线构造B样条曲线,计算应该切割B样条曲线以获得具有相同连续度的弧的点的分割算法,构造通过该分割算法或通过其他类型的B样条曲线分割创建的B样线曲线的全局函数,将B样条曲线转换为一系列相邻的贝塞尔曲线的算法,全局函数,用于基于来自Geom包的表面从有界表面构造BSpline表面,确定应该沿着其切割BSpline表面以获得具有相同连续度的面片的曲线的分割算法,构造通过该分割算法或通过其他类型的B样条曲面分割创建的B样线曲面的全局函数,一种将B样条曲面转换为一系列相邻Bezier曲面的算法,一种算法,将相邻Bezier曲面的网格转换为B样条曲面。

2.4、曲线上的点

        曲线上的点组件包括高级函数,该高级函数为计算2D或3D曲线上点的复杂算法提供API。以下特征点存在于三维空间中的参数化曲线上:在曲线上等距分布的点,沿着具有相等弦的曲线分布的点,与曲线上的另一点相距给定距离的一点。

        GCPnts软件包提供了计算这些点的算法:AbcissaPoint计算曲线上与曲线上另一点相距给定距离的点。UniformAbcissa计算曲线上给定横坐标处的一组点。UniformDeflection计算曲线和多边形之间最大恒定偏转的一组点,

2.5、极值

        GeomAPI和Geom2dAPI包提供了用于计算二维和三维中点、曲线和曲面之间的最小距离的类。这些程序包计算以下各项之间的距离极值:点和曲线,点和表面,两条曲线,曲线和表面,两个表面。

        点和曲线/曲面之间的极值:GeomAPI_ProjectPointOnCurve类允许计算点和曲线之间的所有极值。Extreme是与曲线正交的线段的长度。GeomAPI_ProjectPointOnSurface类允许计算点和曲面之间的所有极值。极值是与曲面正交的线段的长度。这些类使用“投影”标准进行优化。

        曲线之间的极值:Geom2dAPI_ExtremaCurveCurve类允许计算两条二维几何曲线之间的所有最小距离。GeomAPI_ExtremaCurveCurve类允许计算两条三维几何曲线之间的所有最小距离。这些类使用欧几里得距离作为优化的标准。

        曲线和曲面之间的极值:GeomAPI_ExtremaCurveSurface类允许计算三维曲线和曲面之间的一个极值。极值是与曲线和曲面正交的线段的长度。此类使用“投影”标准进行优化。

        曲面之间的极值:GeomAPI_ExtremaSurfaceSurface类允许计算两个曲面之间的一个最小距离和一个最大距离。此类使用欧几里得距离来计算最小值,使用“投影”标准来计算最大值。

3、2D几何

        Geom2d包在2dspace中定义几何对象。所有几何图元都经过STEP处理。这些对象是通过引用处理的。特别是,Geom2d包提供了以下类:点、矢量和曲线的描述,它们使用坐标系在平面中的定位,他们的几何变换,通过应用平移、旋转、对称性、缩放变换及其组合。

        以下对象可用:点,笛卡尔点,向量,方向,具有幅度的矢量,轴,曲线,线,圆锥曲线,圆、椭圆、双曲线、抛物线,圆曲线:修剪曲线、NURBS曲线、贝塞尔曲线、偏移曲线。

        在创建几何对象之前,有必要决定如何处理对象。Geom2d包提供的对象是通过引用而不是通过值来处理的。复制实例会复制句柄,而不是对象,因此对一个实例的更改会反映在它的每次出现中。如果需要一组对象实例而不是单个对象实例,则可以使用TColGeom2d包。该包提供Geom2d包中曲线的一维数组和序列的标准和常用实例。所有对象都有两个版本:通过引用和按值处理。

        Geom2d曲线的关键特征是它们是参数化的。每个类都提供了使用曲线参数方程的功能,特别是计算曲线上的参数u的点以及该点处1、2……N阶导向量。作为参数化的结果,Geom2d曲线是自然取向的。参数化和方向将基本Geom2d曲线与其gp包提供的等效曲线区分开来。Geom2d包提供了转换函数,可以在可能的情况下将Geom2d对象转换为gp对象,反之亦然。此外,Geom2d包提供了更复杂的曲线,包括Bezier曲线、BSpline曲线、修剪曲线和偏移曲线。

        Geom2d对象根据多个级别的继承结构进行组织。因此,椭圆(特定类Geom2d_Ellipse)也是圆锥曲线,并继承自抽象类Geom2d_Conic,而贝塞尔曲线(具体类Geom2d_BezierCurve)也是有界曲线,并继承自抽象类Geom2d_BoundedCurve;这两个例子也是曲线(抽象类Geom2d_Curve)。曲线、点和向量继承自抽象类Geom2d_Geometry,它描述了Geom2d包中任何几何对象的共同属性。

        这种继承结构是开放的,可以描述从Geom2d包中提供的对象继承的新对象,只要它们遵守它们要继承的类的行为。

        最后,二维几何对象可以在更复杂的数据结构中共享。这就是为什么它们在拓扑数据结构中使用的原因,例如。

        Geom2d包使用gp包的服务来:实施初等代数微积分和基本解析几何,描述可以应用于Geom2d对象的几何变换,描述二维几何对象的基本数据结构。然而,Geom2d包本质上提供的是数据结构,而不是算法。你可以参考GCE2d包,找到更多用于Geom2d对象的进化构造算法。

4、3D几何

        Geom包定义了3d空间中的几何对象,并包含所有基本的几何变换,如身份、旋转、平移、镜像、缩放变换、变换组合等,以及根据几何对象的参考定义而定的特殊函数(例如在B样条曲线上添加控制点、修改曲线等)。所有几何实体都是STEP处理的。

        特别是,它提供了以下类:点、向量、曲线和曲面的描述,使用轴或坐标系在3D空间中的定位,以及通过应用平移、旋转、对称、缩放变换及其组合,对它们进行几何变换。

        以下对象可用:指向、笛卡尔点、矢量、方向、具有幅值的矢量、轴、曲线、线、圆锥曲线:圆、椭圆、双曲线、抛物线、偏移曲线、基本曲面:平面、圆柱体、圆锥体、球体、圆环体、边界曲线:修剪曲线、NURBS曲线、Bezier曲线、边界曲面:矩形修剪曲面、NURBS曲面、Bezier曲面、扫掠表面:线性挤压表面、旋转表面、偏移曲面。

        Geom曲线和曲面最重要的特点是它们都是参数化的。每个类都提供了与曲线或曲面的参数方程相关的功能,特别是用于计算:曲线上参数u对应的点、曲面上参数(u, v)对应的点,以及在该点处的1阶、2阶……N阶导数向量。由于这种参数化的结果,Geom曲线或曲面自然地具有了方向。

        参数化和方向使Geom的基本曲线和曲面与gp包中相同(或类似)名称的类区别开来。当可能进行转换时,Geom包还提供了将Geom对象转换为gp对象的功能,反之亦然。

        此外,Geom包提供了更复杂的曲线和曲面,包括:Bezier和B样条曲线和曲面,扫掠表面例如旋转表面和线性挤压表面,修剪的曲线和曲面,以及偏移曲线和曲面。

        Geom对象按照多个级别的继承结构进行组织。因此,球体(具体类Geom_SphericalSurface)也是基本曲面,继承自抽象类Geom_ElementarySurface,而贝塞尔曲面(具体类Geom_BezierSurface)也是有界曲面,继承自抽象类Geom_BoundedSurface;这两个例子都是曲面(抽象类Geom_Surface)。曲线、点和向量继承自描述Geom包中任何几何对象共同属性的抽象类Geom_Geometry。

        这种继承结构是开放的,只要符合继承类的行为,就可以描述从Geom包中提供的新对象。最后,Geom对象可以在更复杂的数据结构中共享。这就是为什么它们用于例如拓扑数据结构的原因。如果需要一组对象实例而不是单个对象实例,可以使用TColGeom包。此包提供了对来自Geom包的曲线进行实例化的1维和2维数组和序列。所有对象都有两个版本:通过引用处理和通过值处理

        Geom软件包使用gp软件包的服务:实现初等代数微积分和基本解析几何,描述了可以应用于Geom对象的几何变换,描述了Geom对象的基本数据结构。然而,Geom包本质上提供的是数据结构,而不是算法。您可以参考GC包来查找Geom对象的更进化的构造算法。

5、图形属性

5.1、形状的局部特性

        BRepLProp软件包提供了形状组件的局部属性,其中包含计算BRep模型中边缘和面上的各种局部属性的算法。可以查询的本地属性包括:

        对于支持边缘的曲线上的参数u点:点,导数矢量,最高达第三度,切线向量,法线,曲率以及曲率中心;对于支撑面的曲面上参数点 (u, v):点,导数向量,直到第二度,u和v等参曲线的切向量,法线向量,最小或最大曲率以及相应的曲率方向;支撑一条边的曲线的连续性程度,由两条其他边的连接点构成。

        分析的边和面被描述为BRepAdaptor曲线和曲面,它们为形状提供了用于描述其几何支撑的接口。局部特性的基点由其在曲线上的u参数值或其在曲面上的(u,v)参数值定义。

5.2、曲线和曲面的局部性质

        “曲线和曲面的局部特性”组件提供了用于计算Geom曲线(在2D或3D空间中)或曲面上的各种局部特性的算法。它包括:Geom2dLProp软件包允许计算2D曲线上参数点的导数和切线向量(法线和曲率);GeomLProp软件包提供3D曲线和曲面上的局部属性;LProp软件包提供用于描述2D曲线上特定点的枚举。

        曲线可以是Geom_Curve曲线(在三维空间中),也可以是Geom2d_Curve曲线(在平面中)。曲面是Geom_Surface曲面。计算局部特性的点由曲线上的u参数值和曲面上的(u,v)参数值定义。可以查询与上述点相同的局部特性,此外还可以查询2D曲线:所述点对应于曲率的最小值或最大值;拐点。

        示例:如何检查表面凹度,要检查表面的凹度,请按以下步骤进行:对曲面进行采样,并在每个点计算高斯曲率。如果曲率值的符号发生变化,则曲面是凹形还是凸形,具体取决于视点。要计算高斯曲率,请使用GeomLDrop中的类SLprops,该类实例化了LProp中的通用类SLprops,并使用GaussianCurvature方法。

5.3、曲线和曲面的连续性

        GeomAbs_Shape枚举中描述了曲线和曲面支持的连续性类型。对于曲线,支持以下类型的连续性(见下图):C0(GeomAbs_C0)-参数连续性。它与G0(几何连续性)相同,因此最后一个不由单独的变量表示。G1(GeomAbs_G1)-左侧和右侧的切线向量是平行的。C1(GeomAbs_C1)-表示一阶导数的连续性。G2(GeomAbs_G2)-除了G1连续性外,左侧和右侧的曲率中心相同。C2(GeomAbs_C2)-所有导数到二阶的连续性。C3(GeomAbs_C3)-所有导数到三阶的连续性。CN(GeomAbs_CN)-所有导数的连续性,直到N阶(连续性的无限阶)。
注:几何连续性(G1,G2)意味着曲线可以重新参数化为具有参数(C1,C2)连续性。

        支持以下类型的曲面连续性:C0(GeomAbs_C0)-参数连续性(曲面没有不连续的点或曲线)。G1(GeomAbs_G1)-曲面在每个点上都有一个切平面。C1(GeomAbs_C1)-表示一阶导数的连续性。G2(GeomAbs_G2)-除了G1连续性之外,主曲率和方向也是连续的。C2(GeomAbs_C2)-所有导数到二阶的连续性。C3(GeomAbs_C3)-所有导数到三阶的连续性。CN(GeomAbs_CN)-所有导数的连续性,直到N阶(连续性的无限阶)

        对于单个曲面,两个曲面的连接(参见上图)仅在每个交点定义其连续性。连接的平滑度是相交曲线上连续性的最小值。 

5.4、共享边的正则性

        边的规则性是指共享这条边的两个面的连接平滑度。换句话说,规则性是指边上的每个点处连接的面之间的最小连续性。

        边缘的规则性可以通过BRep_Builder::Continuity方法设置。要获得规则性,请使用BRep_Tool::Continuity方法。

        一些算法(如Fillet)通过自己的算法设置所生成边的规则性。另一方面,其他一些算法(如布尔运算、形状修复等)则不设置规则性。如果需要正确设置形状的规则性,可以使用BRepLib::EncodeRegularity方法。它计算并设置形状所有边的正确值。

        以下高级算法广泛使用规则性标志:斜面、拔模斜角、隐藏线去除、胶合。

5.5、形状的全局属性

        形状的全球属性组件提供用于计算三维空间中复合几何系统的全局属性的算法,以及用于查询计算结果的框架。

        为系统计算的全局属性包括:质量、质量中心、惯性矩阵、绕轴的力矩、绕轴的回转半径、
主惯性主轴、主力矩、主回转半径等主惯性。

        几何系统通常被定义为形状。根据分析方式的不同,这些形状将具有以下特性:从形状边缘诱导的线条,由形状的面诱导的曲面,或由形状所界定的固体诱导的体积。几个系统的全局属性可以组合在一起,给出由所有单个系统的总和组成的系统的全局属性。

        形状的全球属性组件由以下部分组成:计算形状全局属性的七个函数:一个用于线的函数,两个用于面的函数,四个用于体的函数。函数的选择取决于输入参数和用于计算的算法(BRepGProp全局函数),用于计算一组点的全局属性的框架(GProp_PGProps),一个通用框架,汇集了几个更基本的框架所保留的全局属性,并提供了一个通用的编程接口来查询计算的全局属性。GeomLProp和Geom2dLProp包提供了计算曲线和曲面局部属性的算法

        曲线(对于一个参数)具有以下局部属性:指向、导数、切线、法线、曲率、曲率中心。

        曲面(针对两个参数 U 和 V)具有以下局部特性:指向、U 和 V 的导数、切线(用于 U 和 V)、法线、最大曲率、最小曲率、主要曲率方向、平均曲率、高斯曲率。

        以下方法可用:CLProps–计算曲线的局部特性(相切、曲率、法线);CurAndInf2d–计算2d曲线的最大和最小曲率以及拐点;SLProps–计算曲面的局部特性(相切、法线和曲率)。Continuity–计算两条曲线连接处的规则性。

        请注意,B样条曲线和曲面是可以接受的,但它们不会被切割成所需连续性的片段。这就是全球的连续性。

5.6、曲线和曲面适配器

        一些OCCT的通用算法理论上可以在许多类型的曲线或曲面上工作。为了做到这一点,他们只需通过一个接口获得分析的曲线或曲面所需的服务,以便连接到单个API,无论曲线或曲面的类型如何。这些接口称为适配器。例如,Adaptor3d_Curve是一个抽象类,它通过使用任何三维曲线的算法提供所需的服务。

        GeomAdaptor包提供接口:在Geom曲线上;在Geom曲面上的曲线上;在Geom表面上;

        Geom2dAdaptor包提供接口:在Geom2d曲线上。

        BRpAdaptor软件包提供接口:在面上,在边上。

        编写对几何对象进行操作的算法时,请使用Adaptor3d(或Adaptor2d)对象。

        因此,如果为该对象提供从Adaptor3d或Adaptor2d派生的接口,则可以将该算法用于任何类型的对象。这些接口很容易使用:只需从Geom2d曲线创建一条自适应曲线或曲面,然后将该自适应曲线用作算法的参数?这就需要它。

6、拓扑结构

        OCCT拓扑允许访问和操作对象的数据,而无需处理它们的2D或3D表示。OCCT几何以坐标或参数值的形式提供对象的描述,而拓扑则描述参数空间中对象的数据结构。这些描述使用了该空间的位置和部分限制。

        拓扑库允许您构建纯拓扑数据结构。拓扑定义简单几何图元之间的关系。通过这种方式,可以将复杂形状建模为更简单实体的部件。由于内置的非流形(或混合维度)功能,您可以构建混合的模型:0D实体,如点;1D实体,例如曲线;二维实体,例如曲面;三维实体,例如体积。

        例如,可以表示由多个不同实体组成的单个对象,这些实体包含连接或未连接到外部边界的嵌入曲线和曲面。抽象拓扑数据结构描述了一个基本实体——一个形状,它可以分为以下组件拓扑:Vertex - 一个零维形状,对应于几何中的一个点;Edge - 一个形状,对应于一条曲线,并在每个端点由一个顶点限定;Wire - 由其顶点连接的边缘的序列;Face -(在2D几何中)平面的一部分或(在3D几何中)由闭合导线限定的表面;Shell - 通过其导线边界的一些边缘连接的面集合;Solid - 由一个shell限定的3D空间的一部分;Compound solid - 多个固体的集合。

        Wire 和Solid 可以是无限的,也可以是闭合的。具有三维基础几何图形的面也可以指近似于基础曲面的连接三角形的集合。曲面可以是未定义的,只留下由三角形表示的面。如果是这样,则该模型是纯多面体。

        拓扑定义了简单几何实体之间的关系,因此可以将这些实体链接在一起以表示复杂的形状。

        抽象拓扑由六个包提供。前三个包描述了Open CASCADE Technology中使用的拓扑数据结构:TopAbs包为拓扑驱动的应用程序提供了通用资源。它包含用于描述基本拓扑概念的枚举:拓扑形状、方向和状态。它还提供了管理这些枚举的方法。TopLoc包提供了处理三维局部坐标系的资源:Datum3D和Location。Datum3D描述了一个基本坐标系,而Location包括一系列基本坐标系。TopoDS包描述了用于建模和构建纯拓扑数据结构的类。

        另外三个包提供了访问和操作此抽象拓扑的工具:TopTools包提供了用于拓扑数据结构的基本工具。TopExp包提供了用于探索和操作TopoDS包中描述的拓扑数据结构的类。BRep Tools包提供了用于探索、操作、读取和写入BRep数据结构的类。这些更复杂的数据结构将拓扑描述与额外的几何信息相结合,并包括用于评估同一对象(例如点)的不同可能表示的等价性的规则。

6.1、图形位置

        可以将局部坐标系视为以下任一坐标系:一个右手三面体,有一个原点和三个正交向量。gp_Ax2包对应于这个定义。一个+1行列式的变换,允许局部和全局参考系之间的坐标变换。这对应于gp_Trsf。

        TopLoc软件包区分了两个概念:TopLoc_Datum3D 类提供基本参考坐标,由右手正交坐标系或右手单位变换表示。TopLoc_Location类提供由基本坐标构成的复合参考坐标。它是一个标记,由一系列对基本标记的引用组成。存储得到的累积变换是为了避免重新计算整个列表的变换之和。

         如果两个参考坐标由相同的基本坐标按相同的顺序组成,则它们是相等的。没有数字比较。因此,如果两个坐标不是从相同的基本坐标构建的,那么它们可以对应于相同的变换而不相等。
例如,考虑三个基本坐标:R1、R2、R3。复合坐标为:C1=R1*R2,C2=R2*R3 ,C3=C1*R3, C4=R1*C2。注C3和C4相等,因为它们都是R1*R2*R3。
        TopLoc包主要针对拓扑数据结构,但也可以用于其他目的。坐标的更改TopLoc_Data_3D类表示基本坐标的变化。此类更改必须共享,以便此类继承自Standard_Transient。坐标由变换gp_Trsfpackage表示。此转换没有缩放因子。

6.2、形状命名、子形状及其方向和状态

        TopAbs包提供了一般枚举,描述了拓扑的基本概念和处理这些枚举的方法。它不包含类。这个包已经从拓扑的其余部分分离出来,因为它包含的概念足够通用,可以被所有拓扑工具使用。这避免了重新定义枚举,保持独立于建模资源。TopAbs包定义了三个概念:类型TopAbs_ShapeEnum;方向TopAbs_Orientation;状态StateTopAbs_State。

        拓扑类型:TopAbs 包含 TopAbs_ShapeEnum 枚举,其中列出了不同的拓扑类型:

        COMPOND–一组任意类型的拓扑对象。COMPSOLID–复合实体是由面连接的一组实体。它将WIRE和SHELL的概念扩展到实体。SOLID——由外壳限制的空间的一部分。它是三维的。SHELL–通过边连接的一组面。外壳可以打开也可以关闭。FACE–在2D中,它是平面的一部分;在3D中,它是曲面的一部分。其几何图形受轮廓约束(修剪)。它是二维的。WIRE–通过顶点连接的一组边。它可以是开放轮廓,也可以是闭合轮廓,具体取决于边是否链接。EDGE–与约束曲线相对应的拓扑元素。边通常受到顶点的限制。它只有一个维度。VERTEX–对应于一个点的拓扑元素。它的维度为零。SHAPE——一个涵盖上述所有内容的通用术语。

        拓扑模型可以被视为具有邻接关系的对象的图。在2D或3D空间中建模一个部分时,它必须属于ShapeEnum枚举中列出的类别之一。 TopAbspackage列出了所有可以在任何模型中找到的对象。它不能被扩展,但可以使用子集。例如,实体的概念在2D中是无用的。枚举的术语从最复杂到最简单依次出现,因为对象的描述中可以包含更简单的对象。例如,一个面引用它的线、边和顶点。

        方向的概念由 TopAbs_Orientation 枚举表示。方向是各种建模器中方向感的广义概念。当形状限制几何域时,使用方向;方向与边界的概念密切相关。三种情况如下:由顶点限制的曲线。
表面受边缘限制。空间受限于面。在每种情况下,用作更高维几何域边界的拓扑形式定义了两个局部区域,其中一个被任意视为默认区域。

        对于受顶点限制的曲线,默认区域是参数大于顶点的点的集合。也就是说,它是沿着曲线自然方向在顶点之后的部分曲线。对于受边缘限制的曲面,默认区域位于边缘的左侧,遵循其自然方向。更确切地说,它是曲面法线向量和曲线切线向量的向量积所指向的区域。对于受面限制的空间,默认区域位于曲面法线的负侧。基于这个默认区域,方向允许定义要保留的区域,称为内部或材质。有四种方向定义内部。 

         方向的概念是一个非常通用的概念,它可以用于任何出现区域或边界的上下文。因此,例如,当描述边缘和轮廓的相交时,不仅可以描述相交顶点,还可以描述将其视为边界的边缘如何与轮廓相交。因此,边将分为两个区域:外部和内部,相交顶点将作为边界。因此,方向可以与相交顶点相关联,如下图所示:

        TopAbs_State枚举描述了一个顶点或一组顶点相对于区域的位置。共有四个术语: IN要点在内部。OUT该点位于外部。ON点在边界上(在公差范围内)。UNKNOWN状态是不确定的。

        之所以引入UNKNOWN术语,是因为该枚举通常用于表示可能失败的计算结果。当无法知道一个点是在内部还是在外部时,可以使用此术语,这是开路导线或面的情况。

        State枚举也可用于指定对象的各个部分。下图显示了边与面相交的部分。 

6.3、操纵形状和子形状

        TopoDS包描述了具有以下特征的拓扑数据结构:指既没有方向也没有位置的抽象形状。通过工具类访问数据结构。
        如上所述,OCCT拓扑描述了参数空间中对象的数据结构。这些描述使用了该空间部分的局部化和限制。可以用这些术语描述的形状类型是顶点、面和形状。顶点是根据参数空间中的局部化定义的,面和形状是根据该空间的限制定义的。

        OCCT拓扑描述还允许在这些术语中定义的简单形状组合成集合。例如,一组边形成一条线;一组面形成一个壳;一组实体形成一个复合实体(Open CASCADE Technology中的CompSolid)。您还可以将任何一种形状组合成CompSolid。最后,您可以给形状一个方向和一个位置。

        按复杂度从顶点到组合实体的顺序列出形状,使我们认识到数据结构的概念,即如何将形状分解为一系列更简单的形状。这实际上是TopoDS软件包的目的。

        形状的模型是一种可共享的数据结构,因为它可以被其他形状使用。(一个边可以被实体的多个面使用)。可共享的数据结构由引用处理。当简单的引用不足时,会添加两条信息:方向和局部坐标参考。方向“告诉”参照形状如何在边界中使用(TopAbs的方向)。本地参考坐标(来自 TopLoc 的位置)允许在不同于其定义的位置引用形状。

        TopoDS_TShape类是所有形状描述的根。它包含一个形状列表。如果需要,继承TopoDS_TShape的类可以携带几何域的描述(例如,与TVertex关联的几何点)。TopoDS_TShape是对形状定义参照系中的形状的描述。这个类是通过引用操作的。

        TopoDS_Shape类描述了对形状的引用。它包含对基础抽象形状的引用、方向和局部引用坐标。此类由值操纵,因此不能共享。表示底层抽象形状的类从未被直接引用。TopoDS_Shape类总是用来引用它。每个形状(几何支撑)的特定信息总是通过继承添加到从TopoS_TShape派生的类中。下图显示了由边连接的两个面形成的壳的示例。

        在上一个图中,外壳由基础形状TS描述,面由TF1和TF2描述。从TE1到TE7有七条边,从TV1到TV6有六个顶点。导线TW1参考从TE1到TE4的边缘;从TE4到TE7的TW2参考。
        顶点由边参照,如下所示:TE1(TV1,TV4)、TE2(TV1、TV2)、TE3(TV2、TV3)、TE4(TV3、TV4),TE5(TV4、TV5)、TE6(T5、TV6)、TE7(TV3,TV6)。
        请注意,此数据结构不包含任何反向引用。所有引用都从更复杂的基础形状到不太复杂的形状。稍后将描述用于访问信息的技术。数据结构尽可能紧凑。子对象可以在不同的对象之间共享。
两个非常相似的对象,可能是同一对象的两个版本,可能共享相同的子对象。在数据结构中使用局部坐标允许共享重复子结构的描述。
        紧凑的数据结构避免了与复制操作相关联的信息丢失,复制操作通常用于创建对象的新版本或应用坐标更改时。
        下图显示了包含实体的两个版本的数据结构。第二个版本呈现了在不同位置钻出的一系列相同的孔。数据结构紧凑,但保留了关于子元素的所有信息。从TSh2到下面TFcyl的三个参考具有关联的局部坐标系,这些坐标系对应于孔的连续位置。 

        继承TopoDS_Shape的类:TopoDS基于TopoDS_Shape类和定义其基础形状的类。这有一定的优点,但主要的缺点是这些类过于笼统。它们可以表示的不同形状不会键入它们(顶点、边等),因此不可能引入检查来避免不连贯,例如在边中插入面。

        TopoDB包提供了两组类,一组继承了既没有方向也没有位置的底层形状,另一组继承TopoDS_Shape,它们表示TopAbs包中枚举的标准拓扑形状。

        以下类继承Shape:TopoDS_Vertex、TopoDS_Edge、TopoDS_Wire、TopoDS_Face、TopoD_Shell、TopoDS_Solid、TopoDS_CompSolid和TopoDS_Compound。尽管名称与从TopoDS_TShape继承的名称相似,但它们的使用方式却有着深刻的差异。

        TopoDShape类及其继承的类是操作拓扑对象的自然方法。TopoDS_TShape类是隐藏的。TopoDS_TShape在其原始局部坐标系中描述了一个类,但没有方向。TopoDShape是对TopoDS_TShape的引用,具有方向和局部引用。

        TopoDS_TShape类被推迟;TopoDS_Shape类不是。使用TopoShape类可以在不知道拓扑对象类型的情况下操作拓扑对象。它是一种通用形式。纯拓扑算法通常使用TopoDShape类。

        TopoDS_TShape类通过引用进行操作;TopoDS_Shape类(按值)。TopoDS_Shape只不过是一个通过方向和局部坐标增强的参照。TopoSS_Shapes的共享毫无意义。重要的是共享底层TopoS_TShapes。参数中的赋值或段落不会复制数据结构:这只会创建引用同一TopoDS_Shape的新TopoDS_Shape。

        尽管继承TopoDS_Thape的类用于添加额外信息,但不应在继承自TopoDS_Thape的类中添加额外字段。从TopoDS_Shape继承的类只用于专门化引用,以便从静态类型控制(由编译器执行)中获益。例如,对于编译器来说,在参数中接收TopoDS_Face的例程比接收TopoShape的例程更精确。派生Topods中发现的类之外的其他类是毫无意义的。对拓扑数据结构的所有引用都是使用TopoDS中定义的Shape类及其继承器进行的。

        继承自TopoDS_Thape类的类没有构造函数,否则类型控件将通过隐式强制转换(C++的一个特性)而消失。TopoDS包提供了用于在其中一个子类中强制转换TopoDS_Shape类对象的包方法,并进行类型验证。 

6.4、拓扑数据结构探索

        TopExp包提供了用于探索TopoDS包描述的数据结构的工具。探索拓扑结构意味着找到给定类型的所有子对象,例如,找到实体的所有面。

        TopExp 包提供了 TopExp_Explorer 类来查找给定类型的所有子对象。一个资源管理器由以下部分组成:形状有待探索。要查找的形状类型,例如 VERTEX、EDGE,SHAPE 除外,SHAPE 不允许。要避免的形状类型。例如SHELL、EDGE。默认情况下,此类型为SHAPE。此默认值表示对探索没有限制。

6.5、形状的列表和映射

        TopTools包包含用于开发TopoDS数据结构的工具。它是TCollection包中工具的实例化,具有TopoDS的Shape类。

        TopTools_Array1OfShape、HArray1OfShape——使用TopoDS_Shape对TCollection_Array1和TCollection_HArray1进行实例化。
        TopTools_SequenceOfShape——使用TopoDS_Shape对TCollection_Sequence进行实例化。
        TopTools_MapOfShape - TCollection_Map 的实例化。允许构造形状集。
        TopTools_IndexedMapOfShape - TCollection_IndexedMap 的实例化。允许构造形状表和其他数据结构。使用TopTools_Map可以保留一组对Shape的引用,而不会重复。注意:有关映射的更多详细信息,请参阅TCollection文档(基础类参考手册)。BRepTools_WireExplorer 类可以按连接顺序访问导线的边。

6.6、形状的存储

        BRepTools和BinTools包包含Read和Write方法,允许在流或文件中读写形状。BRepTools包提供的方法使用ASCII存储格式;BinTools包使用二进制格式。这些方法中的每一个都有两个参数:

        要读取/写入的 TopoDS_Shape 对象;一个流对象或一个文件名,用于读取/写入。

7、包围盒

        边界框在许多OCCT算法中使用。最常见的用途是作为过滤器,避免检查形状对之间的过度干扰(检查边界框之间的干扰比检查形状之间的干扰简单得多,如果它们不相互干扰,那么搜索相应形状之间的干扰就没有意义)。一般来说,边界框可以分为两种主要类型:

        轴对齐边界框(AABB)是指其边缘平行于世界坐标系(WCS)轴的框;
面向BndBox(OBB)是在其自己的坐标系中定义的,该坐标系可以相对于WCS旋转。事实上,AABB是OBB的一个特例。下图说明了使用OBB比AABB更好的例子。

        这张图片中的AABB受到干扰。因此,许多OCCT算法将花费大量时间来干扰形状。但是,如果我们检查没有受到干扰的OBB,那么就不需要搜索形状之间的干扰。在那时,创建和分析OBB比AABB的类比操作需要的时间要长得多。

        在本节的后面,具有最小表面积的边界框将被称为最优。在OCCT中,边界框在Bnd包中定义。Bnd_Box类定义了AABB,Bnd_OBB类定义了OBB。这些类包含以下常用方法(此列表不完整;有关详细信息,请参阅相应类的文档):IsVoid 方法指示边界框是否为空(未初始化)。
SetVoid 方法清除现有的边界框。Enlarge(...) 扩展当前边界框。Add(...)根据需要扩展边界框,以包含作为参数传递的对象(点、形状等)。IsOut(...) 检查参数是否在当前 BndBox 内/外。BRepBndLib 类包含从形状创建边界框(AABB 和 OBB)的方法。 

7.1、OBB些算法简介

        从一组点创建OBB:该算法在 Thomas Larsson 和 Linus Källberg 的“快速计算紧密拟合的边界框”中进行了描述(FastOBBs.pdf)。它包括以下步骤:

        从点集创建最优OBB,为了从一组点创建最佳OBB,使用了与上述相同的算法,但在逻辑上进行了一些简化并增加了计算时间。对于最佳OBB,有必要检查所有可能由极值点创建的轴。由于极值点仅对初始轴有效,因此有必要在每个轴上投影整个点集。这种方法通常提供更紧密的OBB,但性能较低。该算法的复杂度仍然是线性的,并且对于点集使用BVH,它是O(N+C*log(N))。以下是使用125K个节点集合的模型的最佳和非最佳OBB的示例:

        在这种情况下,计算非最佳OBB需要0.007秒,最佳-0.1秒,大约慢了14倍。这样的性能与通过PCA方法(见下文)为该形状创建OBB相当,该方法耗时约0.17秒。

        最佳OBB的计算由与PCA算法相同的BRpBndLib::AddOBB方法中的IsOptimal标志控制。这些算法在Bnd_OBB::ReBuild(…)方法中实现。

         基于惯性轴的OBB创建,该算法包含以下步骤:计算三个惯性轴,它们将成为OBB的轴。基于项目1中的轴,将源对象*(TopoDS_Shape)*转换为本地坐标系。为项目2中获得的形状创建AABB。计算AABB的中心及其半尺寸。将中心变换为WCS。使用中心尺寸、轴尺寸和半尺寸创建OBB。

        点的方法IsOut,将点投影到每个轴。检查投影参数的绝对值是否大于对应的半尺寸。在这种情况下,IsOut方法将返回TRUE。

        另一个OBB的方法IsOut:根据“定向有界盒的分离轴定理”,有必要检查15个分离轴:盒的6个轴和9个轴是它们的叉积。分析轴l的算法如下:

        为点或其他边界框添加方法基于源点和给定边界框的所有顶点创建新的OBB

7.2、增加图形

         BRepBndLib::AddOBB(...) 方法允许从复杂对象(TopoDS_Shape)创建边界框。此方法同时使用了从点集创建OBB和基于惯性轴创建OBB两节中描述的算法。

        如果形状的外壳可以由其包含的一组点来表示,将使用第一种算法。即,以下元素是点集的来源:三角剖分的节点;Poly_Polygon3D的节点;位于平面面上的线性3D曲线的边顶点;如果源形状不包含更复杂的拓扑结构(例如,源形状是边的复合体),则线性3D曲线边的顶点;
如果源形状不包含更复杂的拓扑结构(例如,源形状是顶点的复合体),则为顶点。
        如果无法提取所需的点集,则使用基于惯性轴创建OBB一节中描述的算法来创建OBB。BRepBndLib包包含BRepBndLib::Add(...),BRepBndLib::AddClose(...)和RepBndLib::AddOptimal(...)方法,用于创建形状的AABB。

7.3、OBB算法的局限性

        从点集创建OBB一节中描述的算法比基于惯性轴创建OBB一节中的算法工作得更好(找到表面积较小的结果OBB)并且更快。然而,(一般来说)两种算法返回的结果并不总是最优的(即有时存在表面积较小的另一个OBB)。此外,第一种方法不允许计算具有复杂几何形状的OBB。目前,OBB创建算法仅在3D空间中针对对象实现。

CSDNOpen CASCADE Technology: Modeling Data

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值