有关位运算的奇怪问题
最近上图形学,想写一个自己的图形库,用bresenham算法写了一个line函数,然后优化了一下,很简单,就是把2*dy--->dy<<1,但是奇怪的是没优化之前画线是很正确的,但优化之后就不对了.
下面是代码,/**/里的是我没优化的:
void line(int x1,int y1,int x2,int y2,BYTE color)/*最终优化的画线算法*/
{
int i,x,y,d1,d2,dx,dy,dxabs,dyabs,sdx,sdy;
dx=x2-x1;dy=y2-y1;
dxabs=abs(dx);dyabs=abs(dy);
d1=2*dyabs-dxabs;/* for m<1 */
d2=2*dxabs-dyabs;/* for m>1 */
sdx=sgn(dx);sdy=sgn(dy);/*for start point's value lower than end point*/
x=x1;y=y1;
put_pixel(x,y,color);
if(dxabs>=dyabs){
x+=sdx;
for(i=0;i<dxabs;i++){
if(d1<0)
d1+=dy<<1;/* d1+=2*dy; */
else{
y+=sdy;
d1=(dy-dx)<<1;/* d1+=2*(dy-dx); */
}
put_pixel(x,y,color);
}
}
else{
for(i=0;i<dyabs;i++){
y+=sdy;
if(d2<0)
d2+=dx<<1;/* d2+=2*dx; */
else{
x+=sdx;
d2=(dx-dy)<<1;/* d2+=2*(dx-dy); */
}
put_pixel(x,y,color);
}
}
}
还有,我曾经测试过类似x=y<<1的位运算,他不改变y的值,也就是说假设y=3,执行x=y<<1后,x=6,y=3
问题点数:100、回复次数:4Top
1 楼donghaish(roland)回复于 2006-03-15 18:04:16 得分 0
不好意思,我自己顶一个,我过会就回学校了,急啊!Top
2 楼ykzhujiang(朱朱)回复于 2006-03-15 18:20:45 得分 100
y<<1当然不改变y的值
就像a+b不改变a和b是一个道理
你上面写得有些问题是因为原来是+=
应该改成d2=d2+(dx-dy)<<1
注意看一下,else里面那个,估计是你当时疏忽了Top
3 楼minsavage(帆野)回复于 2006-03-15 18:32:29 得分 0
楼上正解 d1+=dy<<1 应该改为 d1 += (dy <<= 1)
这样应该就没问题了
楼主如果用VC的话 可以按F10单步跟踪一下 看看变量的值就应该知道为什么了Top
4 楼donghaish(roland)回复于 2006-03-15 18:38:18 得分 0
to ykzhujiang(朱朱):
哈哈,谢谢,真不好意思.我看了半天没看出来,太粗心了:)
Top




