opencascade Adaptor3d_Curve源码学习

opencascade Adaptor3d_Curve

前言

用于几何算法工作的3D曲线的根类。
适配曲线是曲线提供的服务与使用该曲线的算法所需服务之间的接口。
提供了两个派生具体类:

  • GeomAdaptor_Curve,用于Geom包中的曲线
  • Adaptor3d_CurveOnSurface,用于Geom包中表面上的曲线。
    用于评估BSpline曲线的多项式系数会被缓存以提高性能。
    因此,这些评估不是线程安全的,需要防止并行评估。

方法

1

适配器的浅拷贝
Standard_EXPORT virtual Handle(Adaptor3d_Curve) ShallowCopy() const;

2

返回曲线的第一个参数
Standard_EXPORT virtual Standard_Real FirstParameter() const;

3

返回曲线的最后一个参数
Standard_EXPORT virtual Standard_Real LastParameter() const;

4

返回曲线的连续性类型
Standard_EXPORT virtual GeomAbs_Shape Continuity() const;

5

返回连续性为的区间数量
如果Continuity(me) >= ,则可能只有一个区间
Standard_EXPORT virtual Standard_Integer NbIntervals(const GeomAbs_Shape S) const;

6

将连续性为的区间的边界参数存储在
数组必须提供足够的空间来存储这些参数,即T.Length() > NbIntervals()
Standard_EXPORT virtual void Intervals(TColStd_Array1OfReal& T, const GeomAbs_Shape S) const;

7

返回参数在之间的曲线等效物
用于测试三维点的混淆
如果 >= ,则行为未定义
Standard_EXPORT virtual Handle(Adaptor3d_Curve) Trim(const Standard_Real First, const Standard_Real Last, const Standard_Real Tol) const;

8

判断曲线是否闭合
Standard_EXPORT virtual Standard_Boolean IsClosed() const;

9

判断曲线是否周期性
Standard_EXPORT virtual Standard_Boolean IsPeriodic() const;

10

返回曲线的周期(如果曲线是周期性的)
Standard_EXPORT virtual Standard_Real Period() const;

11

计算参数U在曲线上的点
Standard_EXPORT virtual gp_Pnt Value(const Standard_Real U) const;

12

计算参数U在曲线上的点(与D0相同)
Standard_EXPORT virtual void D0(const Standard_Real U, gp_Pnt& P) const;

13

计算参数U在曲线上的点及其一阶导数
如果当前区间的连续性不是C1,则抛出异常
Standard_EXPORT virtual void D1(const Standard_Real U, gp_Pnt& P, gp_Vec& V) const;

14

返回参数U的点P及其一阶和二阶导数
如果当前区间的连续性不是C2,则抛出异常
Standard_EXPORT virtual void D2(const Standard_Real U, gp_Pnt& P, gp_Vec& V1, gp_Vec& V2) const;

15

返回参数U的点P及其一阶、二阶和三阶导数
如果当前区间的连续性不是C3,则抛出异常
Standard_EXPORT virtual void D3(const Standard_Real U, gp_Pnt& P, gp_Vec& V1, gp_Vec& V2, gp_Vec& V3) const;

16

返回参数U的N阶导数的值 如果当前区间的连续性不是CN,或者N<1,则抛出异常
Standard_EXPORT virtual gp_Vec DN(const Standard_Real U, const Standard_Integer N) const;

17

返回与三维空间分辨率对应的参数分辨率
Standard_EXPORT virtual Standard_Real Resolution(const Standard_Real R3d) const;

18

返回当前区间内曲线的类型:直线、圆、椭圆、双曲线、抛物线、贝塞尔曲线、B样条曲线、其他曲线
Standard_EXPORT virtual GeomAbs_CurveType GetType() const;

例子

用于离散点

 double _startU = inStartU, _EndU = inEndU;
    Topods_wire inLine;
    Adaptor3d_Curve Crv;
    if (inLine.ShapeType() == TopAbs_WIRE)
    {
        BRepAdaptor_CompCurve cmpCurve_(TopoDS::Wire(inLine);
        Crv = cmpCurve_;
    }
    else if (inLine.ShapeType() == TopAbs_EDGE)
    {
        BRepAdaptor_Curve cmpCurve_(TopoDS::Edge(inLine));
        Crv = cmpCurve_;
    }
    if (_startU < TOL)
        _startU = Crv.FirstParameter();
    if (_EndU < TOL)
        _EndU = Crv.LastParameter();
    //离散点
    GCPnts_UniformAbscissa uniAbs_(Crv, inquantity, _startU, _EndU, -1);

其他

在OpenCASCADE中,Adaptor3d_Curve是一个基类,它用于适配三维曲线,以便在几何算法中使用。不过,需要注意的是,Adaptor3d_Curve本身是一个抽象基类,通常不会直接实例化使用,而是通过其子类如GeomAdaptor_Curve或BRepAdaptor_Curve等来实现具体功能。以下是一个使用GeomAdaptor_Curve和BRepAdaptor_Curve的示例,这些类都是Adaptor3d_Curve的子类,用于适配不同类型的曲线。

示例1:使用GeomAdaptor_Curve适配Geom_Circle
cpp

#include <gp_Circ.hxx>  
#include <Geom_Circle.hxx>  
#include <GeomAdaptor_Curve.hxx>  
#include <GCPnts_AbscissaPoint.hxx>  
  
int main() {  
    // 创建一个圆形几何对象  
    Handle_Geom_Curve aCircle = new Geom_Circle(gp::XOY(), 1.0);  
  
    // 使用GeomAdaptor_Curve适配圆形几何对象  
    GeomAdaptor_Curve aCircleAdaptor(aCircle);  
  
    // 计算并输出圆形的周长(假设使用的是圆的周长计算方法,此处仅作为示例)  
    // 注意:GCPnts_AbscissaPoint::Length通常用于计算曲线长度,但此处为简化说明  
    Standard_Real dCircleLength = GCPnts_AbscissaPoint::Length(aCircleAdaptor);  
    std::cout << "Circle length: " << dCircleLength << std::endl;  
  
    return 0;  
}

注意:GCPnts_AbscissaPoint::Length方法确实可以用于计算曲线长度,但在这个例子中,为了简化,我们直接用它来表示对曲线长度的某种处理。实际上,圆的周长可以通过直接计算(即2 * PI * 半径)得到,而无需使用曲线长度计算方法。

示例2:使用BRepAdaptor_Curve适配TopoDS_Edge
cpp

#include <gp_Circ.hxx>  
#include <Geom_Circle.hxx>  
#include <TopoDS_Edge.hxx>  
#include <BRepBuilderAPI_MakeEdge.hxx>  
#include <BRepAdaptor_Curve.hxx>  
#include <GCPnts_AbscissaPoint.hxx>  
  
int main() {  
    // 创建一个圆形边缘  
    TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge(gp_Circ(gp::XOY(), 1.0));  
  
    // 使用BRepAdaptor_Curve适配边缘  
    BRepAdaptor_Curve anEdgeAdaptor(anEdge);  
  
    // 计算并输出边缘的长度  
    Standard_Real dEdgeLength = GCPnts_AbscissaPoint::Length(anEdgeAdaptor);  
    std::cout << "Edge length: " << dEdgeLength << std::endl;  
  
    return 0;  
}

在这个示例中,我们首先创建了一个表示圆形的TopoDS_Edge对象,然后使用BRepAdaptor_Curve对其进行适配,以便能够使用曲线相关的算法(如计算长度)来处理它。

通过这两个示例,可以看到Adaptor3d_Curve及其子类在OpenCASCADE中如何用于适配不同类型的三维曲线,以便在几何算法中统一处理它们。这种适配器模式使得原本可能由于接口不兼容而无法一起工作的类能够协同工作。

参考
参考