C2连续的三次B样条插值(c++)

原创 2004年12月29日 12:40:00
主要代码如下:
//////////////////////////////////////////////////////////
// cubic B-spline Interpolate
// n : = num-1,means n segemnt of the knot-zone
// made at 01/11/2004 by jzp
//////////////////////////////////////////////////////////

#define  INTERPDGR 3
#define  _DelPointGroup_(x)/
                                            {/
                                              assert((x));/
                                              delete [](x);/
                                              (x)=NULL;/
                                             }
void  CSpline::InterpolateValue(int n)
{
 CPoint3D * InterPoints;
 InterPoints = new CPoint3D [n+3];
 // convey
 Convey2InterpolatePoints();
 //
 InterPoints[0] = pInterpolatePoints[0];
 for (int i = 2; i <= n; i ++)
 {
  InterPoints[i] =  pInterpolatePoints[i-1];
 }
 InterPoints[n+2] = pInterpolatePoints[n];
 // assign the B-Spline object
 SetDegree(INTERPDGR);
 mKnotNumber = n+1;
 SetCPNumber(n+INTERPDGR);
 AssignMemory();
 // define  the coefficient matrix
 double f3,g3,coef,temp,*TriDiaMatrix[3];
 for (i = 0; i < 3; i ++)
 {
  TriDiaMatrix[i] = new double [n+3];
 }
 //_________________________________
 // assign the knot value
 double edgelength;
 CPoint3D Edge;
 double *t;
 t = new double[n+1];
 t[0] = 0.0;
 edgelength = SplineEdgeLong(n+1);
 /*for (i = 1; i <= n; i ++)
 {
  Edge = pInterpolatePoints[i] - pInterpolatePoints[i-1];
  edgelength +=  Edge.length();
 }*/
 for (i = 1; i <= n; i ++)
 {
  Edge = pInterpolatePoints[i] - pInterpolatePoints[i-1];
  t[i] = t[i-1] + Edge.length()/edgelength;
 }
 // assign the knot vector
 pKnotValue[0] = 0.0;
    pMultiDegree[0] = INTERPDGR+1;
 for (i = 1; i < n; i ++)
    {
        pKnotValue[i] = t[i];
        pMultiDegree[i] = 1;
    }
    pKnotValue[n] = t[n];
    pMultiDegree[n] = INTERPDGR+1;
 // assign the coefficient matrix
 // / / /
 //   0 1 2
 //     / / /
 // swap the two rows at head and tail
 TriDiaMatrix[1][0] = 1.0;//CalSplineBasis(0,3,t[0]);
 TriDiaMatrix[2][0] = 0.0;
 TriDiaMatrix[2][1] = t[1]-t[0];
 TriDiaMatrix[0][0] = t[2]-t[0];
 TriDiaMatrix[1][1] = 2*t[0]-t[1]-t[2];
 TriDiaMatrix[1][n+2] = 1.0;//CalSplineBasis(n+2,3,t[n]);
 TriDiaMatrix[0][n+1] = 0.0;
 TriDiaMatrix[0][n] = t[n]-t[n-1];
 TriDiaMatrix[2][n+1] = t[n]-t[n-2];
 TriDiaMatrix[1][n+1] = 2*t[n-2]-t[n-1]-t[n];
 // assign the rest rows
 for (i = 1; i <= n-1; i ++)
 {
  TriDiaMatrix[0][i] = CalSplineBasis(i,3,t[i]);
  TriDiaMatrix[1][i+1] = CalSplineBasis(i+1,3,t[i]);
  TriDiaMatrix[2][i+1] = CalSplineBasis(i+2,3,t[i]);
 }
 // simplize the coefficient matrix,diagonalize the matrix
 for (i = 0; i <= n ; i ++)
 {
  coef = TriDiaMatrix[0][i]/TriDiaMatrix[1][i];
  TriDiaMatrix[0][i] = 0.0;
  TriDiaMatrix[1][i+1] -= coef*TriDiaMatrix[2][i];
  InterPoints[i+1] = InterPoints[i+1] - InterPoints[i]*coef ;
 }
 //__________________________________________________
 CPoint3D *CtrlPoints;
 CtrlPoints = new CPoint3D [n+3];
 // calculate the Control points
 CtrlPoints[n+2] = InterPoints[n+2]*(1.0/TriDiaMatrix[1][n+2]);
 for (i = n+1; i >= 0; i --)
 {
  CtrlPoints[i] = (InterPoints[i] - CtrlPoints[i+1]*TriDiaMatrix[2][i])*(1.0/TriDiaMatrix[1][i]);
 }
 memcpy(pControlPoints,CtrlPoints,sizeof(CPoint3D)*(n+3));
 _DelPointGroup_(t);
 _DelPointGroup_(CtrlPoints);
 _DelPointGroup_(InterPoints);
 for (i = 0; i < 3; i ++)
 {
  _DelPointGroup_(TriDiaMatrix[i]);
 }
}
算法实现参考《计算机辅助几何设计》王国瑾 汪国昭 郑建民

利用openCV画出B样条基函数的曲线

最近要做双三次B样条插值(bicubic),从基础的三次B样条开始看起,但是网上基本没有介绍B样条基函数的文章,所以在这里写下来,方便他人参考。 对于三次均匀的B样条曲线,其递推公式如下: ...
  • hu_guan_jie
  • hu_guan_jie
  • 2016年03月26日 16:32
  • 1926

三次B样条曲线拟合算法

三次B样条曲线方程B样条曲线分为近似拟合和插值拟合,所谓近似拟合就是不过特征点,而插值拟合就是通过特征点,但是插值拟合需要经过反算得到控制点再拟合出过特征点的B样条曲线方程。这里会一次介绍两种拟合算法...
  • liumangmao1314
  • liumangmao1314
  • 2017年01月17日 22:10
  • 7095

基于opencv的b样条实现

  • 2013年04月27日 23:18
  • 1.44MB
  • 下载

三次B样条曲线算法实现

  • 2009年10月29日 11:27
  • 252KB
  • 下载

三次样条插值(Cubic Spline Interpolation)及代码实现(C语言)

样条插值是一种工业设计中常用的、得到平滑曲线的一种插值方法,三次样条又是其中用的较为广泛的一种。本篇介绍力求用容易理解的方式,介绍一下三次样条插值的原理,并附C语言的实现代码。 1. 三次样条曲...
  • flyingleo1981
  • flyingleo1981
  • 2016年11月02日 16:07
  • 10373

[图形学] B样条曲线 - 原理和C++实现的演示程序(附源码)

大二的时候,曾受老师所托,用C++而不是OpenGL去写B样条曲线的教学程序。时隔一年,发现源码找不见了,所以重新写了一遍,也完善了部分功能,顺便发一篇博客分享一下。         这里给出的资源有...
  • Mahabharata_
  • Mahabharata_
  • 2017年05月13日 19:08
  • 3848

C2连续的三次B样条插值(c++)

主要代码如下://////////////////////////////////////////////////////////// cubic B-spline Interpolate// n :...
  • coolend
  • coolend
  • 2004年12月29日 12:40
  • 2842

c2

面试题
  • janeqi1987
  • janeqi1987
  • 2011年02月25日 21:04
  • 292

三次样条插值算法的C++实现

头文件: /* * Copyright (c) 2008-2011 Zhang Ming (M. Zhang), zmjerry@163.com * * This program is...
  • u012856866
  • u012856866
  • 2014年04月17日 18:49
  • 3362

三次样条插值函数(C++版)

double spl2(double x[],                                                                /*x坐标序列*/    ...
  • twicave
  • twicave
  • 2008年08月21日 17:25
  • 7381
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C2连续的三次B样条插值(c++)
举报原因:
原因补充:

(最多只允许输入30个字)