c++计算贝塞尔曲线(折线平滑为曲线)坐标方法

效果可查看上一篇博文:js手动画平滑曲线,贝塞尔曲线拟合【代码】js手动画平滑曲线,贝塞尔曲线拟合。https://blog.csdn.net/qiufeng_xinqing/article/details/131711963?spm=1001.2014.3001.5502

代码如下:

#include <cmath>
#include <cstdint>
#include <exception>
#include <vector>namespace line {
// 二维坐标点定义:first对应x值,second对应y值
using point_t = std::pair<double, double>;/// <summary>
/// 阶乘(递归),即 n! = n * (n-1) * (n-2) * (n-3) * ...* 1
/// </summary>
/// <param name="num">阶乘的数</param>
/// <returns>阶乘结果数</returns>
double factorial(double num)
{return (num <= 1) ? 1 : (num * factorial(num - 1));
}/// <summary>
/// 通过多个控制点计算当前贝塞尔曲线上的点坐标,横坐标为[0,1]
/// 关于 贝塞尔曲线:https://www.cnblogs.com/fangsmile/articles/11642607.html
/// </summary>
/// <param name="points">控制点集合</param>
/// <param name="stepTime">横轴的步长,如果为零则使用默认的 0.01 使用为步长</param>
/// <param name="retLine">贝塞尔曲线上的点坐标集</param>
/// <returns>贝塞尔曲线上的点坐标集</returns>
const std::vector<point_t>& calcBezierLine(const std::vector<point_t>& points, double stepTime, std::vector<point_t>& retLine)
{if (points.size() < 2){retLine.resize(1);retLine[0] = points[0];return retLine;}int32_t pointsn = points.size() - 1;int64_t pointsFact = factorial(pointsn);int32_t retCount = 0;stepTime = stepTime == 0 ? 0.01 : stepTime;retLine.resize((1 / stepTime) + 1);for (double xt = 0; xt <= 1; xt += stepTime){double x = 0.0;double y = 0.0;for (int32_t n = 0; n < points.size(); n++){const auto& p = points[n];if (!n){double fact = std::pow((1 - xt), pointsn - n) * std::pow(xt, n);x += p.first * fact;y += p.second * fact;}else{double fact = pointsFact / factorial(n) / factorial((int64_t)pointsn - n)* std::pow((1 - xt), (int64_t)pointsn - n) * std::pow(xt, n);x += fact * p.first;y += fact * p.second;}}retLine[retCount++] = std::make_pair(x, y);}return retLine;
}
}int main()
{std::vector<line::point_t> points({ {115, 53},{392,105},{555,62}, {681, 94} });std::vector<line::point_t> retPoints(100);line::calcBezierLine(points, 0.01, retPoints);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/585.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

FPGA实验三:状态机的设计

目录 一、实验目的 二、实验要求 三、实验代码 1.design source文件部分代码 2.测试文件代码 四、实验结果及分析 1、引脚锁定 2、仿真波形及分析 &#xff08;1&#xff09;设计好序列检测器 &#xff08;2&#xff09;仿真波形&#xff08;检测11010&#xff09; 3…

【网络系统集成】路由器实验

1.实验名称:路由器RIP协议配置 2.实验目的 在PacketTracer中进行模拟实验,配置RIP协议,验证RIP协议更新时间及路由状态变化,加深对路由器RIP协议相关知识的理解与掌握。 3.实验内容 (1)拓扑结构图 (2)ip地址分配与端口分配

使用matlab随机森林进行数据分类预测

当使用MATLAB进行随机森林数据分类预测时&#xff0c;以下是一般的步骤&#xff1a; 准备数据集&#xff1a;将数据集划分为特征和标签&#xff0c;确保数据集已经清洗并做好特征工程。 拆分数据集&#xff1a;将数据集分为训练集和测试集。训练集用于建立随机森林模型&#x…

linux - bc 命令安装

一.引言 迁移新机器后发现没有 bc 命令&#xff0c;之前 shell 脚本的一些计算逻辑会出错&#xff0c;下面快速安装一下。 二.安装 bc 请确保在 root 权限下执行该命令&#xff1a; sudo yum install bc 出现下述界面即安装成功&#xff1a; 三.测试 bc 测试下脚本里 % 的…

快速小巧的粘贴应用程序Hasty Paste

什么是 Hasty Paste? Hasty Paste 是一个快速粘贴文本并共享的地方&#xff0c;主要用于共享调试日志等&#xff0c;以帮助开发人员提供技术支持。该项目的目标是既快又小。 命令行安装 在群晖上以 Docker 方式安装。 官方的镜像没有发布在 docker hub&#xff0c;而是在 gh…

csdn签到的方法

一、手机版 点击下方蓝色文字链接即可。 签到链接&#xff08;点击此处即可&#xff09; 二、电脑版 打开个人中心&#xff0c;单击头像&#xff0c;点击签到抽奖即可。 你学会了吗&#xff1f;&#xff1f;&#xff1f;

Huggingface pipline使用

pipline是Huggingface的一个基本工具&#xff0c;可以理解为一个端到端(end-to-end)的一键调用Transformer模型的工具。它具备了数据预处理、模型处理、模型输出后处理等步骤&#xff0c;可以直接输入原始数据&#xff0c;给出预测结果&#xff0c;十分方便。 1.文本分类 fro…

二级分销小程序怎么做

【二级分销小程序功能介绍】 二级分销小程序是一款专门为企业提供分销管理的移动应用程序。它的主要功能包括商品管理、订单管理、分销设置、分销商等级、分销佣金、分销海报等方面&#xff0c;下面我们逐一进行介绍&#xff1a; 1. 商品管理&#xff1a; 二级分销小程序可以…

尚医通04:Axios Node Npm bable webpack+前端工程改造

目录 本日学习 内容介绍 Axios Node NPM包管理器 Babel 模块化 Webpack 搭建前端工程 前端框架介绍 前端开发过程介绍 登录改造成本地接口 本日学习 1. 了解Axios :他是异步请求用的&#xff0c;前后端。 用于在浏览器和 Node.js 中发送 HTTP 请求。它支持从服务器…

[桌面运维] 显示器 色准,色域,色深,分辨率,带宽,刷新率的基本概念,图像呈现的基本原理

⬜⬜⬜ &#x1f430;&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;(*^▽^*)欢迎光临 &#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea;&#x1f430;⬜⬜⬜ ✏️write in front✏️ &#x1f4dd;个人主页&#xff1a;陈丹宇jmu &am…

redis 设置expire=0和直接调用delete删除key的区别

背景 问题起源于生产上应用redis做的一个临时缓存的场景&#xff0c;调用方首先调用某个容器的生成接口&#xff0c;该接口会生成临时缓存的数据放到redis中&#xff0c;然后调用方在调用获取数据内容的接口从任何一台容器中获取放置在redis中的临时数据。 还原问题场景 由于…

华为数通智选交换机S5735S-L24T4S-QA2无法SSH远程访问

以前都是按照华为S5700交换机开启SSH远程访问方法配置不同网段通过静态路由实现互通,华为S5700交换机开启ssh远程登陆,现在新买的华为数通智选交换机S5735S-L24T4S-QA2,也是按照这步骤配置,令人不解的是,竟然无法ssh访问,仔细看了配置也没有发现问题,在华为eNSP模拟器上验…

初识mysql数据库之复合查询

目录 一、多表查询的概念 二、笛卡尔积 1. 笛卡尔积的概念 2. 笛卡尔积使用案例 2.1 显示雇员名、雇员工资以及所在部门的名字 2.2 显示部门号为10的部门名&#xff0c;员工名和工资 2.3 显示所有员工的姓名、工资和工资级别 3. 自连接 3.1 自连接的概念 3.2 自连接案…

微信小程序中的条件渲染和列表渲染,wx:if ,wx:elif,wx:else,wx:for,wx:key的使用,以及block标记和hidden属性的说明

微信小程序中的条件渲染和列表渲染 1. 条件渲染1.1. 语法格式 (wx:if, wx:elif ,wx:else)1.2. block标记1.3. hidden属性1.4. wx:if 与 hidden 的对比 2. 列表渲染2.1. wx:for 语法格式 及 wx:key的使用 1. 条件渲染 1.1. 语法格式 (wx:if, wx:elif ,wx:else) <view wx:if…

MachineLearningWu_13_AGI

AGI的全称是artificial general intelligence&#xff0c;通用人工智能&#xff0c;而我们现在做的关于医学影像的分析&#xff0c;可以说完全是ANI。 而我们使用MLP对于大脑中神经网络的模拟更是完全不同于人类大脑的行为。

如何开发一个软件

一、软件开发流程 1. 需求分析 主要有两个文档&#xff0c;一个需求规格说明书和一个产品原型图 2. 设计 UI设计、数据库设计、接口设计 3. 编码 项目代码编写、单元测试 4. 测试 测试用例、测试报告 5. 上线运维 软件环境安装、配置 二、角色分工 项目经理 对整个…

flutter开发实战-Running Gradle task ‘assembleDebug‘ 的解决方法

flutter开发实战-Running Gradle task ‘assembleDebug‘ 的解决方法 使用Android studio经常出现Running Gradle task ‘assembleDebug‘问题&#xff0c;记录一下解决方法。 一、在Android目录下更改build.gradle 将repositories中的google(), mavenCentral() repositori…

IIS 部署的应用禁用HTTP TRACE / TRACK方法【原理扫描】

远程Web服务器支持TRACE和/或TRACK方法。 TRACE和TRACK是用于调试Web服务器连接的HTTP方法。 直接在网站Web.config文件中进行如下操作&#xff1a;在Web.config中的<system.webServer>节点内添加以下配置即可&#xff1a; <security> <requestFiltering> &…

数据结构day2(2023.7.15)

一、Xmind整理&#xff1a; 二、课上练习&#xff1a; 练习1&#xff1a;定义车的信息&#xff1a;品牌&#xff0c;单价&#xff0c;颜色&#xff0c;车牌号 struct Car{char name[20]; //品牌int price; //单价char color[10] //颜色char id[20] //车牌…

XXF(x-forwarded-for)

IP伪造 TCP/IP层面的IP伪造很难实现&#xff0c;因为更改后很难实现正常的TCP通信&#xff0c;但在HTTP层面的伪造就显得很容易。可以通过伪造XFF头进行IP伪造 XFF字段 X-Forwarded-For(XFF)是用来识别通过HTTP代理或负载均衡方式连接到Web服务器的客户端最原始的IP地址的HTT…