#ifndef B_SPLINE_H
#define B_SPLINE_H#include <vector>//节点个数 m + 1
//最大次数 p = m
//定义基函数class BaseFunction {public:BaseFunction(){};~BaseFunction(){};void setKnots(std::vector<double> knots_) {knots = knots_;m = knots.size() - 1;max_p = m - 1;};// i_:  0 -- m-1// p_:  0 -- max_p// u_:  knots.front()  --  knots.back()// i_ + p_ <= max_pdouble baseN(int i_, int p_, double u_) {if (p_ == 0) {if (u_ >= knots[i_] && u_ < knots[i_ + 1])return 1;elsereturn 0;} else {double a = 0;if ((knots[i_ + p_] - knots[i_]) != 0)a = (u_ - knots[i_]) / (knots[i_ + p_] - knots[i_]);double b = 0;if ((knots[i_ + p_ + 1] - knots[i_ + 1]) != 0)b = (knots[i_ + p_ + 1] - u_) / (knots[i_ + p_ + 1] - knots[i_ + 1]);return a * baseN(i_, p_ - 1, u_) + b * baseN(i_ + 1, p_ - 1, u_);}}private:std::vector<double> knots;int m = 1;int max_p = 1;
};//对一组数据计算BSpline
class BSpline {public:BSpline(){};~BSpline(){};void setP(int p_) {p = p_;m = n + p + 1;generateKnots();};void addControlPoints(std::vector<double> control_points_) {control_points = control_points_;n = control_points.size() - 1;m = n + p + 1;generateKnots();};void setPointsNum(int points_num_) {points_num = points_num_;u.clear();for (int i = 0; i < points_num; i++) {u.emplace_back((double)i / (double)(points_num - 1));}};bool bSplineCal() {if (n < 2) {return false;}data_out.clear();BaseFunction bf;bf.setKnots(knots);for (int j = 0; j < u.size(); j++) {double c_u = 0;for (int i = 0; i <= n; i++) {if (j == u.size() - 1 && i == n)c_u += control_points[i];elsec_u += (bf.baseN(i, p, u[j]) * control_points[i]);}data_out.emplace_back(c_u);}return true;}public:std::vector<double> getDataOut() const { return data_out; };private:std::vector<double> control_points;  //控制点int n = 1;                           //控制点n+1个std::vector<double> knots;           //节点0-1范围内int m = 1;                           //节点数量m+1个int p = 3;                           //曲线阶数int points_num = 10;std::vector<double> u;         //根据points_num计算采样点的std::vector<double> data_out;  //计算完成后的数据//生成knotsvoid generateKnots() {knots.clear();for (size_t i = 0; i < m + 1; i++) {if (i <= p)knots.emplace_back(0);else if (i >= m - p)knots.emplace_back(1);else {// p+1 --- m-p-1区间范围内int num = m - p - p;if (num < 2) return;double step = 1.0 / (double)num;knots.emplace_back(step * (i - p));}}}
};class BSpline2D {public:BSpline2D(){};~BSpline2D(){};std::vector<double> getXOut() const { return x_out; };std::vector<double> getYOut() const { return y_out; };void setP(int p_) { p = p_; };void setPointsNum(int points_num_) { points_num = points_num_; };void addXControlData(std::vector<double> x_control_data_) {x_control_data = x_control_data_;};void addYControlData(std::vector<double> y_control_data_) {y_control_data = y_control_data_;};bool bSpline2DCal() {BSpline bs;bs.setP(p);bs.setPointsNum(points_num);// x方向bs.addControlPoints(x_control_data);if (!bs.bSplineCal()) {return false;}x_out = bs.getDataOut();// y方向bs.addControlPoints(y_control_data);if (!bs.bSplineCal()) {return false;}y_out = bs.getDataOut();return true;};private:std::vector<double> x_control_data, y_control_data;std::vector<double> x_out, y_out;int p = 3;int points_num = 30;
};#endif

使用方法:

BSpline2D bs2d;

bs2d.setPointsNum(point_num);//设置点数量(默认30个点)

bs2d.setP(3);//设置曲线阶数(默认3阶数)

bs2d.addXControlData(x_control_data);//设置控制点

bs2d.addYControlData(y_control_data);

//进行计算

if (!bs2d.bSpline2DCal()) {

return false;

}

//提取插值点数据

std::vector<double> x_out = bs2d.getXOut();

std::vector<double> y_out = bs2d.getYOut();

clamped b_spline相关推荐

  1. Unity Scroll View在Clamped模式下无法移动

    稍微专业一些的问题,还是用Google去查吧 Q: Scrollrect Clamp Not Working Hi All, I'm trying to implement a vertical sc ...

  2. 【UE4_蓝图】map函数以及Clamped和Unclamped的区别

    如官方文档所示: https://docs.unrealengine.com/4.27/en-US/BlueprintAPI/Math/Float/MapRangeClamped/ Value=0.5 ...

  3. 【C++】C++11 STL算法(六):最小/最大操作(Minimum/maximum operations)、比较运算(Comparison operations)

    目录 最小/最大操作(Minimum/maximum operations) 一.max 1.原型: 2.说明: 3.官方demo 二.max_element 1.原型: 2.说明: 3.官方demo ...

  4. Unity3D常用代码总结

    1 GUI汇总 function OnGUI() { GUI.Label(Rect(1,1,100,20),"I'm a Label"); //1 GUI.Box(Rect(1,2 ...

  5. dot3_bump_mapping

    为什么80%的码农都做不了架构师?>>>    //----------------------------------------------------------------- ...

  6. 小规模网络数据公开数据_大规模的在线公开课程曾经是100%免费的。 但是他们没有那样做。...

    小规模网络数据公开数据 I took one of the first Massive Open Online Courses (MOOCs) in 2011. Back then, everythi ...

  7. 研究速递:预测学习——神经元高效运作的最佳策略

    来源:集智俱乐部 作者:袁郭玲.梁金 编辑:邓一雪 摘要 了解大脑如何学习有助于制造具有与人类类似智力水平的机器.之前有理论提出,大脑可能是根据预测编码的原理运行.然而,对于预测系统如何在大脑中实现还 ...

  8. 【第二篇】Volley的使用之加载图片

    Volley加载图片有两种方式: 1,ImageRequest 来对网络图片进行请求,放入请求队列,获取后现在在控件上面. 2,NetworkImageView 最为自定义控件来自动加载网络图片. 3 ...

  9. matlab 2012 vs2010混合编程

    1.背景 众所周知,matlab在处理矩阵.数学计算.计算机仿真.图像处理等方面有着 c c++无可比拟的优势,但是做成系统供使用时,又显得过于粗糙,为了使用起来高大上,计算起来有简单,方便.无疑,c ...

最新文章

  1. 刚刚,YOLOv4重磅更新!快来一睹论文真容吧!
  2. 彭博社 : 中国稀土——美欧的苦恼
  3. java logback 使用_Java | Logback的使用配置
  4. Git credential helper 让你的 https不再需要输入用户名密码
  5. 前端三十五:图片的基本概念
  6. rust python对比_Python Rust 迭代器对比
  7. verilog 除法器
  8. 获取字段为List类型中的泛型类型
  9. tensorflow项目构建流程
  10. python程序设计第二版课后答案江红_Python核心编程第二版 第十三章课后答案
  11. c语言中double占多少字节,double占几个字节?
  12. 计算机通信技术【计算机网络】学习
  13. jiacu的css,css 加粗(css font
  14. vue项目中使用Google Analytics (谷歌统计)
  15. com.esotericsoftware.kryo.KryoException: Encountered unregistered class ID
  16. 传感器实验——火焰传感器
  17. E哥的Git教程(一)
  18. 华硕重装后进入bios_重装系统以后,开机自动进bios,进不了系统怎么办
  19. 《蛙声十里出山泉》赏析
  20. 自控力读书笔记 第八章 传染:为什么意志力会传染?

热门文章

  1. ORA-00904: invalid identifier
  2. 麦肯锡著名的三大结构化工具:金字塔原理、MECE和逻辑树
  3. 24基础指标、macd指标详解、macd指标分析
  4. 小学奥数 7653 地球人口承载力估计 python
  5. BGP公网成本节省50%秘笈,共享流量包、共享带宽包,便宜到阿里云快哭了
  6. 香港windows云服务器下编译webrtc
  7. Network Password Recovery工具查看windows凭据密码
  8. 基于android手机实时监控ipcam视频之三:H.264的RTP打包解析
  9. 腾讯云下centos git 克隆远程仓库
  10. ng test 运行报错SassError: Can‘t find stylesheet to import, 导致case 一个都没有执行