Open CASCADE学习|读取点集拟合样条曲线(续)
问题
上一篇文章已经实现了样条曲线拟合,但是仍存在问题,Tolerance过大拟合成直线了,Tolerance过大头尾波浪形。

正确改进方案
1️⃣ 核心参数优化
通过调整以下参数控制曲线平滑度:
Standard_Integer DegMin = 3; // 最低阶数(建议≥3)
Standard_Integer DegMax = 5; // 最高阶数(过高易过拟合)
Standard_Real Tolerance = 1e-3; // 容差(需根据点集坐标范围调整)
GeomAbs_Shape Continuity = GeomAbs_C2; // 连续性(C2更平滑)
2️⃣ 构造拟合器时直接指定参数
// 使用构造函数直接传递参数(正确方法)
Geom2dAPI_PointsToBSpline approximator(pointsArray, // 点集DegMin, // 最小阶数DegMax, // 最大阶数Continuity, // 连续性Tolerance // 容差
);
3️⃣ 抑制波浪形的替代方法
-
增大容差 (
Tolerance)
逐步增加Tolerance值,允许曲线偏离原始点,强制忽略高频波动(头尾噪声)。例如,若点集分布在 [0, 100] 范围内,可将Tolerance设为点集总范围的 2-5%(如 2.0~5.0)。 -
提高连续性 (
Continuity)
使用GeomAbs_C2连续性(二阶连续),强制曲线在连接处更平滑,抑制局部抖动。 -
限制曲线阶数 (
DegMax)
将DegMax设为较低值(如 5),避免高阶曲线过度拟合噪声。
分段控制替代方案
若需隐式控制分段数,可通过以下方法间接实现:
// 通过容差和连续性间接影响分段数
approximator.Init(pointsArray, DegMin, DegMax, Continuity, Tolerance);
// 注:Init() 方法允许重新初始化参数
数据预处理(关键步骤)
对波动较大的头尾数据进行滤波处理:
#include <algorithm>
#include <vector>// 滑动平均滤波函数(窗口大小=3)
std::vector<gp_Pnt2d> SmoothPoints(const std::vector<gp_Pnt2d>& input, int windowSize = 3) {std::vector<gp_Pnt2d> output;for (size_t i = 0; i < input.size(); ++i) {double sumX = 0.0, sumY = 0.0;int count = 0;int start = std::max(0, (int)i - windowSize/2);int end = std::min((int)input.size()-1, (int)i + windowSize/2);for (int j = start; j <= end; ++j) {sumX += input[j].X();sumY += input[j].Y();count++;}output.emplace_back(sumX/count, sumY/count);}return output;
}// 使用平滑后的点集
std::vector<gp_Pnt2d> smoothPoints = SmoothPoints(pointsVec, 3);
完整代码修正
#include <Geom2dAPI_PointsToBSpline.hxx>
#include <TColgp_Array1OfPnt2d.hxx>Handle(Geom2d_BSplineCurve) FitCurve2D(const std::vector<gp_Pnt2d>& pointsVec) {if (pointsVec.size() < 2) return nullptr;// 转换为OpenCASCADE数组(索引从1开始)TColgp_Array1OfPnt2d pointsArray(1, pointsVec.size());for (int i = 0; i < pointsVec.size(); ++i) {pointsArray.SetValue(i + 1, pointsVec[i]);}// 设置拟合参数Standard_Integer DegMin = 3;Standard_Integer DegMax = 5;Standard_Real Tolerance = 2.0; // 根据点集范围调整GeomAbs_Shape Continuity = GeomAbs_C2;// 创建拟合器Geom2dAPI_PointsToBSpline approximator(pointsArray, DegMin, DegMax, Continuity, Tolerance);if (approximator.IsDone()) {return approximator.Curve();}return nullptr;
}
参数调整建议
| 现象 | 解决方案 | 参数调整方向 |
|---|---|---|
| 头尾波浪形严重 | 增大容差,降低曲线自由度 | Tolerance ↑, DegMax ↓ |
| 曲线过于僵硬 | 减小容差,允许更多细节 | Tolerance ↓, DegMax ↑ |
| 连接处不光滑 | 提高连续性要求 | Continuity → GeomAbs_C2 |
验证方法
- 可视化检查:将拟合曲线与原始点绘制在同一坐标系,观察趋势是否符合。
- 误差分析:计算曲线到点的最大偏差:
Standard_Real maxError = approximator.MaxError(); std::cout << "Max fitting error: " << maxError << std::endl; - 参数迭代:若误差远小于
Tolerance,说明容差设置过大,可适当减小。
调整前的结果:

调整后的结果:

通过以上方法,有效抑制头尾波浪形,使曲线贴合整体趋势。
相关文章:
Open CASCADE学习|读取点集拟合样条曲线(续)
问题 上一篇文章已经实现了样条曲线拟合,但是仍存在问题,Tolerance过大拟合成直线了,Tolerance过大头尾波浪形。 正确改进方案 1️⃣ 核心参数优化 通过调整以下参数控制曲线平滑度: Standard_Integer DegMin 3; // 最低阶…...
ARM Cortex-M用于控制中断和异常处理的寄存器:BASEPRI、PRIMASK 和 FAULTMASK
在ARM Cortex-M处理器中,BASEPRI、PRIMASK 和 FAULTMASK 是用于控制中断和异常处理的系统级寄存器。它们的主要区别在于作用范围和灵活性,以下是详细说明: 1. PRIMASK • 功能: 禁用除以下情况的异常和所有中断(Maska…...
Kafka 中的生产者分区策略
Kafka 中的 生产者分区策略 是决定消息如何分配到不同分区的机制。这个策略对 Kafka 的性能、负载均衡、消息顺序性等有重要影响。了解它对于高效地使用 Kafka 进行消息生产和消费至关重要。 让我们一起来看 Kafka 中 生产者的分区策略,它如何工作,以及…...
【Django】教程-11-ajax弹窗实现增删改查
【Django】教程-1-安装创建项目目录结构介绍 【Django】教程-2-前端-目录结构介绍 【Django】教程-3-数据库相关介绍 【Django】教程-4-一个增删改查的Demo 【Django】教程-5-ModelForm增删改查规则校验【正则钩子函数】 【Django】教程-6-搜索框-条件查询前后端 【Django】教程…...
结构化需求分析:专业方法论与实践
结构化需求分析是一种用于软件开发或其他项目中的系统分析方法,旨在全面、准确地理解和描述用户对系统的需求。以下是关于结构化需求分析的详细介绍: 一、概念 结构化需求分析是采用自顶向下、逐步分解的方式,将复杂的系统需求分解为若干个…...
R语言:气象水文领域的数据分析与绘图利器
R 语言是一门由统计学家开发的用于统计计算和作图的语言(a Statistic Language developed for Statistic by Statistician),由 S 语言发展而来,以统计分析功能见长。R 软件是一款集成 了数据操作、统计和可视化功能的优秀的开源软…...
Kotlin与HttpClient编写视频爬虫
想用Apache HttpClient库和Kotlin语言写一个视频爬虫。首先,我需要确定用户的具体需求。视频爬虫通常涉及发送HTTP请求,解析网页内容,提取视频链接,然后下载视频。可能需要处理不同的网站结构,甚至可能需要处理动态加载…...
图形化编程语言:低代码赛道的技术革命与范式突破
在 2024 年 Gartner 低代码平台魔力象限报告中,传统低代码厂商市场份额增速放缓至 12%,而图形化编程语言赛道融资额同比激增 370%。本文深度剖析低代码平台的技术瓶颈,系统阐释图形化编程语言的核心优势,揭示其如何重构软件开发范…...
蓝桥杯每日刷题c++
目录 P9240 [蓝桥杯 2023 省 B] 冶炼金属 - 洛谷 (luogu.com.cn) P8748 [蓝桥杯 2021 省 B] 时间显示 - 洛谷 (luogu.com.cn) P10900 [蓝桥杯 2024 省 C] 数字诗意 - 洛谷 (luogu.com.cn) P10424 [蓝桥杯 2024 省 B] 好数 - 洛谷 (luogu.com.cn) P8754 [蓝桥杯 2021 省 AB2…...
快速上手示例(以BEVFormer为例)
快速上手示例(以BEVFormer为例) 安装依赖: bash git clone https://github.com/fundamentalvision/BEVFormer.git cd BEVFormer pip install -r requirements.txt下载预训练模型: wget https://github.com/fundament…...
GitHub 上开源一个小项目的完整指南
GitHub 上开源一个小项目的完整指南 🚀 第一步:准备你的项目 在开源之前,确保项目是可用且有一定结构的: ✅ 最低要求 项目文件清晰、结构合理(比如:src/、README.md、LICENSE)项目能在本地正…...
当实体类中的属性名和表中的字段名不一样 ,怎么办
在不同的持久化框架中,当实体类中的属性名和表中的字段名不一致时,有不同的解决办法,下面为你详细介绍: 1. MyBatis MyBatis 是一个流行的持久层框架,有两种主要方式来处理属性名和字段名不一致的情况。 方式一&…...
arthas之dump/classloader命令的使用
文章目录 1. dump2. classloader 1. dump 作用:将已加载类的字节码文件保存到特定目录:logs/arthas/classdump/ 参数 数名称参数说明class-pattern类名表达式匹配[c:]类所属 ClassLoader 的 hashcode[E]开启正则表达式匹配,默认为通配符匹…...
linux 使用 usermod 授权 普通用户 属组权限
之前写过这篇文章 linux 普通用户 使用 docker 只不过是使用 root 用户编辑 /etc/group用户所属组文件的方式 今天带来一种 usermod 命令行方式 以下3步,在root用户下操作 第一步,先创建一个普通用户测试使用 useradd miniuser第二步,授权到…...
大文件上传之断点续传实现方案与原理详解
一、实现原理 文件分块:将大文件切割为固定大小的块(如5MB) 进度记录:持久化存储已上传分块信息 续传能力:上传中断后根据记录继续上传未完成块 块校验机制:通过哈希值验证块完整性 合并策略:所…...
第一次3D打印,一个简单的小方块(Rhino)
一、建模 打开犀牛,我们选择立方体 我们点击上册的中心点 输入0,然后回车0 而后我们输长度:10,回车确认 同样的,宽度10 高度同样是10 回车确认后,我们得到一个正方形 二、导出模型 我们选择文件—>保存…...
java基础使用- 泛型
泛型 泛型作用泛型语法(1) 泛型类/接口(2) 泛型方法 类型参数命名习惯类型通配符(Wildcards)(1) 无界通配符 <?>表示“未知类型”(2) 上界通配符 <? extends T>表示“T 或 T 的子类”。(3) 下界通配符 <? super T>表示“T 或 T 的父…...
VMware-workstation-full-12.5.2 install OS X 10.11.1(15B42).cdr
手把手虚拟机安装苹果操作系统 VMware_workstation_full_12.5.2 unlocker208 Apple Max OS X(M)-CSDN博客 vcpu-0:VERIFY vmcore/vmm/main/physMem_monitor.c:1180 FILE: FileCreateDirectoryRetry: Non-retriable error encountered (C:\ProgramData\VMware): Cann…...
5分钟上手GitHub Copilot:AI编程助手实战指南
引言 近年来,AI编程工具逐渐成为开发者提升效率的利器。GitHub Copilot作为由GitHub和OpenAI联合推出的智能代码补全工具,能够根据上下文自动生成代码片段。本文将手把手教你如何快速安装、配置Copilot,并通过实际案例展示其强大功能。 一、…...
deepseek使用记录26——从体力异化到脑力异化
我们的一切发现和进步,似乎结果是使物质力量具有理智生命,而人的生命则化为愚钝的物质力量。AI快速发展的现实中,人面临着比工业革命更深刻的异化。在工业革命中,人的身躯沦为了机器的一部分,而现在人的脑袋沦为了AI的…...
数字身份DID协议:如何用Solidity编写去中心化身份合约
本文提出基于以太坊的自主主权身份(SSI)实现方案,通过扩展ERC-734/ERC-735标准构建链上身份核心合约,支持可验证声明、多密钥轮换、属性隐私保护等特性。设计的三层架构体系将身份控制逻辑与数据存储分离,在测试网环境…...
【Git “ls-tree“ 命令详解】
本章目录: 1. 命令简介2. 命令的基本语法和用法基本语法常见使用场景示例 1:查看当前提交的文件树示例 2:查看某个分支的文件树示例 3:查看特定路径下的文件树 3. 命令的常用选项及参数常用选项: 4. 命令的执行示例示例 1…...
[ctfshow web入门] web16
信息收集 提示:对于测试用的探针,使用完毕后要及时删除,可能会造成信息泄露 试试url/phpinfo.php url/phpsysinfo.php url/tz.php tz.php能用 点击phpinfo,查看phpinfo信息,搜索flag,发现flag被保存为变量…...
全面支持MCP协议,开启便捷连接之旅,MaxKB知识库问答系统v1.10.3 LTS版本发布
2025年4月7日,MaxKB开源知识库问答系统正式发布v1.10.3 LTS版本。 在MaxKB v1.10.3 LTS版本中,应用方面,MaxKB新增支持MCP调用节点,AI对话节点新增MCP工具调用功能,支持设置MCP服务配置;函数库方面&#x…...
ES:geoip_databases
目录 如何查看 .geoip_databases 的内容1. 查看 .geoip_databases 的内容2. 查看GeoIP数据库的统计信息3. 使用GeoIP处理器4. 管理GeoIP数据库更新 如何查看 .geoip_databases 的内容 在Elasticsearch中,.geoip_databases 是一个特殊的索引,用于存储Geo…...
VTK知识学习(51)- 交互与Widget(二)
1、交互器样式 前面所讲的观察者/命令模式是 VTK实现交互的方式之一。在前面示例 所示的窗口中可以使用鼠标与柱体进行交互,比如用鼠标滚轮可以对柱体放大、缩小;按下鼠标左键不放,然后移动鼠标,可以转动柱体;按下鼠标左键,同时按…...
底盘---麦克纳姆轮(Mecanum Wheel)
一、基本定义与起源 定义:麦克纳姆轮是一种实现全向移动的特殊轮式结构,通过在主轮周边安装多个倾斜的辊子(小轮),使设备能够在平面上向任意方向移动(包括横向、斜向、旋转等),无需…...
深入源码级别看spring bean创建过程
我们通常聊到spring bean的生命周期,大多是从网上找帖子背些基本概念,这样我们学到的东西是不够直观清晰的,这篇文章我就试着从源码级别来讲清楚bean的创建过程。 一、准备demo代码 我们既然要深入源码来看bean的创建过程,那么就…...
I/O进程1
day1 一、标准IO 1.概念 在C库中定义的一组用于输入输出的函数 2.特点 (1).通过缓冲机制减少系统调用,提高效率 (2.)围绕流进行操作,流用FILE *来描述(3).标准IO默认打开了三个流,stdin(标准输入)、stdout(…...
int 与 Integer 的区别详解
1. 本质区别 特性intInteger类型基本数据类型(Primitive)包装类(Wrapper Class)存储位置栈(或作为对象成员在堆中)堆(对象实例)默认值0null(可能导致 NullPointerExcept…...
