opencascade Adaptor3d_Curve原始碼學習

一点灯發表於2024-09-20

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中如何用於適配不同型別的三維曲線,以便在幾何演算法中統一處理它們。這種介面卡模式使得原本可能由於介面不相容而無法一起工作的類能夠協同工作。

參考
參考

相關文章