bezier绘制例程到固定点(如何重写)

时间:2012-09-14 18:28:15

标签: c++ c optimization

我有一些贝塞尔曲线绘制的原始版本 例程,这里是

void DrawBezier(float ax, float ay,
            float bx, float by,
            float cx, float cy,
            float dx, float dy, unsigned color)
{
    float step = 1.0/1000.0;

    for(float t=0; t<=1; t+=step)
    {
    float u = 1.0-t;

    float a =     u*u*u;
    float b = 3.0*u*u*t;
    float c = 3.0*u*t*t;
    float d =     t*t*t;

    float x = ax*a + bx*b + cx*c + dx*d;
    float y = ay*a + by*b + cy*c + dy*d;

    SetPixel(int(x),int(y), color);

    }

}

由于缓慢的float-&gt; int cast,这非常慢 至少在我的旧奔腾4上(这种铸件在这里消耗了90%的时间 实际上,当setpixel被注释时,3k贝塞尔/秒与30k贝塞尔/秒。

所以我有一个想法将它重写为定点关节镜,但我不是 对此有很多经验 - 如何将其重写为固定点? (注意t在0.0到1.0的范围内)

编辑: 问题的第二部分:如何估计贝塞尔的长度 以像素为单位的曲线(需要绘制像素)?不知道

2 个答案:

答案 0 :(得分:3)

除了使用固定点之外,您还可以计算方程的正向差异,因此每个步骤都是一系列加法而不是乘法。这通常更快。

Dr Dobbs中的合理解释;更简短的解释和代码here

答案 1 :(得分:1)

Allrite我这样做了

    void DrawBezierFX( int ax, int ay,
               int bx, int by,
               int cx, int cy,
               int dx, int dy, unsigned color)
    {

    for(unsigned i=0; i<=1024; i+=1)
    {
     unsigned t = i<<5;

     unsigned u = (1024-i)<<5;

     unsigned a = ((((u*u)>>15)*u)>>15);
     unsigned b = ((((t*u)>>15)*u)>>15)*3;
     unsigned c = ((((t*t)>>15)*u)>>15)*3;
     unsigned d = ((((t*t)>>15)*t)>>15);


     int x = ax*a + bx*b + cx*c + dx*d;
     int y = ay*a + by*b + cy*c + dy*d;

     SetPixel(x>>15 ,y>>15, color);

     }

     }

由于没有浮点转换为int转换速度快3.5倍。 当我测量计算时间时,它大约是115毫秒 与80毫秒,(3k和我的旧处理器),所以整数 在这里没有那么快(仅限30%:O)