小弟有一个问题,在VC中,可以使用CDC类成员函数PolyBezier画一条通过几个指定点的贝塞尔曲线,问题是这样的,我现在想获得这条贝塞尔曲线上所有点的坐标,问应该如何实现!不知哪位大哥能帮个忙的呀!

解决方案 »

  1.   

    orbit(走了走了):那样是不是太复杂了呀!既然画贝塞尔曲线的方法(算法)已经集成到window操作系统中去,那么应该就有相应的方法的呀!我想是不是可以设置相应的回调函数,这样每当polybizier函数每计算出一个点的坐标后就调用这个回调函数的呀!不知楼下的怎么想的呀?
      

  2.   

    生成贝塞尔曲线的方程太多了,不知道Windows采用的是什么方法,但是不论如何,
    不会有象画直线那样的LineToDDA调用,因为画出的贝塞尔曲线本身并不是曲线,只
    是通过导出方程,设置取样间隔得到的近似,是一条折线
      

  3.   

    //pt1,pt2 为贝塞尔曲线的两控制点,middle为贝塞尔曲线上的点,void  Bezier_middle(POINT &middle,POINT &pt1,POINT &pt2 )  
    {
       double  x  =  0;  
       double  y  =  0;  
       double x0 = (pt1.x+pt2.x)/2;
       double y0 = (pt1.y+pt2.y)/2;   if(pt1.y>pt2.y)
       {
    if(pt1.x>pt2.x)
    {
    x = (pt1.y-pt2.y)/2 + x0;
    y = (pt2.x-pt1.x)/2 + y0;
    }
    else
    {
    x = (pt1.y-pt2.y)/2 + x0;
    y = (pt2.x-pt1.x)/2 + y0;
    }
       }
       else
       {
    if(pt1.x>pt2.x)
    {
    x = (pt1.y-pt2.y)/2 + x0;
    y = (pt2.x-pt1.x)/2 + y0;
    }
    else
    {
    x = (pt1.y-pt2.y)/2 + x0;
    y = (pt2.x-pt1.x)/2 + y0;
    }
       }   middle.x  =  (long)x  ;  
       middle.y  =  (long)y  ;  }
      

  4.   

    BeginPath();
    pDC->PolyBezier();
    EenPath();
    long lNumPoints = pDC->GetPath();
    CPoint* pcPoints = new CPoint[lNumPoints];
    pDC->GetPath(lNumPoints, pcPoints);
      

  5.   

    哦对了,取点之前还得FlatternPath()一下
      

  6.   

    参考http://mathforum.org/library/drmath/view/54434.html由五个点(x0,y0)......(x4,y4)控制的贝赛尔曲线公式就是
    x(t)=
    (1-t)^4*x0
    +4*(1-t)^3*t*x1
    +6*(1-t)^2*t^2*x2
    +4*(1-t)*t^3*x3
    +t^4*x4
    y(t)就是把上式中的x0……x4分别对应换成y0……y4x0……前面的系数其实就是由
    1=(1-t)+t其中t取值从0到1,改变t的值就可以获得贝赛尔曲线上所有的点了吧其中t是从0到1取值的,改变t的值就能
      

  7.   

    不好意思没写完,再发一遍参考http://mathforum.org/library/drmath/view/54434.html由五个点(x0,y0)......(x4,y4)控制的贝赛尔曲线公式就是
    x(t)=
    (1-t)^4*x0
    +4*(1-t)^3*t*x1
    +6*(1-t)^2*t^2*x2
    +4*(1-t)*t^3*x3
    +t^4*x4
    y(t)就是把上式中的x0……x4分别对应换成y0……y4x0……前面的系数其实就是由
    1=(1-t)+t
    然后1^n=((1-t)+t)^n展开所得多项式的各项就是了,n是控制点的个数减一其中t取值从0到1,改变t的值就可以获得贝赛尔曲线上所有的点了吧还有Win32编程时绘制该曲线的函数原型如下:
    The PolyBezier function draws one or more Bézier curves. BOOL PolyBezier(
      HDC hdc,            // handle to device context
      CONST POINT *lppt,  // pointer to endpoints and control points
      DWORD cPoints       // count of endpoints and control points
    );