我有一些贝塞尔曲线绘制的原始版本 例程,这里是
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的范围内)
编辑: 问题的第二部分:如何估计贝塞尔的长度 以像素为单位的曲线(需要绘制像素)?不知道
答案 0 :(得分:3)
答案 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)