曲线平滑-B样条曲线
2016-08-31 16:48
302 查看
3D空间曲线三次B样条平滑示例:
struct D_DOT3D //D_DOT3D示例,未完全实现 { double x,y,z; } double GetThreeBSplineValue(double p0, double p1, double p2, double p3, double t) { double A0 = (p0 + 4*p1 + p2) / 6; double A1 = - (p0 - p2)/2; double A2 = (p0 - 2*p1 + p2) / 2; double A3 = - (p0 - 3*p1 + 3*p2 - p3)/6; return A0 + A1 * t + A2 * t*t + A3 * t*t*t; } D_DOT3D GetThreeBSplineValue(D_DOT3D p0, D_DOT3D p1, D_DOT3D p2, D_DOT3D p3 , double t) { D_DOT3D dot; dot.x = GetThreeBSplineValue(p0.x, p1.x, p2.x, p3.x, t); dot.y = GetThreeBSplineValue(p0.y, p1.y, p2.y, p3.y, t); dot.z = GetThreeBSplineValue(p0.z, p1.z, p2.z, p3.z, t); return dot; } long ThreeBSplineCurve( vector<D_DOT3D> &line ) { if (line.size()<4) return 0; vector<D_DOT3D> vout; for (int i=0; i<line.size()-3; ++i) { D_DOT3D p0(line[i]); D_DOT3D p1(line[i+1]); D_DOT3D p2(line[i+2]); D_DOT3D p3(line[i+3]); if(0 == i) { D_DOT3D dot1 = GetThreeBSplineValue(p0, p1, p2, p3, 0.0); vout.push_back(dot1); } D_DOT3D dot2 = GetThreeBSplineValue(p0, p1, p2, p3, 1/3.0); D_DOT3D dot3 = GetThreeBSplineValue(p0, p1, p2, p3, 2/3.0); D_DOT3D dot4 = GetThreeBSplineValue(p0, p1, p2, p3, 1.0); vout.push_back(dot2); vout.push_back(dot3); vout.push_back(dot4); } line = vout; return 1; }
相关文章推荐
- Linux下网络流量实时监控工具大全
- 各种数据库连接URL关键代码
- LeetCode candy
- 经典面试题之字符串的全排列
- 解决win10系统flash player无法播放,升级
- Android之NestedScrollView 嵌套 RecyclerView 滑动冲突的问题
- PCI/PCIe那些事(3)-- Configuration Space Type 0/1
- 【C/C++】判断一个数是不是闰年
- 【如何正确使用const,static,extern】|那些人追的干货
- MLP多层感知机原理简介+代码详解
- Matlab计算机视觉/图像处理工具箱推荐
- ArcGIS 点的显示和隐藏、地图事件绑定
- [置顶] ubuntu12.04下编译vlc开源库
- Extjs4 封装echarts组件 2016.8.31
- 【基础学习】Android vector xml 将SVG转换成VectorDrawable 资源
- SQL常用语句
- 转:Eclipse常用快捷键
- 论Sava(),SaveOrUpdate(),Merge()区别
- 简单例子了解View的事件分发
- 分布式消息列队RocketMQ部署