计算机图形学期末编程大作业
if(X0+R>700||Y0+R>428||X0-R<0||Y0-R<0)
MessageBox("图像超出范围,请在全屏下运行,否则将显示不完全!");
if(X0+R>1024||Y0+R>644||X0-R<0||Y0-Rห้องสมุดไป่ตู้0)
MessageBox("图像超出范围,将显示不完全!");
x=0;y=R; p=3-(R<<1);
{
dc.SetPixel((int)(x+0.5),(int)(y+0.5),m_clr);
x+=dx;
y+=dy;
}
}
/****************算法结束*********************/
/**********Bresenham直线算法**************/
void CAView::OnBresenhamLine()
/**************Bresenham画法*************/
void CAView::OnBresenhamCircle()
{// TODO: Add your command handler code here
int X0=1;
int Y0=1;
int R=1;
int x,y,p;
if(Xe>1024||Ye>644)
MessageBox("图像超出范围,将显示不完全!");
//斜率绝对值小于等于1
if(m)
{//情况一:Y递增
if(Ys<=Ye)
{p=(dy<<1)-dx;
while(x<=Xe)
{dc.SetPixel(x,y,m_clr);
if(p<0)
{x++;p=p+(dy<<1);}
完成下列程序的设计、调试与及设计说明书:
一、实现直线、圆的生成
要求:(1)算法不限;(2)直线的端点、圆的圆心、半径由用户实时输入;(3)用所实现的直线、圆的生成程序实现一个任意图形的绘制。
二、实现区域填充(多边形区域)或影线填充
要求:(1)区域自行指定,至少应有一个内环(2)算法:计算机相关专业的要求实现图案填充,机械相关专业的要求实现影线填充。
else
{x++;y++;p=p+((dy-dx)<<1);}}
}
//情况二:Y递减
else
{ p=dx-(dy<<1);
while(x<=Xe)
{dc.SetPixel(x,y,m_clr);
if(p<0)
{x++;p=p-(dy<<1);}
else
{x++;y--;p=p-((dy=dx)<<1);}}
要求:
1、语言不限,可以是所熟悉的如何一种语言。
2、须提交的内容包括:源程序(电子版)、可执行程序,设计说明书(电子版及打印版)。
3、程序须经教师运行测试通过。
4、设计说明书B5页面打印,内容包括:算法与数据结构,程序流程说明及变量,程序运行情况分析及结果截图,程序使用说明。
题目一:实现直线、圆的生成
else
{p=(dx<<1)+dy;
while(y>=Ye)
{dc.SetPixel(x,y,m_clr);
if(p<0)
{y--;p=p+(dx<<1);}
else
{x++;y--;p=p+((dx+dy)<<1);}}
}
}
}
/*************算法结束*****************/
CClientDC dc(this);
CDlg_SetCircle dlgMidPointcircle;
if(dlgMidPointcircle.DoModal()==IDOK)
{X0=dlgMidPointcircle.m_X0;
Y0=dlgMidPointcircle.m_Y0;
R=dlgMidPointcircle.m_R ;}
if(Xs==Xe)
{if(Ys<Ye)
{for ( int i=Ys; i<=Ye; i++)
dc.SetPixel(Xs,i,m_clr);}
else
{for ( int i=Ye; i<=Ys; i++)
{dc.SetPixel(Xs,i,m_clr);}}
return;
}
BOOL m=(fabs(Ye-Ys)<=fabs(Xe-Xs));
}
}
//斜率绝对值大于1
else
{//情况三:Y递增
if(Ys<=Ye)
{p=(dx<<1)-dy;
while(y<=Ye)
{dc.SetPixel(x,y,m_clr);
if(p<0)
{y++;p=p+(dx<<1);}
else
{x++;y++;p=p+((dx-dy)<<1);}
}
}
//情况四:Y递减
if(dlgDDAline.DoModal()==IDOK)
{Xs=dlgDDAline.m_Xs;
Ys=dlgDDAline.m_Ys;
Xe=dlgDDAline.m_Xe;
Ye=dlgDDAline.m_Ye;}
if(Xe>700||Ye>428)
MessageBox("图像超出范围,请在全屏下运行,否则将显示不完全!");
题目二:实现区域填充(多边形区域)或影线填充
要求:(1)区域自行指定,至少应有一个内环(2)算法:计算机相关专业的要求实现图案填充,机械相关专业的要求实现影线填充。
if(Xe>1024||Ye>644)
MessageBox("图像超出范围,将显示不完全!");
dx = Xe - Xs;dy = Ye - Ys; e = (fabs(dx)>fabs(dy)) ? fabs(dx):fabs(dy);dx /= e;dy /= e;x = Xs;y = Ys;
for(int i=1; i<=e; i++)
b. Bresenham算法
1965年,Bresenham提出了一种更好的直线生成算法,称为Bresenham算法。此算法的一个主要思想是借助于一个决策变量dk,来确定下一个该点亮的像素点。对于直线斜率k在0~1之间的情况,从给定线段的左端点(x1,y1)开始,逐步处理每个后续列(x位置),并在扫描线y值最接近线段的像素上绘出一点。
//如果Xs大于Xe的值,交换坐标值
if(Xs>Xe)
{p=Xs;Xs=Xe;Xe=p;
p=Ys;Ys=Ye;Ye=p;}
x=Xs; y=Ys;
dx = Xe - Xs;
dy = Ye - Ys;
if(Xe>700||Ye>428)
MessageBox("图像超出范围,请在全屏下运行,否则将显示不完全!");
for(;x<=y;x++)
{dc.SetPixel( x+X0, y+Y0, m_clr);
dc.SetPixel(-x+X0, y+Y0, m_clr);
dc.SetPixel( x+X0,-y+Y0, m_clr);
dc.SetPixel(-x+X0,-y+Y0, m_clr);
dc.SetPixel( y+X0, x+Y0, m_clr);
{// TODO: Add your command handler code here
CClientDC dc(this);
CDlg_LinePoint dlgBresenhamline;
int Xs=1;int Ys=1;int Xe=1;int Ye=1;int x,y,p;int dx,dy;
图1-5绘制结果
如果输入的坐标值超出了设定的范围,将弹出提示对话框,如下图所示:
c.圆的绘制
鼠标左键点选菜单栏中的 菜单,会弹出下拉菜单,Bresenham算法。
则弹出对话框如图5。
图1-5圆参数输入界面
根据对话框的要求,填入元的基本参数值:圆心坐标值和半径值。
注意:界面上对输入的数值的要求。程序的默认窗体中,图形显示空间为宽度大小为700个像素值,高为428个像素值。全屏条件下,图形显示空间为宽度大小为1024个像素值,高为644个像素值。
2)Bresenham画圆算法
Bresenham画法与中点画法一样,也考虑从(0,R)到(R/ ,R/ )的八分之一圆周。取(0,R)为起点,按顺时针方向生成圆。从这段圆弧的任意一点出发,按顺时针方向生成圆时,为了最佳逼近该圆,下一像素的取法只有三种可能的选择:正右方像素,右下方像素和正下方像素。这三个像素中,与理想圆弧最近者为所求像素。
b.直线的绘制
图1-3直线参数对话框
鼠标左键点选菜单栏中的 菜单,会弹出下拉菜单,其中提供2种直线绘制的经典算法,包括DDA算法和Bresenham算法。我们可随意选择一种,例如Bresenham算法。
说表左键单击选定后,便会弹出参数输入对话框,如图3。