3,881
社区成员
发帖
与我相关
我的任务
分享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;
}
}
}
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;
}
}
}
}