后来经过研究发现这样是正确的,因为我的函数使用Bresenham法进行画直线<br />:<br />void GUI_Line(uint32 x0, uint32 y0, uint32 x1, uint32 y1, TCOLOR color)<br />{ int32 dx; // 直线x轴差值变量<br /> int32 dy; // 直线y轴差值变量<br /> int8 dx_sym; // x轴增长方向,为-1时减值方向,为1时增值方向<br /> int8 dy_sym; // y轴增长方向,为-1时减值方向,为1时增值方向<br /> int32 dx_x2; // dx*2值变量,用于加快运算速度<br /> int32 dy_x2; // dy*2值变量,用于加快运算速度<br /> int32 di; // 决策变量<br /> <br /> <br /> dx = x1-x0; // 求取两点之间的差值<br /> dy = y1-y0;<br /> <br /> /* 判断增长方向,或是否为水平线、垂直线、点 */<br /> if(dx>0) // 判断x轴方向<br /> { dx_sym = 1; // dx>0,设置dx_sym=1<br /> }<br /> else<br /> { if(dx<0)<br /> { dx_sym = -1; // dx<0,设置dx_sym=-1<br /> }<br /> else<br /> { // dx==0,画垂直线,或一点<br /> GUI_RLine(x0, y0, y1, color);<br /> return;<br /> }<br /> }<br /> <br /> if(dy>0) // 判断y轴方向<br /> { dy_sym = 1; // dy>0,设置dy_sym=1<br /> }<br /> else<br /> { if(dy<0)<br /> { dy_sym = -1; // dy<0,设置dy_sym=-1<br /> }<br /> else<br /> { // dy==0,画水平线,或一点<br /> GUI_HLine(x0, y0, x1, color);<br /> return;<br /> }<br /> }<br /> <br /> /* 将dx、dy取绝对值 */<br /> dx = dx_sym * dx;<br /> dy = dy_sym * dy;<br /> <br /> /* 计算2倍的dx及dy值 */<br /> dx_x2 = dx*2;<br /> dy_x2 = dy*2;<br /> <br /> /* 使用Bresenham法进行画直线 */<br /> if(dx>=dy) // 对于dx>=dy,则使用x轴为基准<br /> { di = dy_x2 - dx;<br /> while(x0!=x1)<br /> { GUI_Point(x0, y0, color);<br /> x0 += dx_sym;<br /> if(di<0)<br /> { di += dy_x2; // 计算出下一步的决策值<br /> }<br /> else<br /> { di += dy_x2 - dx_x2;<br /> y0 += dy_sym;<br /> }<br /> }<br /> GUI_Point(x0, y0, color); // 显示最后一点<br /> }<br /> else // 对于dx<dy,则使用y轴为基准<br /> { di = dx_x2 - dy;<br /> while(y0!=y1)<br /> { GUI_Point(x0, y0, color);<br /> y0 += dy_sym;<br /> if(di<0)<br /> { di += dx_x2;<br /> }<br /> else<br /> { di += dx_x2 - dy_x2;<br /> x0 += dx_sym;<br /> }<br /> }<br /> GUI_Point(x0, y0, color); // 显示最后一点<br /> } <br /> <br />}<br />鉴于暂时对这里要求不是很高,所以没有继续研究
|