随笔 - 833  文章 - 1  评论 - 106  阅读 - 200万

曲线平滑-B样条曲线 【转】

3D空间曲线三次B样条平滑示例:

  1. struct D_DOT3D //D_DOT3D示例,未完全实现    
  2. {    
  3.     double x,y,z;    
  4. }   
  5.   
  6. double GetThreeBSplineValue(double p0, double p1, double p2, double p3, double t)  
  7. {  
  8.     double A0 = (p0 + 4*p1 + p2) / 6;  
  9.     double A1 = - (p0 - p2)/2;  
  10.     double A2 = (p0 - 2*p1 + p2) / 2;  
  11.     double A3 = - (p0 - 3*p1 + 3*p2 - p3)/6;  
  12.     return A0 + A1 * t + A2 * t*t + A3 * t*t*t;  
  13. }  
  14.   
  15. D_DOT3D GetThreeBSplineValue(D_DOT3D p0, D_DOT3D p1, D_DOT3D p2, D_DOT3D p3 , double t)  
  16. {  
  17.     D_DOT3D dot;  
  18.     dot.x = GetThreeBSplineValue(p0.x, p1.x, p2.x, p3.x, t);  
  19.     dot.y = GetThreeBSplineValue(p0.y, p1.y, p2.y, p3.y, t);  
  20.     dot.z = GetThreeBSplineValue(p0.z, p1.z, p2.z, p3.z, t);  
  21.   
  22.     return dot;  
  23. }  
  24.   
  25. long ThreeBSplineCurve( vector<D_DOT3D> &line )  
  26. {  
  27.     if (line.size()<4)  
  28.         return 0;  
  29.   
  30.     vector<D_DOT3D> vout;  
  31.     for (int i=0; i<line.size()-3; ++i)  
  32.     {  
  33.         D_DOT3D p0(line[i]);  
  34.         D_DOT3D p1(line[i+1]);  
  35.         D_DOT3D p2(line[i+2]);  
  36.         D_DOT3D p3(line[i+3]);  
  37.         if(0 == i)  
  38.         {  
  39.             D_DOT3D dot1 = GetThreeBSplineValue(p0, p1, p2, p3, 0.0);  
  40.             vout.push_back(dot1);  
  41.         }  
  42.   
  43.         D_DOT3D dot2 = GetThreeBSplineValue(p0, p1, p2, p3, 1/3.0);  
  44.         D_DOT3D dot3 = GetThreeBSplineValue(p0, p1, p2, p3, 2/3.0);  
  45.         D_DOT3D dot4 = GetThreeBSplineValue(p0, p1, p2, p3, 1.0);  
  46.   
  47.         vout.push_back(dot2);  
  48.         vout.push_back(dot3);  
  49.         vout.push_back(dot4);  
  50.     }  
  51.   
  52.     line = vout;  
  53.   
  54.     return 1;  
posted on   3D入魔  阅读(1248)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示