我用beizer曲线将椭圆分成8段弧,然后画了椭圆,椭圆是对称画的,可是出来的效果却差强人意,存在以下问题...1、右下角(第4象限)的弧明显和其它3段不对称,往里面凹进去,在想是不是beizer曲线的控制点取得不好。
    我是连接椭圆的外界矩形的对角线与椭圆会有交点,过交点做椭圆的切线分别与椭圆的外接矩形相较于两个点,这2个交点便分别是2段beizer曲线的控制点。
    如果有更好的控制点的取法,请问是怎样取?
2、如果椭圆画得很的话,会非常不好看,不仅不圆,连椭圆的形状都走样得很厉害!
3、如果我把椭圆的线宽设为0,则走样得很厉害,而GDI+提供的反走样函数smoothmode似乎只有在有边的时候才能处理,我目前的处理方法是就算边界是0的时候,也用填充的颜色再画一个圈,可是存在的问题是如果我用渐进色填充椭圆的话,那就不能用此方法处理。很紧急!麻烦各位达人帮帮忙!!

解决方案 »

  1.   

    用bezier曲线逼近?误差大吧,为什么不试试其它方法。
      

  2.   

    beizer曲线只用记录控制点就可以了,在一些变换的时候省了很多事情....而且后面很多的功能也都是基于beizer曲线来做的我使用8段弧表示的椭圆,每个弧为一个2次beizer曲线,现在就是不知道误差处在哪里~~还是beizer的控制曲线没有取好.....求达人...55555555555555
      

  3.   

    http://www.codeguru.com/cpp/g-m/gdi/article.php/c131/看看这篇文章,我以前用这个方法做过椭圆旋转,效果很好。
      

  4.   

    我回头试试用bezier曲线,不过就问题来说
    1.采用镜像,应该不会出现。
    2.没办法,光栅化的通病。
      

  5.   

    谢谢~~但新的问题又来了....1、你提供的算法是用4段3阶的(4个控制点)beizer线段模拟的,而我需要用8段2阶的(3个控制点)beizer曲线来模拟。这也和后面的功能牵扯有关...囧...2、我想问一下那个常数0.552是怎么得来的???就是代码中的
        // MAGICAL CONSTANT to map ellipse to beziers
        //   2/3*(sqrt(2)-1) 
        const double EToBConst = 0.2761423749154;
                                                                 ....居然还magical...额...
      

  6.   

    就是如下图
    6楼的文章~~http://www.codeguru.com/cpp/g-m/gdi/article.php/c131/ 
      

  7.   

    回复7楼~~1、我用flash cs3画的时候,右下角依然有问题~~~2、缩小之后,如果进行反走样处理可以解决这种问题么?
      

  8.   

    Bezier只能准确表示抛物线,椭圆这样的二次曲线用NURBS曲线表示