直线生成算法Word格式文档下载.docx
《直线生成算法Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《直线生成算法Word格式文档下载.docx(14页珍藏版)》请在冰点文库上搜索。
0?
(x):
-(x))
CLine:
:
CLine(HDChdc,COLORREFcolor):
m_hdc(hdc),m_color(color){}
voidCLine:
Draw_Line_DDA(intx1,inty1,intx2,inty2)
floatdx,dy,k;
switch(abs(x2-x1)>
abs(y2-y1))
{
casetrue:
{
intx;
floaty;
if(x1>
x2)
{
std:
swap(x1,x2);
swap(y1,y2);
}
dx=x2-x1;
dy=y2-y1;
k=dy/dx;
y=y1;
for(x=x1;
x<
=x2;
++x)
SetPixel(m_hdc,x,int(y+0.5),m_color);
y=y+k;
}
break;
casefalse:
inty;
floatx;
if(y1>
y2)
k=dx/dy;
x=x1;
for(y=y1;
y<
=y2;
++y)
SetPixel(m_hdc,int(x+0.5),y,m_color);
x=x+k;
}
}
Draw_Line_MID(intx1,inty1,intx2,inty2)
inta,b,d1,d2,d,x,y;
if(x2<
x1)
d=x1;
x1=x2;
x2=d;
d=y1;
y1=y2;
y2=d;
a=y1-y2;
b=x2-x1;
x=x1;
y=y1;
if(a<
=0&
&
a>
=-b)
d=2*a+b;
d1=2*a;
d2=2*(a+b);
while(x<
=x2)
SetPixel(m_hdc,x,y,m_color);
if(d<
=0)
x++;
y++;
d+=d2;
else
d+=d1;
}
if(a>
0&
a<
=b)
d=2*a-b;
d1=2*(a-b);
d2=2*a;
if(d>
0)
y--;
}
-b)
d=a+2*b;
d1=2*(a+b);
d2=2*b;
while(y<
=y2)
if(d>
b)
d=a-2*b;
d1=-2*b;
d2=2*(a-b);
while(y>
=y2)
Draw_Line_Bresham(intx1,inty1,intx2,inty2)
intx,y,dx,dy,e;
e=-dx;
for(inti=0;
i<
=dx;
++i)
SetPixel(m_hdc,x,y,m_color);
++x;
e+=dy<
<
1;
if(e>
{
++y;
e-=dx<
}
x=x2;
y=y2;
i>
--i)
e-=dy<
if(e<
--y;
e=-dy;
=dy;
++y;
e+=dx<
++x;
e-=dy<
e-=dx<
--x;
//winmain.cpp
time.h>
LRESULTWINAPIMsgProc(HWNDhWnd,UINTmsg,WPARAMwParam,LPARAMlParam)
intstart,end;
HDChdc;
PAINTSTRUCTps;
CLine*gra1,*gra2,*gra3;
charch[256];
switch(msg)
caseWM_PAINT:
hdc=BeginPaint(hWnd,&
ps);
gra1=newCLine(hdc,RGB(128,0,255));
gra2=newCLine(hdc,RGB(255,128,0));
gra3=newCLine(hdc,RGB(0,255,128));
gra1->
Draw_Line_DDA(300,200,120,258);
Draw_Line_DDA(120,258,230,105);
Draw_Line_DDA(230,105,230,295);
Draw_Line_DDA(230,295,120,142);
Draw_Line_DDA(120,142,300,200);
gra2->
Draw_Line_MID(300,300,120,358);
Draw_Line_MID(120,358,230,205);
Draw_Line_MID(230,205,230,395);
Draw_Line_MID(230,395,120,242);
Draw_Line_MID(120,242,300,300);
gra3->
Draw_Line_Bresham(400,300,220,358);
Draw_Line_Bresham(220,358,330,205);
Draw_Line_Bresham(330,205,330,395);
Draw_Line_Bresham(330,395,220,242);
Draw_Line_Bresham(220,242,400,300);
deletegra1;
deletegra2;
deletegra3;
EndPaint(hWnd,&
caseWM_DESTROY:
PostQuitMessage(0);
return0;
returnDefWindowProc(hWnd,msg,wParam,lParam);
}
INTWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnShowCmd)
WNDCLASSwc={CS_HREDRAW|CS_VREDRAW,MsgProc,0,0,hInstance,NULL,LoadCursor(NULL,IDC_ARROW),HBRUSH(6),NULL,TEXT("
win32"
)};
RegisterClass(&
wc);
HWNDhWnd=CreateWindow(TEXT("
),TEXT("
直线的生成算法"
),WS_OVERLAPPEDWINDOW,100,100,800,600,NULL,NULL,wc.hInstance,NULL);
ShowWindow(hWnd,SW_SHOWDEFAULT);
UpdateWindow(hWnd);
MSGmsg={0};
while(msg.message!
=WM_QUIT)
if(PeekMessage(&
msg,NULL,0u,0u,PM_REMOVE))
TranslateMessage(&
msg);
DispatchMessage(&
UnregisterClass(TEXT("
),wc.hInstance);
return0;
3、算法分析
DDA算法
设直线两端点为:
P1(x1,y1)及P2(x2,y2),则直线斜率为k=(y2-y1)/(x2-x1)1
|k|<
1时当△x=1时△y=kyi+1=yi+k
|k|>
1时当△y=1时△x=1/kxi+1=xi+1/k
优点:
与基本算法相比,在扫描过程中减少了浮点运算,提高了效率。
缺点:
由于x与dx,y与dy必须用浮点来表示,且每一步都要对y进行四舍五入取整,不利于硬件实现,故效率有待提高。
中点画线法
用整数加法及比较代替了DDA中的浮点数加法及取整运算,效率大大提高.
直线方程:
F(x,y)=ax+by+c=0
其中
a=y1-y2
b=x2-x1
c=x1*y2-x2*y1
定义决策变量:
d=F(xi+1,yi+0.5)=a(xi+1)+b(yi+0.5)+c=a+0.5b
d>
=0(xi+1,yi+1)=(xi+1,yi+1)
d<
0(xi+1,yi+1)=(xi+1,yi)
为了消除d的分数,用2d代替d摆脱浮点运算
Bresenham算法
y=kx+byi+1=yi+k
定e=d-0.5
e0=-0.5
ei+1=ei+k
当e≥0时(xi+1,yi+1)=(xi+1,yi+1)
当e<
0时(xi+1,yi+1)=(xi+1,yi)
4、程序正确运行的结果截图