- 论坛徽章:
- 0
|
用定点数实现的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- oid 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算法实现的有问题?
欢迎高手指教,如果我交代的信息不够,指出后会第一时间补充! |
|