我在autocad中画了样条曲线,鼠标点击四次,其坐标分别为:
(103,111)、(217,153)、(344,103)、(407,195)(注:小数部分已舍去)
我从dxf文件中读出有关三次样条曲线的信息,如下:
控制点有六个,坐标如下:
(103,111)、(140,135)、(219,188)、(350,57)、(389,152)、(407,195)
拟和点有四个,坐标如下:
(103,111)、(217,153)、(344,103)、(407,195)请问:在vc中用什么函数画样条曲线?如果要自己编写函数来画,谁有这样的函数或相关资料?

解决方案 »

  1.   

    PolyBezier
    PolyBezierTo这两个函数可以画,MFC和Win API都有
      

  2.   

    在VC中用PolyBezier画曲线很方便,也是要用四个点。
    你可以试一试
      

  3.   

    PolyBezier和PolyBezierTo是画贝塞尔曲线的吧,昨天我试过,可是画出来的效果不对
      

  4.   

    我看了一下,以上六点刚好组成三段折线,其中第二个点在第一、三点的连线上,第五个点在第四、六点的连线上。 而且,第二、第五个点刚好是样条曲线与折线的切点。
    所以,我设想由第一、三、四、六点来构造样条曲线,而PolyBezier刚好需要四个点......然而,按我的设想画出来的曲线和原曲线相比,曲度小很多(就是比较平),为什么?请高手指点!
      

  5.   

    用OPENGL吧,里面有画样条曲线的函数
      

  6.   

    没错,polybezier不是样条曲线而是贝塞尔曲线,确切来说样条曲线还分为:参数样条曲线和B样条曲线,autocad中画的应该是三次B样条曲线
    用如下代码试试
             int i,n;
    n = 9;
    double t,t2,t3,a0,a1,a2,a3,b0,b1,b2,b3,dt,xa,ya;
    int x[4] = {103,140,219,350};//控制点x坐标
    int y[4] = {111,135,188,57};//控制点y坐标
    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 = -(x[0] - 3 * x[1] + 3 * x[2] - x[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.0/n; for (i = 0; i <= n; i ++)
    {
    t = i * dt;
    t2 = t * t;
    t3 = t2 * t;
    xa = a0 + a1 * t + a2 * t2 + a3 * t3;
    ya = (b0 + b1 * t + b2 * t2 + b3 * t3);
                      if (i == 0)
    pDC->MoveTo(xa,ya);
    else
    pDC->LineTo(xa,ya);
    }