曲线平滑-B样条曲线 【转】
版权声明:本文为博主原创文章,未经博主允许不得转载。
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;
- }
饮水思源,不忘初心。
要面包,也要有诗和远方。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了