计算机图形学画线画圆算法.docx

上传人:b****3 文档编号:5468205 上传时间:2022-12-16 格式:DOCX 页数:15 大小:296.79KB
下载 相关 举报
计算机图形学画线画圆算法.docx_第1页
第1页 / 共15页
计算机图形学画线画圆算法.docx_第2页
第2页 / 共15页
计算机图形学画线画圆算法.docx_第3页
第3页 / 共15页
计算机图形学画线画圆算法.docx_第4页
第4页 / 共15页
计算机图形学画线画圆算法.docx_第5页
第5页 / 共15页
点击查看更多>>
下载资源
资源描述

计算机图形学画线画圆算法.docx

《计算机图形学画线画圆算法.docx》由会员分享,可在线阅读,更多相关《计算机图形学画线画圆算法.docx(15页珍藏版)》请在冰豆网上搜索。

计算机图形学画线画圆算法.docx

计算机图形学画线画圆算法

宁夏师范学院数学与计算机科学学院

《计算机图形学》实验报告

实验序号:

3 实验项目名称:

画线、画圆算法

学 号

姓 名

专业、班

实验地点

指导教师

时间

一、实验目的:

1、环境要求:

MicrosoftVisualC++6.0

二、实验内容与步骤

1、首先建立一个单文档的MFC项目Graphic。

2、接下来使用对话框控件设计好如图

(1)对话框界面,并且创建新类Inputdialg,

其基类为Dialog,再对菜单栏进行设计,让其与对话框映射起来。

3、在Inputdialg类中添加整型变量m_startX,m_startY,m_endX,m_endY,

m_circleR,m_MidPointX,m_MidPointY。

可以同时对其赋初值,如图

(2):

4、接下来是将以上变量与对话框中的编辑框中值映射,需要通过添加DoDataExchange函数进行值的交换,然后进入类向导(ctrl+W),选择成员变量选项,进行如下映射:

5、再为对话框按钮添加映射函数:

voidInputdialg:

:

OnDda()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

//释放设备指针

UpdateData(TRUE);

startX=m_startX;

startY=m_startY;

endX=m_endX;

endY=m_endY;

UpdateData(FALSE);

flag=true;

pview->Invalidate();

}

voidInputdialg:

:

OnMidpoint()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

UpdateData(TRUE);

startX=m_startX;

startY=m_startY;

endX=m_endX;

endY=m_endY;

UpdateData(FALSE);

flag2=true;

pview->Invalidate();

}

voidInputdialg:

:

OnBresenham()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

UpdateData(TRUE);

startX=m_startX;

startY=m_startY;

endX=m_endX;

endY=m_endY;

UpdateData(FALSE);

flag3=true;

pview->Invalidate();

}

voidInputdialg:

:

OnBresenhamcircle()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

UpdateData(TRUE);

MidPointX=m_MidPointX;

MidPointY=m_MidPointY;

circleR=m_circleR;

UpdateData(FALSE);

flag4=true;

pview->Invalidate();

}

6、要实现图像的显示还是需要通过视图类来实现,在ondraw()函数中添加如下代码:

CClientDCdc(this);

if(flag==true)

{

DDALine(startX,startY,endX,endY,RGB(0,255,0),dc);

flag=false;

}

if(flag2==true)

{

MidBresenhamLine(startX,startY,endX,endY,RGB(255,0,0),dc);

flag2=false;

}

if(flag3==true)

{

BresenhamLine(startX,startY,endX,endY,RGB(255,0,255),dc);

flag3=false;

}

if(flag4==true)

{

MidBresenhamCircle(MidPointX,MidPointY,circleR,RGB(250,0,100),dc);

flag4=false;

}

7、上一步中的flag,flag2,flag3,flag4都是未定义变量,需要再对其进行定义,这次是对部变量的定义,

(1)在StdAx.h添加:

externintstartX,startY,endX,endY,circleR,MidPointX,MidPointY;

externboolflag,flag2,flag3,flag4;

(2)在StdAfx.cpp中添加:

intstartX,startY,endX,endY,circleR,MidPointX,MidPointY;

boolflag,flag2,flag3,flag4;

(3)在Inputdialg.cpp中添加:

externCGraphicView*pview;

externintstartX,startY,endX,endY,circleR,MidPointX,MidPointY;

externboolflag,flag2,flag3,flag4;

8、在GraphicView.cpp中定义CGraphicView*pview=NULL;,要指针生效同样需要初始化,如下:

CGraphicView:

:

CGraphicView()

{

//TODO:

addconstructioncodehere

pview=this;

}

9、至此,准备工作做的是差不多了,但最重要的是还缺少实现函数,在视图类中添加如下函数:

voidCGraphicView:

:

DDALine(intx0,inty0,intx1,inty1,intcolor,CClientDC&dc)//sleep判断是否直接画

{

intdx,dy,eps1,k;

floatx,y,xIncre,yIncre;

dx=x1-x0;dy=y1-y0;

x=x0;y=y0;

if(abs(dx)>abs(dy))

eps1=abs(dx);

else

eps1=abs(dy);

xIncre=(float)dx/(float)eps1;

yIncre=(float)dy/(float)eps1;

CPennewpen(PS_SOLID,1,color);

dc.SelectObject(&newpen);

for(k=0;k<=eps1;k++)

{

inta=(int)(x+0.5);

intb=(int)(y+0.5);

//dc.Ellipse(a-1,b-1,a+1,b+1);

dc.SetPixel(a,b,color);

x+=xIncre;

y+=yIncre;

}

}

voidCGraphicView:

:

MidBresenhamLine(intx0,inty0,intx1,inty1,intcolor,CClientDC&dc)

{

CPennewpen(PS_SOLID,1,color);

dc.SelectObject(&newpen);

if(x0==x1)//斜率不存在

{

for(inti=y0;i<=y1;i++)

{

dc.Ellipse(x0-1,i-1,x0+1,i+1);

}

return;

}

intdx,dy,d,UpIncre,DownIncre,x,y;

if(x0>x1)

{

x=x1;x1=x0;x0=x;

y=y1;y1=y0;y0=y;

}

dx=x1-x0;dy=y1-y0;

floatk=(float)dy/(float)dx;//斜率

if(k>=0&&k<=1)

{

x=x0;y=y0;

d=dx-2*dy;

UpIncre=2*dx-2*dy;DownIncre=-2*dy;

while(x<=x1)

{

dc.Ellipse(x-1,y-1,x+1,y+1);

x++;

if(d<0)

{

y++;

d+=UpIncre;

}

else

d+=DownIncre;

}

}

elseif(k>1)

{

x=x0;y=y0;

d=2*dx-dy;

UpIncre=-2*dx+2*dy;//右

DownIncre=-2*dx;//左

while(y<=y1)

{

dc.Ellipse(x-1,y-1,x+1,y+1);

y++;

if(d<0)//大于0,取右点

{

x++;

d+=UpIncre;

}

else

d+=DownIncre;

}

}

elseif(k>=-1&&k<=0)

{

x=x0;y=y0;

d=-dx-2*dy;

UpIncre=-2*dx-2*dy;//下

DownIncre=-2*dy;//上

while(x<=x1)

{

dc.Ellipse(x-1,y-1,x+1,y+1);

x++;

if(d>0)//大于0,取下点

{

y--;

d+=UpIncre;

}

else

{

d+=DownIncre;

}

}

}

elseif(k<-1)

{

x=x0;y=y0;

d=-2*dx-dy;

UpIncre=-2*dx-2*dy;//右

DownIncre=-2*dx;//左

while(y>=y1)

{

dc.Ellipse(x-1,y-1,x+1,y+1);

y--;

if(d<0)//大于0,取右点

{

x++;

d+=UpIncre;

}

else

d+=DownIncre;

}

}

}

voidCGraphicView:

:

BresenhamLine(intx0,inty0,intx1,inty1,intcolor,CClientDC&dc)

{

CPennewpen(PS_SOLID,1,color);

dc.SelectObject(&newpen);

if(x0==x1)//斜率不存在

{

for(inti=y0;i<=y1;i++)

{

dc.Ellipse(x0-1,i-1,x0+1,i+1);

}

return;

}

intx,y,dx,dy,e;

if(x0>x1)

{

x=x1;x1=x0;x0=x;

y=y1;y1=y0;y0=y;

}

dx=x1-x0;dy=y1-y0;

x=x0;y=y0;

floatk=(float)dy/(float)dx;//斜率

if(k>=0&&k<=1)

{

e=-dx;

while(x<=x1)

{

dc.Ellipse(x-1,y-1,x+1,y+1);

x++;

e+=2*dy;

if(e>0)

{

y++;

e-=2*dx;

}

}

}

elseif(k>1)

{

e=-dy;

while(y<=y1)

{

dc.Ellipse(x-1,y-1,x+1,y+1);

y++;

e+=2*dx;

if(e>0)

{

x++;

e-=2*dy;

}

}

}

elseif(k>=-1&&k<=0)

{

e=-dx;

while(x<=x1)

{

dc.Ellipse(x-1,y-1,x+1,y+1);

x++;

e+=2*dy;

if(e<=0)

{

y--;

e+=2*dx;

}

}

}

elseif(k<-1)

{

e=-dx;

while(y>=y1)

{

dc.Ellipse(x-1,y-1,x+1,y+1);

y--;

e+=2*dy;//e+k

if(e<0)

{

x++;

e-=2*dy;

}

}

}

}

voidCGraphicView:

:

MidBresenhamCircle(intMidPointX,intMidPointY,intr,intcolor,CClientDC&dc)

{

CPennewpen(PS_SOLID,1,color);

dc.SelectObject(&newpen);

intx,y,d;//x为中点x坐标

x=0;

y=r;

d=1-r;

while(x<=y)

{

dc.SetPixel(x+MidPointX,y+MidPointY,color);

dc.SetPixel(-x+MidPointX,y+MidPointY,color);

dc.SetPixel(-x+MidPointX,-y+MidPointY,color);

dc.SetPixel(x+MidPointX,-y+MidPointY,color);

dc.SetPixel(y+MidPointX,x+MidPointY,color);

dc.SetPixel(-y+MidPointX,x+MidPointY,color);

dc.SetPixel(-y+MidPointX,-x+MidPointY,color);

dc.SetPixel(y+MidPointX,-x+MidPointY,color);

if(d<0)

{

d+=2*x+3;

}

else

{

d+=2*(x-y)+5;

y--;

}

x++;

}

}

10、最后在对应的实现文件中加入适当的头文件申明,保证编译链接的通过。

三、运行结果

DDA:

MIDPOINT:

BRESENHAM:

BRESENHAMCIRCLE:

MidpointEllipse:

 

五、教师评语

 

签名:

日期:

年月日

成绩

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1