当前位置: 首页 > news >正文

C# | Chaikin算法 —— 计算折线对应的平滑曲线坐标点

在这里插入图片描述

Chaikin算法——计算折线对应的平滑曲线坐标点

本文将介绍一种计算折线对应的平滑曲线坐标点的算法。该算法使用Chaikin曲线平滑处理的方法,通过控制张力因子和迭代次数来调整曲线的平滑程度和精度。通过对原始点集合进行切割和插值操作,得到平滑的曲线坐标点集合。实验结果表明,该算法能够有效地平滑折线,并且具有较高的精度和可控性。

文章目录

  • Chaikin算法——计算折线对应的平滑曲线坐标点
    • 引言
    • 算法
      • 算法流程
      • Chaikin曲线平滑处理
    • 实验与结果
      • 测试1:验证不同迭代次数下的算法结果
      • 测试2:观察不同张力因子下的算法结果
    • 结论
    • 参考资料

引言

在计算机图形学和数据可视化领域,平滑曲线的生成是一个重要的问题。平滑曲线可以使得数据更加易于理解和分析,同时也可以提高图形的美观性。折线是一种常见的曲线表示方法,但是折线本身具有较高的噪声和锯齿状的特点,需要进行平滑处理。本文提出了一种基于Chaikin曲线平滑处理的算法,可以将折线转化为平滑的曲线。


算法

算法流程

流程的具体步骤如下:

  1. 检查输入的坐标点集合的合法性,确保至少有3个坐标点。
  2. 对输入的参数进行范围约束,确保迭代次数大于等于1,张力因子在0到1之间。
  3. 将张力因子映射到0.05到0.45之间,以便在计算切割距离时使用。
  4. 迭代计算,使用Chaikin曲线平滑处理的方法对坐标点集合进行处理。
  5. 返回平滑后的曲线坐标点集合。
        /// <summary>/// 计算折线对应的平滑曲线坐标点/// </summary>/// <param name="points">坐标集合</param>/// <param name="tension">张力因子[0,1],用于控制曲线的平滑程度。张力因子越小时切割点会越靠近线段的起始点,反之会靠近线段的结束点。</param>/// <param name="iterationCount">迭代次数,用于控制曲线平滑的精度</param>/// <returns></returns>/// <exception cref="ArgumentException"></exception>private List<Point> SmoothCurveChaikin(Point[] points, float tension = 0.5f, byte iterationCount = 1){// 坐标点合法性检查if (points == null || points.Length < 3){throw new ArgumentException("至少需要3个坐标点。", nameof(points));}// 参数范围约束iterationCount = Math.Max(iterationCount, (byte)1);tension = Math.Max(tension, 0);tension = Math.Min(tension, 1);// 参数的限制在0到1之间是为了简化参数的使用和理解。将张力因子的取值范围映射到0到1之间,使得参数的范围更加直观和易于控制。// 通过将张力因子乘以0.4并加上0.05,可以将0到1之间的参数映射到0.05到0.45之间,以便在计算切割距离时使用。// 张力因子在这里用于控制曲线的平滑程度。具体来说,张力因子定义了线段半长切角距离的一个尺度,取值范围在0.05到0.45之间。// 当张力因子为0.5时,相当于使用了经典的Chaikin算法,即将每个线段切割成四分之一和四分之三的两个点。这样可以保持曲线的对称性。double cutdist = 0.05 + (tension * 0.4);// 迭代计算List<Point> lst = points.ToList();for (int i = 1; i <= iterationCount; i++){lst = SmoothChaikin(lst, cutdist);}return lst;}

Chaikin曲线平滑处理

Chaikin曲线平滑处理是一种基于切割和插值的方法,通过对线段进行切割和插值操作,得到平滑的曲线。
在这里插入图片描述
具体步骤如下:

  1. 添加第一个点,即原始点集合的第一个点。
  2. 将每一个点拆分成前后两个点,通过计算切割距离参数和原始点的坐标进行插值计算。
  3. 添加插值计算得到的两个点。
  4. 添加最后一个点,即原始点集合的最后一个点。
  5. 返回平滑后的曲线坐标点集合。
        /// <summary>/// 对点集合进行Chaikin曲线平滑处理/// </summary>/// <param name="points">要进行平滑处理的曲线的原始点</param>/// <param name="cuttingDist">切割距离参数,用于定义线段切割的尺度。取值范围通常在0.05到0.45之间,用于控制曲线的平滑程度</param>/// <returns></returns>private List<Point> SmoothChaikin(List<Point> points, double cuttingDist){// 添加第一个点List<Point> nl = new List<Point> { points[0] };// 将每一个点拆分成前后两个点Point q, r;for (int i = 0; i < points.Count - 1; i++){q = new Point((int)Math.Round(((1 - cuttingDist) * points[i].X + cuttingDist * points[i + 1].X)),(int)Math.Round(((1 - cuttingDist) * points[i].Y + cuttingDist * points[i + 1].Y)));r = new Point((int)Math.Round((cuttingDist * points[i].X + (1 - cuttingDist) * points[i + 1].X)),(int)Math.Round((cuttingDist * points[i].Y + (1 - cuttingDist) * points[i + 1].Y)));nl.Add(q);nl.Add(r);}// 添加最后一个点nl.Add(points.Last());return nl;}

实验与结果

为了验证算法的有效性和可靠性,我们进行了两组测试。

测试1:验证不同迭代次数下的算法结果

测试步骤:

  1. 将张力因子设置为0.5。
  2. 调整迭代次数为1、2、3。
  3. 对比不同迭代次数下的算法结果。

在这里插入图片描述

测试2:观察不同张力因子下的算法结果

测试步骤:

  1. 将迭代次数设置为1。
  2. 调整张力因子为0、0.2、0.4、0.6、0.8。
  3. 观察不同张力因子下的算法结果。
    在这里插入图片描述

本算法在不同的参数设置下进行了实验,得到了不同平滑程度和精度的曲线。实验结果表明,当张力因子较小时,切割点会靠近线段的起始点,曲线的平滑程度较低;当张力因子较大时,切割点会靠近线段的结束点,曲线的平滑程度较高。迭代次数的增加可以提高曲线的平滑精度,但也会增加计算的时间复杂度。实验结果还表明,本算法能够有效地平滑折线,并且具有较高的精度和可控性。


结论

本文介绍了一种计算折线对应的平滑曲线坐标点的算法。该算法使用Chaikin曲线平滑处理的方法,通过控制张力因子和迭代次数来调整曲线的平滑程度和精度。实验结果表明,该算法能够有效地平滑折线,并且具有较高的精度和可控性。未来的工作可以进一步优化算法的性能和扩展算法的应用范围。


参考资料

  1. 2D Polyline Vertex Smoothing

相关文章:

C# | Chaikin算法 —— 计算折线对应的平滑曲线坐标点

Chaikin算法——计算折线对应的平滑曲线坐标点 本文将介绍一种计算折线对应的平滑曲线坐标点的算法。该算法使用Chaikin曲线平滑处理的方法&#xff0c;通过控制张力因子和迭代次数来调整曲线的平滑程度和精度。通过对原始点集合进行切割和插值操作&#xff0c;得到平滑的曲线坐…...

day44

什么是前端 前端是所有跟用户直接打交道的都可以称之为是前端 比如&#xff1a;pc页面、手机页面、平板页面、汽车显示屏等等显示出来的都是前端内容 什么是后端&#xff1f; 就是一堆代码&#xff0c;用户不能够直接看到&#xff0c;不直接与用户打交道的都是后端 常见的后端…...

python常用操作汇总

python创建二维数组 python创建三行三列的二维数组&#xff0c;下面方法是错误的&#xff0c;因为是浅拷贝&#xff1a; lst1 [0] * 3 lst2 [lst1] * 3 lst2[1][1] 2 print(lst2) # [[0, 2, 0], [0, 2, 0], [0, 2, 0]]正确姿势 lst [[0 for j in range(3)] for i in ran…...

赴日IT培训 日本IT行业为啥吃香?

确实现在有许多小伙伴尝到了赴日IT的甜头&#xff0c;可是去日本从事IT行业真的很简单吗&#xff1f;为什么日本的IT行业这么缺人呢&#xff1f;那今天小编就跟大家聊一聊日本的IT行业。 咱们先来说说日本的IT行业为什么缺人&#xff1f;其实不只是IT行业&#xff0c;可以说日…...

2016年亚太杯APMCM数学建模大赛A题基于光学信息数据的温度及关键元素含量预测求解全过程文档及程序

2016年亚太杯APMCM数学建模大赛 A题 基于光学信息数据的温度及关键元素含量预测 原题再现 光含有能量&#xff0c;在一定条件下可以转化为热。燃烧是一种常见的现象&#xff0c;既能发光又能发热。光和热通常是同时存在的&#xff0c;一般来说&#xff0c;光强度越高&#xf…...

一文讲明:企业知识库的作用和搭建方法

在现代商务环境中&#xff0c;企业面临着大量的信息和知识流动。这些信息和知识散落在各个部门、团队甚至个人之间&#xff0c;难以进行有效的整合和利用。而企业知识库的出现解决了这一问题。它提供了一个统一的平台&#xff0c;将分散的信息汇聚到一个集中的数据库中&#xf…...

技术的新浪潮:从SOCKS5代理到跨界电商的未来

在当今这个日新月异的技术时代&#xff0c;各种创新技术如雨后春笋般涌现。从SOCKS5代理到跨界电商&#xff0c;再到爬虫技术、出海战略和游戏产业的飞速发展&#xff0c;我们正处于一个技术变革的黄金时代。 SOCKS5代理&#xff1a;安全的网络通道 SOCKS5代理是一种网络协议…...

Android intent的一些小使用

目录&#xff1a; 1. Test5.java2. activity_main5.xml3. Empty.java (这个是用来带参数打开Activity按钮用的)4. activity_empty.xml5. 总结 一些基本的问题就不进行说明了&#xff0c;直接上代码&#xff01;&#xff01;&#xff01; // 最后的隐形intent和带返回值没有解决…...

Android 关闭 SELinux 释放权限限制

Android 关闭 SELinux 释放权限限制 接前一篇&#xff0c;后续收到客户需求想要关闭 SELinux 放开安全权限&#xff0c;SELinux 是 Linux 的一个安全子系统&#xff0c;SELinux 主要作用是最大限度地减小系统中服务进程可访问的资源&#xff0c;我们想要放开安全权限只需处理 …...

国际腾讯云自主拼装直播 URL教程!!!

注意事项 创建转码模板 并与播放域名进行 绑定 后&#xff0c;转码配置后的直播流&#xff0c;需将播放地址的 StreamName 拼接为 StreamName_转码模板名称&#xff0c;更多详情请参见 播放配置。 前提条件 已注册腾讯云账号&#xff0c;并开通 腾讯云直播服务。 已在 域名…...

AQS 为什么要使用双向链表?

双向链表 双向链表的特点是它有两个指针&#xff0c;一个指针指向前置节点&#xff0c;一个指针指向后继节点。所以&#xff0c;双向链表可以支持 常量 O(1) 时间复杂度的情况下找到前驱结点&#xff0c;基于这样的特点。双向链表在插入和删除操作的时候&#xff0c;要比单向链…...

Golang 自定义函数库(个人笔记)

1.用字符串连接切片元素&#xff08;类似php implode&#xff09; package mainimport ("fmt""strconv""strings" )func main() {data : []int{104, 101, 108, 108, 111}fmt.Println(IntSliceToString(data, ",")) }func IntSliceToS…...

openlayers 地图组件封装

openlayers 地图组件封装 <template><div class"mapBox"><!-- 地图 --><div ref"map" id"map" class"map"></div><!-- 点位弹窗 --><div id"popup" class"ol-popup">…...

【算法设计与分析】—— 分治算法

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…...

Unable to find GatewayFilterFactory with name TokenRelay

目录 问题分析解决方案参考文档开源项目微服务商城项目前后端分离项目 问题分析 Spring Cloud Gateway 网关作为代理资源服务器&#xff0c;需要将 JWT 传递给下游资源服务器&#xff0c;下面是网关的配置 spring:cloud:gateway:discovery:locator:enabled: true # 启用服务发…...

竞赛 深度学习大数据物流平台 python

文章目录 0 前言1 课题背景2 物流大数据平台的架构与设计3 智能车货匹配推荐算法的实现**1\. 问题陈述****2\. 算法模型**3\. 模型构建总览 **4 司机标签体系的搭建及算法****1\. 冷启动**2\. LSTM多标签模型算法 5 货运价格预测6 总结7 部分核心代码8 最后 0 前言 &#x1f5…...

git基础及原理相关解析

git入门 结构基本操作help提交分支git merge和git rebase对比 拉取 git文档 结构 工作区&#xff1a;电脑目录中能看到的文件暂存区&#xff1a;使用git add *操作提交文件的位置&#xff0c;一般位于.git\index&#xff0c;这个文件里面存储了当前位于暂存区的所有文件的校验…...

【Python机器学习】零基础掌握isotonic_regression等渗回归

遇到了数据不一致的困扰吗? 在市场分析、医疗研究或者其他数据密集型领域,经常会遇到一个问题:如何从一组不完全一致或者有噪音的数据中提取出有用的信息?例如,假设一家餐厅想要根据顾客的评分和消费金额来调整菜单。 顾客评分消费金额(元)顾客年龄访问次数4.21002533.…...

支持宏的文本编辑器提高生产力

场景 我们知道很多文本/代码编辑器支持宏的录制、重放、保存&#xff0c;甚至可以与快捷键命令结合的功能&#xff0c;快速实现重放宏的操作。 如果您的编辑器支持宏这项功能&#xff0c;请多使用 &#x1f603; 宏化自动步骤相当于对编辑器的自动化编程&#xff0c;宏录制可…...

JS中面向对象的程序设计

面向对象&#xff08;Object-Oriented&#xff0c;OO&#xff09;的语言有一个标志&#xff0c;那就是它们都有类的概念&#xff0c;而通过类可以创建任意多个具有相同属性和方法的对象。但在ECMAScript 中没有类的概念&#xff0c;因此它的对象也与基于类的语言中的对象有所不…...

BetterJoy:三步搞定Windows玩转任天堂Switch控制器的终极方案

BetterJoy&#xff1a;三步搞定Windows玩转任天堂Switch控制器的终极方案 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitco…...

3步快速上手:AMD Ryzen性能调试工具SMUDebugTool完全指南

3步快速上手&#xff1a;AMD Ryzen性能调试工具SMUDebugTool完全指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https:/…...

中文分词与词频统计全流程实战 | 全网独家复现,Python零基础落地篇 引入jieba分词优化+多策略词频统计,助力文本挖掘、舆情分析、学术研究高效落地

目录 一、核心前言(明确价值,避开踩坑) 1.1 实战意义 1.2 技术选型说明 1.3 前置准备(零基础必看) 二、核心原理(极简理解,无需深入) 2.1 中文分词原理 2.2 词频统计原理 三、全流程代码实现(零基础可复制,全程注释) 3.1 工程化目录结构(必看,避免路径错…...

描述它,不要画它:通过 MCP 和 ES|QL 实现 AI-native Kibana dashboards

作者&#xff1a;来自 Elastic Stratoula Kalafateli 从 prompt 到 dashboard。学习如何使用自然语言构建 Kibana dashboards&#xff0c;使用 example-mcp-dashbuilder&#xff1a;一个开源 MCP 应用&#xff0c;它可以编写 ES|QL 查询&#xff0c;创建交互式图表&#xff0c;…...

大语言模型在嵌入式系统开发中的应用与挑战

1. 嵌入式系统开发与大语言模型的碰撞 在智能家居、工业自动化和物联网设备蓬勃发展的今天&#xff0c;嵌入式系统作为连接数字世界与物理世界的桥梁&#xff0c;其开发复杂度正呈指数级增长。传统嵌入式开发要求工程师同时具备三大核心能力&#xff1a;理解电子元件特性与电路…...

别再只会用top了!Linux网络实时监控神器iftop保姆级教程(含常用快捷键与过滤技巧)

从top到iftop&#xff1a;Linux网络流量监控的终极实战指南如果你已经熟练使用top命令监控系统资源&#xff0c;却对网络流量分析感到无从下手&#xff0c;那么iftop将成为你工具箱中不可或缺的神器。就像top之于CPU和内存&#xff0c;iftop专为实时网络监控而生&#xff0c;它…...

终极指南:三步解锁微信网页版完整访问权限

终极指南&#xff1a;三步解锁微信网页版完整访问权限 【免费下载链接】wechat-need-web 让微信网页版可用 / Allow the use of WeChat via webpage access 项目地址: https://gitcode.com/gh_mirrors/we/wechat-need-web 你是否曾因无法在浏览器中使用微信网页版而苦恼…...

二进制量化技术如何优化大语言模型部署

1. 二进制量化技术在大语言模型中的革新应用在人工智能领域&#xff0c;大语言模型(LLM)的规模呈指数级增长&#xff0c;随之而来的是巨大的计算资源消耗和内存需求。传统FP16精度模型需要消耗数十GB甚至上百GB的显存&#xff0c;这使得在消费级硬件和边缘设备上部署变得异常困…...

从多分类到一对其余:解决类别不平衡与语义模糊的文档分类实战

1. 项目概述与核心挑战在数字发展这个快速演进的领域&#xff0c;每天都有大量的研究报告、政策文件和项目评估文档产生。对于像世界银行、联合国开发计划署这类国际组织&#xff0c;高效地管理和归类这些海量文档&#xff0c;是进行有效知识管理、趋势分析和决策支持的基础。传…...

安卓高版本APP抓包实战:破解证书校验与NetworkSecurityConfig

1. 为什么高版本安卓APP抓包越来越像“拆弹”——从系统证书机制说起你有没有试过&#xff0c;把BurpSuite配好代理、雷电模拟器9开起来、APP一启动就报“网络连接异常”&#xff1f;或者更魔幻的&#xff1a;APP能打开&#xff0c;但所有接口请求在Burp里压根不出现&#xff0…...