求画直线的算法
能和API中的LineTo一样就行 问题点数:50、回复次数:4Top
1 楼akun(疑无路)回复于 2002-11-13 17:50:34 得分 0
找图形学的书看看~~~~~Top
2 楼masterz(www.fruitfruit.com)回复于 2002-11-13 18:51:55 得分 50
//The DDA algorithm
#define ROUND(a) ((int)a+0.5)
void lineDDA(int xa, int ya,int xb,int yb,HDC dc)
{
int dx=xb-xa, dy=yb-ya;
int steps,k;
float xincrement ,yincrement,x=xa,y=ya;
if(abs(dx)>abs(dy))
steps=abs(dx);
else
steps=abs(dy);
xincrement=dx/(float)steps;
yincrement=dy/(float)steps;
SetPixel(dc,ROUND(x),ROUND(y),RGB(255,0,0));
for(k=0;k<steps;k++)
{
x+=xincrement;
y+=yincrement;
SetPixel(dc,ROUND(x),ROUND(y),RGB(255,0,0));
}
}
//the Bresenham algorithm
void lineBres(int xa,int ya,int xb,int yb,HDC dc)
{
int dx=abs(xa-xb);
int dy=abs(ya-yb);
int p=2*dy-dx;
int twody=2*dy;
int twodydx = 2*(dy-dx);
int x,y,xend;
if(xa>xb)
{
x=xb; y=yb;
xend=xa;
}
else
{
x=xa;y=ya;
xend=xb;
}
SetPixel(dc,(x),(y),RGB(255,0,0));
while(x<xend)
{
x++;
if(p<0)
p+=twody;
else
{
y++;
p+=twodydx;
}
SetPixel(dc,(x),(y),RGB(255,0,0));
}
}Top
3 楼iicup(双杯献酒)回复于 2002-11-13 18:54:56 得分 0
图形学的基本问题,
不过并不是三言两语所能说清楚。Top
4 楼JennyVenus()回复于 2002-11-14 12:22:47 得分 0
masterz的代码是利用插补实现的,使用简单的+-法代替浮点*/运算
Top




