计算机图形学画线画圆算法.docx
《计算机图形学画线画圆算法.docx》由会员分享,可在线阅读,更多相关《计算机图形学画线画圆算法.docx(15页珍藏版)》请在冰豆网上搜索。
![计算机图形学画线画圆算法.docx](https://file1.bdocx.com/fileroot1/2022-12/16/f0d2c2fd-f5b6-4d16-8d3f-34c65a1deefc/f0d2c2fd-f5b6-4d16-8d3f-34c65a1deefc1.gif)
计算机图形学画线画圆算法
宁夏师范学院数学与计算机科学学院
《计算机图形学》实验报告
实验序号:
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:
五、教师评语
签名:
日期:
年月日
成绩