曲线平滑-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 2018-01-18 11:26  3D入魔  阅读(1227)  评论(0编辑  收藏  举报