Open CASCADE学习|分割曲线

1、通过参数进行分割

分别获得曲线的 FirstParameter 和 LastParameter ,然后对参数进行分割,获得n个ui,并对每个ui调用D0(获得这个点的坐标值)或D1(获得这个点的坐标值和切向量)。这个方法的优点是,简单易行,好操作,缺点均分参数轴获得的曲线的分割可能不是均匀的。

cpp 复制代码
#include <Geom_CylindricalSurface.hxx>
#include <gp_Ax3.hxx>
#include <GeomAPI_Interpolate.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <Geom2d_TrimmedCurve.hxx>
#include <GCE2d_MakeSegment.hxx>
​
#include <GeomAPI_PointsToBSpline.hxx>
#include <BRepBuilderAPI_MakeFace.hxx>
#include <GC_MakeCircle.hxx>
#include <BRepBuilderAPI_MakeWire.hxx>
#include <BRepOffsetAPI_MakePipe.hxx>
#include <GC_MakeArcOfCircle.hxx>
#include <BRepAlgoAPI_Fuse.hxx>
​
#include <gp_GTrsf.hxx>
#include <BRepBuilderAPI_Transform.hxx>
​
#include"Viewer.h"
​
​
#include <BRepBuilderAPI_MakeVertex.hxx>
#include <BRepBuilderAPI_GTransform.hxx>
​
​
int main(int argc, char* argv[])
{
    gp_Dir  Z(0.0, 0.0, 1.0);
    gp_Pnt center(0, 0, 0.0);
    gp_Pnt xr(0.5, 0, 0.0);
    gp_Pnt yr(0.0, 1.0, 0.0);
    gp_Pnt zr(0.0, 0.0, 7.0);
    gp_Ax2  wb(center, Z);
    gp_Circ  wbcircle(wb, 0.125 / 2);
    TopoDS_Edge wbe = BRepBuilderAPI_MakeEdge(wbcircle);
    TopoDS_Edge xline = BRepBuilderAPI_MakeEdge(center, xr);
    TopoDS_Edge yline = BRepBuilderAPI_MakeEdge(center, yr);
    TopoDS_Edge zline = BRepBuilderAPI_MakeEdge(center, zr);
    gp_Pnt p1(-5, 0, 0.0);
    gp_Pnt p2(5, 0, 0.0);
    gp_Ax2  sr(center, Z);
    gp_Circ  bcircle(sr, 5);
    Handle(Geom_TrimmedCurve) bc = GC_MakeArcOfCircle(bcircle, p1, p2, 0);
    TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge(bc);
    Standard_Integer splitN = 10;
    Standard_Real firstParam = bc->FirstParameter();
    Standard_Real lastParam = bc->LastParameter();
    Viewer vout(50, 50, 500, 500);
    for (Standard_Integer i = 0; i < splitN + 1; ++i)
    {
        Standard_Real ui = i * (lastParam - firstParam) / splitN;
        gp_Pnt pi;
        gp_Vec veci;
        bc->D1(ui, pi, veci);
        TopoDS_Vertex verti = BRepBuilderAPI_MakeVertex(pi);
        vout << verti;
    }
    vout << anEdge;
    vout << xline;
    vout << yline;
    vout << zline;
    vout.StartMessageLoop();
    return 0;
}
​

2、直接对曲线分割

通过类 GCPnts_UniformAbscissa 实现对一个Geom_Curve对象的平均分割,获得分割点的坐标及对应的参数,将坐标和参数存入一个列表中,供其他操作使用。

cpp 复制代码
#include <Geom_CylindricalSurface.hxx>
#include <gp_Ax3.hxx>
#include <GeomAPI_Interpolate.hxx>
#include <BRepAdaptor_Curve.hxx>
#include <BRepBuilderAPI_MakeEdge.hxx>
#include <Geom2d_TrimmedCurve.hxx>
#include <GCE2d_MakeSegment.hxx>
​
#include <GeomAPI_PointsToBSpline.hxx>
#include <BRepBuilderAPI_MakeFace.hxx>
#include <GC_MakeCircle.hxx>
#include <BRepBuilderAPI_MakeWire.hxx>
#include <BRepOffsetAPI_MakePipe.hxx>
#include <GC_MakeArcOfCircle.hxx>
#include <BRepAlgoAPI_Fuse.hxx>
​
#include <gp_GTrsf.hxx>
#include <BRepBuilderAPI_Transform.hxx>
​
#include"Viewer.h"
​
​
#include <BRepBuilderAPI_MakeVertex.hxx>
#include <GCPnts_UniformAbscissa.hxx>
​
​
int main(int argc, char* argv[])
{
    gp_Dir  Z(0.0, 0.0, 1.0);
    gp_Pnt center(0, 0, 0.0);
    gp_Pnt xr(0.5, 0, 0.0);
    gp_Pnt yr(0.0, 1.0, 0.0);
    gp_Pnt zr(0.0, 0.0, 7.0);
    gp_Ax2  wb(center, Z);
    gp_Circ  wbcircle(wb, 0.125 / 2);
    TopoDS_Edge wbe = BRepBuilderAPI_MakeEdge(wbcircle);
    TopoDS_Edge xline = BRepBuilderAPI_MakeEdge(center, xr);
    TopoDS_Edge yline = BRepBuilderAPI_MakeEdge(center, yr);
    TopoDS_Edge zline = BRepBuilderAPI_MakeEdge(center, zr);
    gp_Pnt p1(-5, 0, 0.0);
    gp_Pnt p2(5, 0, 0.0);
    gp_Ax2  sr(center, Z);
    gp_Circ  bcircle(sr, 5);
    Handle(Geom_TrimmedCurve) bc = GC_MakeArcOfCircle(bcircle, p1, p2, 0);
    TopoDS_Edge anEdge = BRepBuilderAPI_MakeEdge(bc);
    Standard_Integer splitN = 10;
    GeomAdaptor_Curve GAC(bc);
    GCPnts_UniformAbscissa UA(GAC, splitN + 1);
    gp_Pnt* pnts = new gp_Pnt[splitN + 1];
    Standard_Real* params = new Standard_Real[splitN + 1];
    Viewer vout(50, 50, 500, 500);
    if (UA.IsDone())
    {
        Standard_Real n = UA.NbPoints();
        Standard_Integer index = 0;
        for (; index < n + 1; index++)
        {
            Standard_Real parami = UA.Parameter(index + 1);
            params[index] = parami;
            gp_Pnt tpnt;
            bc->D0(parami, tpnt);
            pnts[index] = tpnt;
            TopoDS_Vertex verti = BRepBuilderAPI_MakeVertex(tpnt);
            vout << verti;
        }
    }
    vout << anEdge;
    vout << xline;
    vout << yline;
    vout << zline;
    vout.StartMessageLoop();
    return 0;
}
​
相关推荐
naruto_lnq5 分钟前
C++中的工厂方法模式
开发语言·c++·算法
一切尽在,你来6 分钟前
C++多线程教程-1.2.3 C++并发编程的平台无关性
开发语言·c++
墨黎芜17 分钟前
SQL Server从入门到精通——C#与数据库
数据库·学习·信息可视化
wdfk_prog26 分钟前
[Linux]学习笔记系列 -- [drivers][dma]stm32-dma
linux·笔记·学习
暖阳之下29 分钟前
学习周报三十三
学习
写点什么呢37 分钟前
Ltspice_安装与使用
学习·测试工具
CappuccinoRose41 分钟前
CSS前端布局总指南
前端·css·学习·布局·flex布局·grid布局·float布局
郝学胜-神的一滴41 分钟前
深入解析Linux网络编程之bind函数:从基础到实践的艺术
linux·服务器·网络·c++·websocket·程序人生
mango_mangojuice44 分钟前
Linux学习笔记(角色,权限管理)1.21
linux·笔记·学习
雾岛听蓝1 小时前
C++11 列表初始化与右值引用核心解析
开发语言·c++·经验分享