2012-09-14 35 views
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); 

    } 

} 

這是因爲緩慢的浮子的非常慢> INT鑄造, 至少在我的舊奔騰4上(這樣的鑄造在這裏真的消耗90%的時間,實際上是3k貝齊爾/秒,而setpixel被評論時爲30k貝齊爾/秒)。

所以我有一個想法,重寫它到定點arthimetic,但我不是 很多與此有關的經驗 - 如何將其重寫到固定點? (注意,t是在0.0到1.0的範圍內)

編輯: 問題的第二部分:如何估計貝塞爾曲線 的以像素爲單位的長度(像素需要繪製)?還是不知道

+2

FWIW,我不知道什麼'SetPixel'正在做什麼,但我不知道我會通過評論該行的結論得出結論,你會看到由於整型轉換造成的差異。你也沒有對數據做任何事情。只是FWIW。 –

+1

是的,這不僅僅是投射,而且還會設置像素,這也可能會打到記憶。我認爲如果你想加快速度,那麼適應的步長將會帶來最好的效果。對於大多數曲線,您可能不需要1000步。 – Adam

+0

這是因爲鑄造我告訴你;-)(可以把一些整數i ++ j ++代替int(x)和int(y),它是一樣的)通過setpixel填充屏幕需要大約10毫秒 - 3k貝齊爾witk int(x),int(y)在沒有它的情況下需要1000毫秒100 ms:O - 但我不是問這個問題,還需要計算像素的數量是第二個問題 –

回答

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

    } 

    } 

是3.5×更快becouse沒有浮到int轉換。 當我測量計算的時候,它是大約115毫秒 與80毫秒,(它3K和我的舊處理器),所以整數 在這裏不是要快得多(aqbout只有30%:O)

3

除了使用固定點,可以計算方程的前向差分,所以每一步都是一系列加法而不是乘法。這通常更快。

合理解釋Dr Dobbs;較短的解釋和代碼here

+0

atrite,tnx,我會檢查它 –