C++编写任意次clampedB样条曲线(曲线分别与第一个控制点和最后一个控制点的第一边和最后一边相切)
我们知道,B样条曲线根据其起始点与控制点的关系可分为:openB样条曲线,clampedB样条曲线,closedB样条曲线。OpenB样条曲线不会与第一个控制点和最后一个控制点的第一条边和最后一条边相切,closedB样条曲线首尾相连,一般工程运用中,更多的是我们希望B样条曲线的起始点分别于第一个控制点和最后一个控制点的第一条边和最后一条边相切,这种B样条就是clampedB样条。
本文中,生成这种B样条曲线的方法是:假设B样条的次数为p,控制顶点数为n+1,那么节点向量为{u0,u1,u2,,,,um},m=p+n+1.我们只需要将这节点向量的前p+1个节点和最后p+1个节点分别相等,就能生成clampedB样条曲线。即:u0=u1=u2=,,,=up,um=um-1=um-2=,,,=um-p。代码如下:
1.生成节点向量
std::vector<double> pcxBSpline::get_NoteVector(int p, int N)
{std::vector<double> result;int n = p + N + 1;result.reserve(n);double dt = 1.0 / double(n);for (int i = 0; i <= n; i++){if (i <= p)result.push_back(0.0);else if (i < N + 1){result.push_back(double(i)*dt);}else result.push_back(1.0);}return result;
}
2.生成基函数权值
std::pair<std::vector<double>, int> pcxBSpline::get_BaseWeight(std::vector<double>& notevector, int N, int p, double u)
{std::vector<double> result;result.resize(N+p+1,0.0);std::vector<double>& uu = notevector;int k;//排除特例;if (u == uu[0]){result[0] = 1.0;return std::make_pair(result,0);}else if (u == uu[uu.size() - 1]){result[N] = 1.0;return std::make_pair(result,N-p);}else{for (int i = 0; i < uu.size(); i++){if ((uu[i] <= u) && (uu[i + 1]>u)){k = i;break;}}}//仅仅计算k-p到k的基函数权值,因为其他控制点的基函数权值为0;result[k] = 1.0;for (int i = 1; i <= p; i++){if (uu[k + 1] - uu[k + 1 - i] == 0.0)result[k - p] = 0.0;else result[k - p] = (uu[k + 1] - u) / (uu[k + 1] - uu[k + 1-i])*result[k - p+1];for (int j = k - p + 1; j < k; j++){double n1, n2;if ((uu[j + i] - uu[j]) == 0.0)n1 = 0.0;else n1 = (u - uu[j]) / (uu[j + i] - uu[j])*result[j];if ((uu[i + j + 1] - uu[j + 1]) == 0.0)n2 =0.0;else n2 = (uu[j + i + 1] - u) / (uu[i + j + 1] - uu[j + 1])*result[j + 1];result[j] = n1 + n2;}if ((uu[k + i] - uu[k]) == 0.0)result[k] = 0.0;else result[k] = (u - uu[k]) / (uu[k + i] - uu[k])*result[k];}return std::make_pair(result,k-p);
}
3.计算参数化顶点的坐标
CPoint pcxBSpline::get_point(std::vector<CPoint>& contr_points, std::vector<double>& notevector, int N, int p, double u)
{std::pair<std::vector<double>,int> baseweight = this->get_BaseWeight(notevector, N, p, u);int k = baseweight.second;std::vector<double> &W = baseweight.first;CPoint result(0.0, 0.0);for (int i = 0; i <= p; i++){result += (CPoint(contr_points[k+i].x*W[k+i], contr_points[k+i].y*W[k+i]));}return result;
}
4.运行结果如下图所示
C++编写任意次clampedB样条曲线(曲线分别与第一个控制点和最后一个控制点的第一边和最后一边相切)相关推荐
- 三次插值ClampedB样条曲线Matlab代码实现
三次插值ClampedB样条曲线Matlab代码实现 本文代码根据插值样条曲线原理实现. 在代码实现过程中与原博客中矩阵计算有误差,主要体现在边缘型值点对控制点的系数求解上.教程中系数求解为0,1/6 ...
- 练习-任意输入n个从小到大的整数的数列,然后输入一个整数插入到数列中,使数列保持从小到大的顺序
第1关:任意输入n个从小到大的整数的数列,然后输入一个整数插入到数列中,使数列保持从小到大的顺序 任务描述 本关任务:任意输入n个从小到大的整数,然后输入一个整数插入到数组中,使数组元素仍然保持从小到 ...
- 编写程序从1循环到150,并在每行打印一个值,另外在每个3的倍数行上打印出“foo”,在每个5的倍数行上打印“biz”;在每个7的倍数行上打印输出“baz”。
题目: 编写程序从1循环到150,并在每行打印一个值, 另外在每个3的倍数行上打印出"foo", 在每个5的倍数行上打印"biz": 在每个7的倍数行上打印输出 ...
- #十二、编写三角形类Triangle,初始化三个属性,分别是三条边的长度,定义一个计算并打印周长的函数 #十三、编写等腰三角形类EWtriangle,继承于三角形类,初始化只用传一个腰长和一个底长,定
#十二.编写三角形类Triangle,初始化三个属性,分别是三条边的长度,定义一个计算并打印周长的函数 #十三.编写等腰三角形类EWtriangle,继承于三角形类,初始化只用传一个腰长和一个底长,定 ...
- 编写程序,从键盘输人 10个整数,之间以一个空格隔开,存放在一维数组中。找出值最大和最小的元素,第一行输出最大值及其所在的元素下标,之间以一个空格隔开;第二行输出最小值及其所在的元素下标,之间以一个空
题目:编写程序,从键盘输人 10个整数,之间以一个空格隔开,存放在一维数组中.找出值最大和最小的元素,第一行输出最大值及其所在的元素下标,之间以一个空格隔开;第二行输出最小值及其所在的元素下标,之间以 ...
- 给定一个整数N(2 <= N <= 8),生成所有的具有下列特性的特殊的N位质数:其前任意位都是质数。 例如,7331即是这样一个4位的质数,因为7、73和733也都是质数。 【输入形式】
#include<stdio.h> #include<math.h> #include<string.h> // 注意是前n位 int pri(long x){in ...
- 用 ATL ActiveX 绘制任意平面函数的曲线
作者: 杨老师 下载源代码 关键词:脚本.ATL.ActiveX.脚本引擎.表达式计算.IActiveScript.IActiveScriptSite 一.前言 这是非常有挑战性的题目.对于用户输入的 ...
- 用ATL ActiveX 绘制任意平面函数的曲线
一.前言 这是非常有挑战性的题目.对于用户输入的任意一个平面函数f(x),绘制出其函数曲线.这里最关键的技术难点就是如何实现计算表达式的值.在<编译原理>和<数据结构>的书中, ...
- ai怎么画循环曲线_AI插画设计,用AI制作一个只可爱的短腿柯基插画
本次用AI绘制的是一只人见人爱的短腿小柯基,柯基简直萌翻了有没有,尤其在爬楼梯的时候,我们用简单的线条工具绘制这只可爱的的小柯基,创建插画的时候,可以用铅笔工具绘制线条,或者弧形工具创建所需的曲线,具 ...
最新文章
- 利用css3实现jQuery中的slideDown和slideUp效果
- Linux系统磁盘满了
- WebHttpBinding的流传输模式让我头大了
- Just $h$-index HDU - 6278(主席树找区间大于等于k的个数)
- group by很多字段是不是会很慢_女生回复我总很慢,怎么办?
- 优秀博客 --敏感词汇过滤
- IDEA : 配置checkstyle
- 【转】解决 canvas 在高清屏中绘制模糊的问题
- List之LinkedList与ArrayList区别
- 微信小程序MINA框架介绍
- 金蝶云·星空——采购入库单生成凭证取不到价税合计
- 训练集误差和验证集误差
- mybatis批量新增和修改
- 图书馆管理系统测试计划说明书
- 共享计算机后无法访问磁盘,Win10系统下无法访问共享硬盘怎么办?
- 产品经理 项目经理 技术经理的区别
- [SWF Investigator] Adobe官方开源 swf解析/编辑工具
- 第5章 LinearR/PLR/SVR/KNN/DTR/RFR(测算房价)
- execjs._exceptions.ProcessExitedWithNonZeroStatus
- 两栈共享空间 C语言实现