0

ベジェ曲線描画ルーチンのプリミティブバージョンがあります。ここにあります

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);

    }

}

少なくとも私の古いペンティアム4では、float-> intのキャストが遅いため、これは非常に遅いです(このようなキャストは、ここでは実際に90%の時間を消費しますが、setpixelがコメントされている場合は30kベジエ/秒です)。

それで、私はそれを固定小数点アーティメティックに書き直すというアイデアを思いつきましたが、私はこれについてあまり経験がありません-固定小数点に書き直す方法は?(tが0.0から1.0の範囲にあることに注意してください)

編集:質問の2番目の部分:ベジェ曲線の長さをピクセル単位で見積もる方法(ピクセルを描画する必要があります)?わからない

4

2 に答える 2

3

固定小数点を使用することに加えて、方程式の前方差分を計算できるため、各ステップは乗算ではなく一連の加算になります。これは通常、より高速です。

ドブス博士の合理的な説明; ここに短い説明とコード

于 2012-09-14T22:47:46.683 に答える
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);

     }

     }

floatからintへの変換がないため、3.5倍高速です。計算時間を測定したところ、80ミリ秒に対して約115ミリ秒(3kで、古いプロセッサでは)なので、ここではintはそれほど高速ではありません(aqbout 30%のみ:O)

于 2012-09-14T21:06:17.307 に答える