定点数的DDA快赶上bresenham算法了,正常吗?

weiweishuo 2013-03-11 07:39:56
用定点数实现的dda直线算法都快赶上bresenham算法了,先看dda算法:
void drawLine_dda_fixed(int x0,int y0,int x1,int y1){
int x0_x1=x1-x0;
int y0_y1=y1-y0;
if((x0_x1>0?x0_x1:-x0_x1)>(y0_y1>0?y0_y1:-y0_y1)){
//直线趋于水平,故沿x轴逐点描画
//保证x0_x1指向x轴正方向
if(x0_x1<0){
int temp=x0;
x0=x1;
x1=temp;
temp=y0;
y0=y1;
y1=temp;
}
fixed k=(INT_TO_FIXED(y1)-INT_TO_FIXED(y0))/(x1-x0);//使用顶点数来代替浮点数,是为了在下面的for循环里避开类型转换
fixed y=INT_TO_FIXED(y0);
for(int x=x0;x<=x1;x++){
*(pt_memBuffer+(x<<2)+(FIXED_TO_INT(y+32768)*5504))=0xff;
y+=k;
}
}
else{
//直线趋于竖直,故沿y轴逐点描画
//确保y0_y1沿y正方向
if(y0_y1<0){
int temp=x0;
x0=x1;
x1=temp;
temp=y0;
y0=y1;
y1=temp;
}
fixed dxdy=(INT_TO_FIXED(x1)-INT_TO_FIXED(x0))/(y1-y0);//使用顶点数来代替浮点数,是为了在下面的for循环里避开类型转换
fixed x=INT_TO_FIXED(x0);
for(int y=y0;y<=y1;y++){
*(pt_memBuffer+(FIXED_TO_INT(x+32768)<<2)+y*5504)=0xff;
x+=dxdy;
}
}
}

再看bresenham算法的一个一部分,对应-1<k<0
void drawLine_brshm(int x0,int y0,int x1,int y1){
int x0_x1_int=x1-x0;
int y0_y1_int=y1-y0;

if((x0_x1_int>0?x0_x1_int:-x0_x1_int)>(y0_y1_int>0?y0_y1_int:-y0_y1_int)){
if(x0>x1){
EXCHANGE_INT(x0,x1);
EXCHANGE_INT(y0,y1);
}
int _2dx=x0_x1_int<<1;
int _2dy=y0_y1_int+y0_y1_int;//may be negative
int _2ddx=-x0_x1_int;
char*pt_write=pt_memBuffer+(x0<<2)+y0*bytes_w;
if(y0>y1){
_2dy=-_2dy;//k=-k
for(int x=x0;x<=x1;x++){
if(_2ddx>0){
*(pt_write-bytes_w)=0xff;
if(_2ddx>x0_x1_int){
_2ddx-=_2dx;
pt_write-=bytes_w;//affected by y--
}
}
else{
*pt_write=0xff;
}
_2ddx+=_2dy;
pt_write+=4;
}
}
}
}

执行5000*100次,两种算法的开销都在60~70ms,这正常吗?
是不是我的bresenham算法实现的有问题?
欢迎高手指教,如果我交代的信息不够,指出后会第一时间补充。
...全文
99 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧