直线生成算法Word格式文档下载.docx

上传人:b****2 文档编号:912387 上传时间:2023-04-29 格式:DOCX 页数:14 大小:54.70KB
下载 相关 举报
直线生成算法Word格式文档下载.docx_第1页
第1页 / 共14页
直线生成算法Word格式文档下载.docx_第2页
第2页 / 共14页
直线生成算法Word格式文档下载.docx_第3页
第3页 / 共14页
直线生成算法Word格式文档下载.docx_第4页
第4页 / 共14页
直线生成算法Word格式文档下载.docx_第5页
第5页 / 共14页
直线生成算法Word格式文档下载.docx_第6页
第6页 / 共14页
直线生成算法Word格式文档下载.docx_第7页
第7页 / 共14页
直线生成算法Word格式文档下载.docx_第8页
第8页 / 共14页
直线生成算法Word格式文档下载.docx_第9页
第9页 / 共14页
直线生成算法Word格式文档下载.docx_第10页
第10页 / 共14页
直线生成算法Word格式文档下载.docx_第11页
第11页 / 共14页
直线生成算法Word格式文档下载.docx_第12页
第12页 / 共14页
直线生成算法Word格式文档下载.docx_第13页
第13页 / 共14页
直线生成算法Word格式文档下载.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

直线生成算法Word格式文档下载.docx

《直线生成算法Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《直线生成算法Word格式文档下载.docx(14页珍藏版)》请在冰点文库上搜索。

直线生成算法Word格式文档下载.docx

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、程序正确运行的结果截图

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2