计算机图形学:3种画直线算法
//---------------------------------------------------------------------
//绘制直线的DDA算法基本函数
//---------------------------------------------------------------------
void LineDDA(int x0,int y0,int x1,int y1,int color,HDC hdc)
{
float dy,dx,x,y,m;
dx=x1-x0;
dy=y1-y0;
m=dy/dx;
if(x0<x1)
{
if(m<=1&&m>=-1)
{
y=y0;
for(x=x0;x<=x1;x++)
{
SetPixel(hdc,x,int(y+0.5),color);
y+=m;
}
}
}
if(x0>x1)
{
if(m<=1&&m>=-1)
{
y=y0;
for(x=x0;x>=x1;x--)
{
SetPixel(hdc,x,int(y+0.5),color);
y-=m;
}
}
}
if(y0<y1)
{
if(m>=1||m<=-1)
{
m=1/m;
x=x0;
for(y=y0;y<=y1;y++)
{
SetPixel(hdc,int(x+0.5),y,color);
x+=m;
}
}
}
if(y0>y1)
{
if(m<=-1||m>=1)
{
m=1/m;
x=x0;
for(y=y0;y>=y1;y--)
{
SetPixel(hdc,int(x+0.5),y,color);
x-=m;
}
}
}
}
//---------------------------------------------------------------------
//DDA算法对应的演示功能函数
//---------------------------------------------------------------------
void LineDDA_Demo(int x0,int y0,int x1,int y1,int color,HDC hdc,bool demo)
{
float dy,dx,x,y,m,Time;
Time=timeGetTime();
dx=x1-x0;
dy=y1-y0;
m=dy/dx;
if(x0<x1)
{
if(m<=1&&m>=-1)
{
y=y0;
for(x=x0;x<=x1;x++)
{
BitBlt(hdc,x*10,int(y+0.5)*10,10,10,MemDC,0,0,SRCCOPY);
y+=m;
if(demo)
{
while((timeGetTime()-Time)<delay)
int a=1;
}
Time=timeGetTime();
}
}
}
if(x0>x1)
{
if(m<=1&&m>=-1)
{
y=y0;
for(x=x0;x>=x1;x--)
{
BitBlt(hdc,x*10,int(y+0.5)*10,10,10,MemDC,0,0,SRCCOPY);
y-=m;
if(demo)
{
while((timeGetTime()-Time)<delay)
int a=1;
}
Time=timeGetTime();
}
}
}
if(y0<y1)
{
if(m>=1||m<=-1)
{
m=1/m;
x=x0;
for(y=y0;y<=y1;y++)
{
BitBlt(hdc,int(x+0.5)*10,y*10,10,10,MemDC,0,0,SRCCOPY);
x+=m;
if(demo)
{
while((timeGetTime()-Time)<delay)
int a=1;
}
Time=timeGetTime();
}
}
}
if(y0>y1)
{
if(m<=-1||m>=1)
{
m=1/m;
x=x0;
for(y=y0;y>=y1;y--)
{
BitBlt(hdc,int(x+0.5)*10,y*10,10,10,MemDC,0,0,SRCCOPY);