我现在做的程序是:在VB环境下,根据已知数据,利用三次B样条函数光滑,请求帮助,奉送100分作为报答!

解决方案 »

  1.   

    这儿有个C语言的你参照一下吧
    三次B样条曲线的基函数为G03(t)=1/6(-t^3+3*t^2-3*t+1)
    G13(t)=1/6(3*t^3-6*t^2+4)
    G23(t)=1/6(-3*t^3+3*t^2+3*t+1)
    G33(t)=1/6*t^3三次B样条曲线段P3(t)=1/6*[t^3  t^2  t  1][-1 3 -3 1
                                                  3 -6 3 0
                                                 -3 0  3 0             (T)
                                                  1 4  1 0][p0 p1 p2 p3]-->(转置)四个离散点为 p0 p1 p2 p3
    #include<graphics.h>
    #include<conio.h>
    #define N 10float px[N]={60,95,152,117,225,302,380,318,449,502};
    float py[N]={98,65,54,152,243,98,102,202,248,130};main()
    {
       float a0,a1,a2,a3,b0,b1,b2,b3;
       int k,x,y;
       float i,t,dt;   int graphDriver=DETECT;
       int graphMode=0;
       initgraph(&graphDriver,&graphMode,"");   setbkcolor(BLUE);
       setcolor(YELLOW);   line(50,300,600,300);
       line(100,10,100,320);   dt=1/(float)N;
       for(k=0;k<N;k++)
          {
             if(k==0)
             moveto(px[k]+100,300-py[k]);
             lineto(px[k]+100,300-py[k]);
          }
       setlinestyle(0,0,3);
       for(k=0;k<N-3;k++)
           {
              a0=(px[k]+4*px[k+1]+px[k+2])/6;
              a1=(px[k+2]-px[k])/2;
              a2=(px[k]-2*px[k+1]+px[k+2])/2;
              a3=-(px[k]-3*px[k+1]+3*px[k+2]-px[k+3])/6;          b0=(py[k]+4*py[k+1]+py[k+2])/6;
              b1=(py[k+2]-py[k])/2;
              b2=(py[k]-2*py[k+1]+py[k+2])/2;
              b3=-(py[k]-3*py[k+1]+3*py[k+2]-py[k+3])/6;         for(i=0;i<N;i+=0.1)
                  {
                        t=i*dt;
                        x=100+a0+a1*t+a2*t*t+a3*t*t*t;
                        y=300-(b0+b1*t+b2*t*t+b3*t*t*t);
                        if(i==0.0)
                            moveto(x,y);
                            lineto(x,y);
                 }
           }
        getch();
        closegraph();
    }
      

  2.   

    1、float   px[N]={60,95,152,117,225,302,380,318,449,502}; 
       float   py[N]={98,65,54,152,243,98,102,202,248,130}; 
      是离散点数据是不是,后面的画的线是什么意思?
          line(50,300,600,300); 
          line(100,10,100,320); 
    2、      for(k=0;k <N;k++) 
                { 
                      if(k==0) 
                      moveto(px[k]+100,300-py[k]); 
                      lineto(px[k]+100,300-py[k]); 
                } 
          setlinestyle(0,0,3); 
          for(k=0;k <N-3;k++) 
    这段代码是什么意思?
     3、x=100+a0+a1*t+a2*t*t+a3*t*t*t; 
        y=300-(b0+b1*t+b2*t*t+b3*t*t*t); 
    其中100、300是指什么?
      

  3.   

    我来解释吧数组后的大括号内的数据确是初始数据。
    lineto 是画线,参数分别是x1,x2,y1,y2中间一段也是画线,看一下就明白。最后的100、300是图像的初始横纵坐标。这些跟算法都没有关系的。
      

  4.   

    我找了一段代码,但运行出来结果不对,请问哪儿出错,请帮忙修改
    Private Sub Command1_Click()
      Dim cx, cy, i, n As Integer
      n = 9
      Dim t, t2, t3, a0, a1, a2, a3, b0, b1, b2, b3, dt, xa, ya As Double
      cx = 10
      cy = 160
      Dim x(4), y(4) As Integer
      Picture1.Scale (0, 0)-(300, 300)
      x(0) = 30: x(1) = 60: x(2) = 120: x(3) = 220
      y(0) = 30: y(1) = 110: y(2) = 150: y(3) = 50
      Picture1.DrawWidth = 5  For i = 0 To 3
      
        Picture1.PSet (x(i), y(i)), RGB(255, 0, 0)
      Next i
      Picture1.DrawWidth = 2
      For i = 0 To 2
        Picture1.Line (x(i), y(i))-(x(i + 1), y(i + 1)), RGB(255, 255, 0)
      Next i
      a0 = (x(0) + 4 * x(1) + x(2)) / 6
      a1 = -(x(0) - x(2)) / 2
      a2 = (x(2) - 2 * x(1) + x(0)) / 2
      a3 = -(y(0) - 3 * y(1) + 3 * y(2) - y(3)) / 6
      b0 = (y(0) + 4 * y(1) + y(2)) / 6
      b1 = -(y(0) - y(2)) / 2
      b2 = (y(2) - 2 * y(1) + y(0)) / 2
      b3 = -(y(0) - 3 * y(1) + 3 * y(2) - y(3)) / 6
      dt = 1 / n
      For i = 1 To n Step 0.1
        t = i * dt
        t2 = t * t
        t3 = t2 * t
        xa = a0 + a1 * t + a2 * t2 - a3 * t3 + cx
        ya = cy - (b0 + b1 * t + b2 * t2 + b3 * t3)
        Picture1.PSet (xa, ya)
      Next i
    End Sub