直线生成算法.docx
- 文档编号:23007153
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:14
- 大小:54.70KB
直线生成算法.docx
《直线生成算法.docx》由会员分享,可在线阅读,更多相关《直线生成算法.docx(14页珍藏版)》请在冰豆网上搜索。
直线生成算法
1、作业名称直线生成算法
2、算法实现(代码)
//line.h
#ifndef_LINE_H_
#define_LINE_H_
#include
classCLine
{
private:
COLORREFm_color;
HDCm_hdc;
public:
CLine(HDC,COLORREF);
voidDraw_Line_DDA(intx1,inty1,intx2,inty2);
voidDraw_Line_MID(intx1,inty1,intx2,inty2);
voidDraw_Line_Bresham(intx1,inty1,intx2,inty2);
};
#endif
//Line.cpp
#include"line.h"
#include
#defineabs(x)((x)>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);
std:
:
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)
{
std:
:
swap(x1,x2);
std:
:
swap(y1,y2);
}
dx=x2-x1;
dy=y2-y1;
k=dx/dy;
x=x1;
for(y=y1;y<=y2;++y)
{
SetPixel(m_hdc,int(x+0.5),y,m_color);
x=x+k;
}
}
break;
}
}
voidCLine:
:
Draw_Line_MID(intx1,inty1,intx2,inty2)
{
inta,b,d1,d2,d,x,y;
if(x2 { 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 { x++; d+=d1; } } } if(a>0&&a<=b) { d=2*a-b; d1=2*(a-b); d2=2*a; while(x<=x2) { SetPixel(m_hdc,x,y,m_color); if(d>0) { x++; y--; d+=d1; } else { x++; d+=d2; } } } if(a<-b) { d=a+2*b; d1=2*(a+b); d2=2*b; while(y<=y2) { SetPixel(m_hdc,x,y,m_color); if(d>0) { x++; y++; d+=d1; } else { y++; d+=d2; } } } if(a>b) { d=a-2*b; d1=-2*b; d2=2*(a-b); while(y>=y2) { SetPixel(m_hdc,x,y,m_color); if(d<=0) { x++; y--; d+=d2; } else { y--; d+=d1; } } } } voidCLine: : Draw_Line_Bresham(intx1,inty1,intx2,inty2) { intx,y,dx,dy,e; switch(abs(x2-x1)>abs(y2-y1)) { casetrue: { if(y1>y2) { std: : swap(x1,x2); std: : swap(y1,y2); } x=x1; y=y1; dx=x2-x1; dy=y2-y1; e=-dx; for(inti=0;i<=dx;++i) { SetPixel(m_hdc,x,y,m_color); ++x; e+=dy<<1; if(e>=0) { ++y; e-=dx<<1; } } x=x2; y=y2; for(inti=0;i>=dx;--i) { SetPixel(m_hdc,x,y,m_color); ++x; e-=dy<<1; if(e<=0) { --y; e-=dx<<1; } } } break; casefalse: { if(x1>x2) { std: : swap(x1,x2); std: : swap(y1,y2); } x=x1; y=y1; dx=x2-x1; dy=y2-y1; e=-dy; for(inti=0;i<=dy;++i) { SetPixel(m_hdc,x,y,m_color); ++y; e+=dx<<1; if(e>=0) { ++x; e-=dy<<1; } } x=x2; y=y2; for(inti=0;i>=dy;--i) { SetPixel(m_hdc,x,y,m_color); ++y; e-=dx<<1; if(e<=0) { --x; e-=dy<<1; } } } break; } } //winmain.cpp #include #include"line.h" #include 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); gra1->Draw_Line_DDA(120,258,230,105); gra1->Draw_Line_DDA(230,105,230,295); gra1->Draw_Line_DDA(230,295,120,142); gra1->Draw_Line_DDA(120,142,300,200); gra2->Draw_Line_MID(300,300,120,358); gra2->Draw_Line_MID(120,358,230,205); gra2->Draw_Line_MID(230,205,230,395); gra2->Draw_Line_MID(230,395,120,242); gra2->Draw_Line_MID(120,242,300,300); gra3->Draw_Line_Bresham(400,300,220,358); gra3->Draw_Line_Bresham(220,358,330,205); gra3->Draw_Line_Bresham(330,205,330,395); gra3->Draw_Line_Bresham(330,395,220,242); gra3->Draw_Line_Bresham(220,242,400,300); deletegra1; deletegra2; deletegra3; EndPaint(hWnd,&ps); break; 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("win32"),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(&msg); } } UnregisterClass(TEXT("win32"),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、程序正确运行的结果截图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 直线 生成 算法