美文网首页Opencascade
曲线离散化之GCPnts包解析

曲线离散化之GCPnts包解析

作者: yumxuanyi | 来源:发表于2020-09-18 10:35 被阅读0次

    @版权声明:本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出,
    本文链接https://www.jianshu.com/p/92ede833b8bc
    如有问题, 可邮件(yumxuanyi@qq.com)咨询。


    关键字:OpenCASCADE、OpenGL、曲线离散化、GCPnts

    一、概要

    计算机图形学中绘制曲线,无论是绘制参数曲线还是非参数曲线,都需要先将参数曲线进行离散化,通过离散化得到一组离散化的点集,然后再将点集发送给图形渲染管线进行处理,最终生成我们想要的曲线。

    OpenCASCADE中提供了GCPnts包。利用GCPnts包中提供的类,我们可以很方便的将三维曲线进行离散化。

    二、GCPnts包中各种类说明

    1. GCPnts_AbscissaPoint 弧长点算法

    a. 可以用来计算曲线长度。
    b. 用来计算曲线上与给定参数位置间隔一定弧长的位置点。

    其中b很有用,后面均匀弧长算法内部就用到了
    通过函数积分来计算曲线弧长
    math_GaussSingleIntegration: 该类实现了对只有一个自变量的函数求积分

    2. GCPnts_QuasiUniformAbscissa 准均匀弧长分布算法

    功能:计算的曲线上的一组离散点,这些点按弧长均匀分布
    说明: 该方法需要指定一个期望的离散点的个数。
    算法:每两个连续的离散点之间的弧长相等。
    事例代码:

      //GCPnts_QuasiUniformAbscissa 准均匀弧长分布算法  也就是等弧长分布
      // 计算一组按弧长均匀分布的离散点   
      // 可以根据指定的弧长 或者指定的多少个点
      //Abscissa is the curvilinear distance between  two consecutive points of the distribution 
      //Abscissa 表示连续的两个分布点之间的弧长 
      //算法 两点之间的弧长等于的弧长  
      GCPnts_QuasiUniformAbscissa  QUATooler;
    
      //curveLength 可以由GCPnts_AbscissaPoint求得这里取曲线总长的两倍  
      Standard_Integer  needPointsCount = curveLength * 2.0;  //表示期望的点数量
    
      QUATooler.Initialize(adaptorCurve, needPointsCount);//取两倍曲线长度的点 也就是0.5mm弧长一个点
    
      Standard_Integer pointsCount = QUATooler.NbPoints();
      TColgp_SequenceOfPnt SeqP; 
      for (int i = 1; i <= pointsCount; i++) 
      {    
        SeqP.Append(adaptorCurve.Value(QUATooler.Parameter(i)));
      }
    
    

    注:半径50圆 GCPnts_QuasiUniformAbscissa计算的点有628个。

    3. GCPnts_UniformAbscissa 均匀弧长分布算法

    功能:同方法GCPnts_QuasiUniformAbscissa,用于计算的曲线上的一组离散点,这些点按弧长均匀分布。
    但是提供两种方式: a. 指定期望点的个数 b. 指定弧长。
    事例代码:

    GCPnts_UniformAbscissa UATooler;  
    //a 指定期望点的个数  
    //同GCPnts_QuasiUniformAbscissa 这里不举例  
    //UATooler.Initialize(adaptorCurve, needPointsCount);  
    //b 指定弧长   
     Standard_Real abscissa = 10;//弧长10mm
     UATooler.Initialize(adaptorCurve, abscissa);  
     Standard_Integer pntCount = UATooler.NbPoints();  TColgp_SequenceOfPnt SeqP; 
     for (int i = 1; i <= pntCount; i++) 
     {    
        SeqP.Append(adaptorCurve.Value(UATooler.Parameter(i))); 
     }
    

    注:半径50圆 弧长 0.5mm 计算的点有630个
    2 * 3.1415926 * 50 / 0.5 = 628.31852
    半径50圆 弧长 10mm 计算的点有33个
    2 * 3.1415926 * 50 / 10 = 31.415926

    4. GCPnts_QuasiUniformDeflection 准均匀偏差分布算法

    功能:计算的曲线上的一组离散点。
    算法说明:
    假定 Pi 和 Pj为 分布的两连续的离散点 ,它们的参数为ui和uj。
    计算偏差deflection :Pi和Pj连线(弦长)的中点和曲线上中间参数 [(ui+uj) / 2 ] 位置点之间的距离。
    则两连续的离散点的计算偏差deflection必须小于给定的偏差Deflection值。
    事例代码:

    GCPnts_QuasiUniformDeflection QUDTooler;  
    QUDTooler.Initialize(adaptorCurve, 1.e-5);//这里我们要求 deflection <= 1.e-5  
    Standard_Integer pointsLength = QUDTooler.NbPoints();  TColgp_SequenceOfPnt SeqP;  
    for (int i = 1; i <= pointsLength; i++) 
     {   
        SeqP.Append(QUDTooler.Value(i)); 
     }
    

    注:半径50圆 准均匀偏差分布算法计算的点有4969个。

    5. GCPnts_UniformDeflection 均匀偏差算法

    功能:用于计算C2连续的曲线上的一组离散点。
    该算法比较耗时。请使用GCPnts_QuasiUniformDeflection算法。
    GCPnts_QuasiUniformDeflection方法可以用于计算非C2连续的曲线。

    6. GCPnts_TangentialDeflection 切矢量偏离算法

    功能:计算的曲线上的一组离散点。
    算法原理:如果P1(u1)和 P2(u2) 曲线上两个连续的离散点。
    P3 表示曲线上中间参数 ((u1+u2)/2)点。
    则P3需要满足如下条件:
    条件1: ||P1P3^P3P2||/||P1P3||*||P3P2||<AngularDeflection
    偏转角度小于给定的角度AngularDeflection
    a * b = |a||b|cosθ 也就是 cosθ < AngularDeflection
    条件2 : ||P1P2^P1P3||/||P1P2||<CurvatureDeflection
    表示曲线切线 与 弦长夹角要小于 给定的曲线偏离率CurvatureDeflection
    |a|cosθ < CurvatureDeflection

    事例代码:

    GCPnts_TangentialDeflection  TDTooler;  //声明算法类
    Standard_Real AngularDeflection = 1 / M_PI_4;  //这里去角度偏差1 / M_PI_4
    Standard_Real CurvatureDeflection = 1.e-5;  //这里去曲率偏差 1.e-5
    TDTooler.Initialize(adaptorCurve, AngularDeflection, CurvatureDeflection); //算法初始化
    Standard_Integer PLength = TDTooler.NbPoints();  
    TColgp_SequenceOfPnt SeqP
     for (int i = 1; i <= PLength; i++)  
    {    
       SeqP.Append(TDTooler.Value(i));
     }
    

    注:半径50圆 使用切矢量偏离算法计算的点有4969个。

    相关文章

      网友评论

        本文标题:曲线离散化之GCPnts包解析

        本文链接:https://www.haomeiwen.com/subject/ucmdyktx.html