Open CASCADE之拟合Smooth curve

简介: Open CASCADE之拟合Smooth curve

Open CASCADE Technology


http://www.cppblog.com/eryar/ OCCT精品博客,eryar@163.com


https://www.cnblogs.com/opencascade/ 同上


B样条基函数——B-Spline Basis Functions ++ B样条曲线(B-spline Curves)


OpenCASCADE Trihedron Law


OpenCASCADE Interpolations and Approximations


Convert BSpline Curve to Arc Spline in OpenCASCADE


OPEN CASCADE BSpline Curve Interpolation


https://www.cnblogs.com/yaoyu126/p/6222934.html  OCCT的基础知识


OCCT提供了比较完备的 NURBS 曲线和曲面的功能。


image.png


从接口来说:


Geom_BSplineCurve


GeomAPI_Interpolate 类,实现了从一组点通过插值生成 Bspline 曲线的功能。


GeomAPI_PointsToBSpline 类,实现了从一组点通过逼近生成 Bspline 曲线的功能。


GeomAPI_PointsToBSplineSurface 类,实现了从一个二维点数组,通过逼近,生成对于 bSpline 曲面的功能

官方案例:


opencascade-7.4.0\samples\mfc\occtdemo\Offset2d\Offset2d_Presentation.cpp\void samplePBSpline()

https://blog.csdn.net/DaGeYong/article/details/81409973
OpenCasCade与NURBS——B样条曲线
TColgp_Array1OfPnt Poles(1,9);
    Poles.SetValue(1, gp_Pnt(0,-100,0));
    Poles.SetValue(2, gp_Pnt(0,-100,50));
    Poles.SetValue(3, gp_Pnt(0,-50,50));
    Poles.SetValue(4, gp_Pnt(0,0,50));
    Poles.SetValue(5, gp_Pnt(0,0,0));
    Poles.SetValue(6, gp_Pnt(0,0,-50));
    Poles.SetValue(7, gp_Pnt(0,50,-50));
    Poles.SetValue(8, gp_Pnt(0,100,-50));
    Poles.SetValue(9, gp_Pnt(0,100,0));
    TColStd_Array1OfReal PolesWeight(1,9);
    PolesWeight.SetValue(1, 1.0);
    PolesWeight.SetValue(2, 0.707);
    PolesWeight.SetValue(3, 1.0);
    PolesWeight.SetValue(4, 0.707);
    PolesWeight.SetValue(5, 1.0);
    PolesWeight.SetValue(6, 0.707);
    PolesWeight.SetValue(7, 1.0);
    PolesWeight.SetValue(8, 0.707);
    PolesWeight.SetValue(9, 1.0);
    for(int i=0; i<9; ++i)
    {
        TopoDS_Vertex aVertex = BRepBuilderAPI_MakeVertex(Poles.Value(i+1));
        Handle(AIS_Shape) vert = new AIS_Shape(aVertex);
        myAISContext->SetColor(vert,Quantity_NOC_WHITE,Standard_False); 
        myAISContext->Display(vert,Standard_False);
        if(i != 8)
        {
            TopoDS_Edge tedge = BRepBuilderAPI_MakeEdge(Poles.Value(i+1), Poles.Value(i+2));
            TopoDS_Wire twire= BRepBuilderAPI_MakeWire(tedge);
            Handle(AIS_Shape) awire = new AIS_Shape(twire);
            myAISContext->SetColor(awire,Quantity_NOC_WHITE,Standard_False); 
            myAISContext->Display(awire, Standard_False);
        }
        Fit();
    }
    Fit();
    Standard_Integer curtype = 4;
    if(curtype == 1)
    {
        /// 均匀B样条,节点向量中的节点值成等差排布
        /// 均匀B样条的基函数呈周期性,即所有的基函数有相同的形状
        /// 每个后续基函数仅仅市前面基函数在新位置上的重复
        Standard_Integer degree(2);
        Standard_Integer PNum = 9;
        Standard_Integer KNum = PNum + degree + 1;
        TColStd_Array1OfReal knots(1,KNum);
        for(int i=0; i<KNum; ++i)
        {
            knots.SetValue(i+1, i);
        }
        TColStd_Array1OfInteger mults(1,KNum);
        for(int i=0; i<KNum; ++i)
        {
            mults.SetValue(i+1, 1);
            std::cout << mults.Value(i+1) << std::endl;
        }
        Handle(Geom_BSplineCurve) curve = new Geom_BSplineCurve(Poles, knots, mults, degree);
        TopoDS_Edge ed1 = BRepBuilderAPI_MakeEdge(curve);
        TopoDS_Wire wr1 = BRepBuilderAPI_MakeWire(ed1);
        Handle(AIS_Shape) red = new AIS_Shape(wr1);
        myAISContext->SetColor(red,Quantity_NOC_RED,Standard_False); 
        myAISContext->Display(red,Standard_False);
        Fit();
    }
    else if(curtype == 2)
    {
        /// 准均匀B样条,节点向量中的节点值也是等差排布,但是起点和终点都有k-1的重复度,其中ke为曲线次数。
        Standard_Integer degree(2);
        Standard_Integer PNum = 9;
        Standard_Integer KNum = PNum-1;
        TColStd_Array1OfReal knots(1,KNum);
        for(int i=0; i<KNum; ++i)
        {
            knots.SetValue(i+1, i);
        }
        TColStd_Array1OfInteger mults(1,KNum);
        for(int i=0; i<KNum; ++i)
        {
            if(i == 0 || i == KNum-1)
            {
                mults.SetValue(i+1, degree+1);
            }
            else
            {
                mults.SetValue(i+1, 1);
            }
        }
        Handle(Geom_BSplineCurve) curve = new Geom_BSplineCurve(Poles, knots, mults, degree);
        TopoDS_Edge ed1 = BRepBuilderAPI_MakeEdge(curve);
        TopoDS_Wire wr1 = BRepBuilderAPI_MakeWire(ed1);
        Handle(AIS_Shape) red = new AIS_Shape(wr1);
        myAISContext->SetColor(red,Quantity_NOC_RED,Standard_False); 
        myAISContext->Display(red,Standard_False);
        Fit();
    }
    else if(curtype == 3)
    {
        /// 分段Bezier曲线
        Standard_Integer degree(2);
        Standard_Integer PNum = 9;
        Standard_Integer KNum = PNum - 4;
        TColStd_Array1OfReal knots(1,KNum);
        for(int i=0; i<KNum; ++i)
        {
            knots.SetValue(i+1, i);
        }
        TColStd_Array1OfInteger mults(1,KNum);
        for(int i=0; i<KNum; ++i)
        {
            if(i == 0 || i == KNum-1)
            {
                mults.SetValue(i+1, degree+1);
            }
            else
            {
                mults.SetValue(i+1, degree);
            }
        }
        Handle(Geom_BSplineCurve) curve = new Geom_BSplineCurve(Poles, knots, mults, degree);
        TopoDS_Edge ed1 = BRepBuilderAPI_MakeEdge(curve);
        TopoDS_Wire wr1 = BRepBuilderAPI_MakeWire(ed1);
        Handle(AIS_Shape) red = new AIS_Shape(wr1);
        myAISContext->SetColor(red,Quantity_NOC_RED,Standard_False); 
        myAISContext->Display(red,Standard_False);
        Fit();
    }
    else if(curtype == 4)
    {
        /// 有理B样条曲线
        Standard_Integer degree(2);
        Standard_Integer PNum = 9;
        Standard_Integer KNum = PNum - 1;
        TColStd_Array1OfReal knots(1,KNum);
        for(int i=0; i<KNum; ++i)
        {
            knots.SetValue(i+1, i);
        }
        TColStd_Array1OfInteger mults(1,KNum);
        for(int i=0; i<KNum; ++i)
        {
            if(i == 0 || i == KNum-1)
            {
                mults.SetValue(i+1, degree+1);
            }
            else
            {
                mults.SetValue(i+1, 1);
            }
        }
        Handle(Geom_BSplineCurve) curve = new Geom_BSplineCurve(Poles, PolesWeight, knots, mults, degree);
        TopoDS_Edge ed1 = BRepBuilderAPI_MakeEdge(curve);
        TopoDS_Wire wr1 = BRepBuilderAPI_MakeWire(ed1);
        Handle(AIS_Shape) red = new AIS_Shape(wr1);
        myAISContext->SetColor(red,Quantity_NOC_RED,Standard_False); 
        myAISContext->Display(red,Standard_False);
        Fit();
    }


https://github.com/xmba15/bezier_curve


https://github.com/oysteinmyrmo/bezier

相关文章
|
存储 安全 编译器
【C++ 17 新功能 std::visit 】深入解析 C++17 中的 std::visit:从原理到实践
【C++ 17 新功能 std::visit 】深入解析 C++17 中的 std::visit:从原理到实践
1076 1
|
XML 自然语言处理 数据格式
Qt国际化翻译解决方案
Qt国际化翻译解决方案
315 0
|
JavaScript 前端开发 应用服务中间件
【超详细!】vue+koa+nginx前后端分离开发项目上线部署到云服务器
1、项目介绍 本项目是vue+koa前后端分离开发的手机商城项目,先贴一下项目的目录,我们主要就是要部署dist和server这两个文件夹
1236 0
【超详细!】vue+koa+nginx前后端分离开发项目上线部署到云服务器
halcon算子模板匹配(一)基于形状的模板匹配
halcon算子模板匹配(一)基于形状的模板匹配
2748 0
|
存储 算法 索引
从点云重建表面 Surface Reconstruction from Point Clouds
从点云重建表面 Surface Reconstruction from Point Clouds
848 3
|
C++ 容器
vector容器-预留空间讲解
vector容器-预留空间讲解
312 0
|
存储 Cloud Native Linux
CMake学习之变量让message输出不同颜色
CMake学习之变量让message输出不同颜色
|
存储 机器学习/深度学习
FP32、FP16 和 INT8
FP32、FP16 和 INT8
1889 0
error: LNK2001: 无法解析的外部符号 “public: virtual struct QMetaObject const * __cdecl
error: LNK2001: 无法解析的外部符号 “public: virtual struct QMetaObject const * __cdecl
2151 0
如何让glog性能提高10倍
优化glog源码,性能提高10倍
8897 0