📄 划线的好的算法.txt
字号:
划线的好的算法! [haotz] [73次] 2001-1-9 9:31:47
大虾们好!
那位大虾知道从a(x0,y0) 到b(x1,y1) 画一条线的好的算法,用y=kx+b,k=(y1-y0)/(x1-
x0) ,b=y0+mx0,的公式,中间用到浮点数,速度慢,请大虾指教。
haotz 2000/1/9
用整数运算 [zsr] [39次] 2001-1-9 12:48:33
如结果要取整,不要用浮点数求K, 直接用(Y1-Y0)*X/(X1-X0),当然 Y1-Y0 和
X1-X0 二个常数可以先算好并保存。如想结果四舍五入,可以把除后的余数左移一
位,比X1-X0大,结果加1。
在8051中还必须用有符号整数也很慢! [haotz] [17次] 2001-1-9 13:50:35
要这么快干嘛?换个40MHz的crystal算啦! [8051] [19次] 2001-1-9 15:48:41
or PIII
为什么要用有符号整数?平移一下坐标原点使没有负坐标不就行了。 [zsr] [13次] 2001-1-9 16:17:17
放大小数为整数 [xiaoqi.] [27次] 2001-1-10 0:27:16
实际控制中速度不是大问题,关键倒是误差!要做好余数补偿,以保证多条线段以后
能归位,提高重复精度。
谢谢诸位,我已找到了标准算法,请看: [haotz] [80次] 2001-1-11 22:36:08
void line(char startx,starty,char endx,char endy,char color) small
{
register char t,distance;
char xerr=0,yerr=0,delta_x,delta_y;
char incx,incy;
/* compute the distance in both directions */
delta_x=endx-endy;
delta_y=endy-starty;
/* compute the direction of the increment ,
an increment of "0" means either a vertical or horizontal lines
*/
if(delta_x>0) incx=1;
else if( delta_x==0 ) incx=0;
else incx=-1;
if(delta_y>0) incy=1;
else if( delta_y==0 ) incy=0;
else incy=-1;
/* determine which distance is greater */
delta_x = cabs( delta_x );
delta_y = cabs( delta_y );
if( delta_x > delta_y ) distance=delta_x;
else distance=delta_y;
/* draw the line */
for( t=0;t <= distance+1; t++ ) {
set_pixel(startx,starty,color);
xerr += delta_x ;
yerr += delta_y ;
if( xerr > distance ) {
xerr-=distance;
startx+=incx;
}
if( yerr > distance ) {
yerr-=distance;
starty+=incy;
}
}
}
点击这里回复这篇贴子>>
_____________________________________________________________________________
Copyright?,C51BBS论坛 2000-2001
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -