计算机图形学课内实验.docx
- 文档编号:3748148
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:13
- 大小:133.76KB
计算机图形学课内实验.docx
《计算机图形学课内实验.docx》由会员分享,可在线阅读,更多相关《计算机图形学课内实验.docx(13页珍藏版)》请在冰豆网上搜索。
计算机图形学课内实验
《计算机图形学课内实验》
实验报告
班级:
计算机91
姓名:
程战战
学号:
2009055006
日期:
2012/11/7
一、实验目的及要求
基本掌握中点圆算法的编程实现。
二、实验环境
Windows7OS、VS编程环境
三、实验内容
输入任一点作为圆心坐标,并输入一个任意的半径,从而画出相应圆,
并且对非法输入能够检测。
四、数据结构和算法描述
1.数据结构:
设要显示圆的圆心在原点(0,0),半径为R,起点在(0,R)处,终点在(
,
)处,顺时针生成八分之一圆,利用对称性扫描转换全部圆。
为了应用中点画圆法,我们定义一个圆函数
F(x,y)=x2+y2-R2
任何点(x,y)的相对位置可由圆函数的符号来检测:
F(x,y)
<0 点(x,y)位于数学圆内
=0 点(x,y)位于数学圆上
>0 点(x,y)位于数学圆外
如下图所示,图中有两条圆弧A和B,假定当前取点为Pi(xi,yi),如果顺时针生成圆,那么下一点只能取正右方的点E(xi+1,yi)或右下方的点SE(xi+1,yi-1)两者之一。
假设M是E和SE的中点,即
,则:
1、当F(M)<0时,M在圆内(圆弧A),这说明点E距离圆更近,应取点E作为下一象素点;
2、当F(M)>0时,M在圆外(圆弧B),表明SE点离圆更近,应取SE点;
3、当F(M)=0时,在E点与SE点之中随便取一个即可,我们约定取SE点。
2.中点圆算法思想如下:
我们用中点M的圆函数作为决策变量di,同时用增量法来迭代计算下一个中点M的决策变量di+1。
(2-21)
下面分两种情况来讨论在迭代计算中决策变量di+1的推导。
1、见图(a),若di<0,则选择E点,接着下一个中点就是
,这时新的决策变量为:
(2-22)
(a)(di<0)中点画线算法
式(2-22)减去(2-21)得:
di+1=di+2xi+3
(2-23)
2、见图(b),若di≥0,则选择SE点,接着下一个中点就是
,这时新的决策变量为:
(2-24)
(b)(di≥0)中点画线算法
式(2-24)减去(2-21)得:
di+1=di+2(xi-yi)+5
(2-25)
我们利用递推迭代计算这八分之一圆弧上的每个点,每次迭代需要两步处理:
(1)用前一次迭代算出的决策变量的符号来决定本次选择的点。
(2)对本次选择的点,重新递推计算得出新的决策变量的值。
剩下的问题是计算初始决策变量d0,如下图所示。
对于初始点(0,R),顺时针生成八分之一圆,下一个中点M的坐标是
,所以:
(2-26)
生成圆的初始条件和圆的生成方向
3、具体步骤如下:
(1)输入:
圆半径r、圆心(x0,y0);
(2)确定初值:
x=0,y=r、d=5/4-r;
(3)While(x<=y)
{
·利用八分对称性,用规定的颜色color画八个象素点(x,y);
·若d≥0
{
y=y-1;
d=d+2(x-y)+5);
}
否则
d=d+2x+3;
·x=x+1;
}
五、调试过程及实验结果
1.调试过程:
实验中未出现问题,调试时一切顺利。
2.实验结果截图:
(1)圆心为(0,0),半径为5的圆:
(2)圆心为(5,5),半径为3的圆:
6、总结
本次实验基本掌握了DDA算法、Bresenham画线算法、中点圆画线算法、中点椭圆算法,加深了对画线算法设计的原则和目标的理解。
并且对图形学产生了相当的兴趣,暂时打算,考研结束后,重点学习一下图形学方面的相关知识,拓展自己的知识面。
感谢老师和研究生学长的指导。
七、附录(源程序清单)
1、circle.h:
headerfile
#if!
defined(AFX_CIRCLE_H__AE990B41_3A93_468B_BAC1_B5DCE1CF1F5F__INCLUDED_)
#defineAFX_CIRCLE_H__AE990B41_3A93_468B_BAC1_B5DCE1CF1F5F__INCLUDED_
#if_MSC_VER>1000
#pragmaonce
#endif//_MSC_VER>1000
//circle.h:
headerfile
//
/////////////////////////////////////////////////////////////////////////////
//circledialog
classcircle:
publicCPropertyPage
{
DECLARE_DYNCREATE(circle)
//Construction
public:
circle();
~circle();
//DialogData
//{{AFX_DATA(circle)
enum{IDD=IDD_DIALOG3};
floatm_edit2;
floatm_edit3;
floatm_edit1;
//}}AFX_DATA
//Overrides
//ClassWizardgeneratevirtualfunctionoverrides
//{{AFX_VIRTUAL(circle)
public:
virtualBOOLPreTranslateMessage(MSG*pMsg);
protected:
virtualvoidDoDataExchange(CDataExchange*pDX);//DDX/DDVsupport
//}}AFX_VIRTUAL
//Implementation
protected:
//Generatedmessagemapfunctions
//{{AFX_MSG(circle)
afx_msgvoidOnButton1();
afx_msgvoidOnLButtonDown(UINTnFlags,CPointpoint);
afx_msgvoidOnPaint();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
//MicrosoftVisualC++willinsertadditionaldeclarationsimmediatelybeforethepreviousline.
#endif//!
defined(AFX_CIRCLE_H__AE990B41_3A93_468B_BAC1_B5DCE1CF1F5F__INCLUDED_)
2、circle.cpp:
implementationfile
//circle.cpp:
implementationfile
//
#include"stdafx.h"
#include"图形学.h"
#include"circle.h"
#defineX0200
#defineY0180
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//circlepropertypage
IMPLEMENT_DYNCREATE(circle,CPropertyPage)
circle:
:
circle():
CPropertyPage(circle:
:
IDD)
{
//{{AFX_DATA_INIT(circle)
m_edit2=0.0f;
m_edit3=0.0f;
m_edit1=0.0f;
//}}AFX_DATA_INIT
}
circle:
:
~circle()
{
}
voidcircle:
:
DoDataExchange(CDataExchange*pDX)
{
CPropertyPage:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(circle)
DDX_Text(pDX,IDC_EDIT2,m_edit2);
DDX_Text(pDX,IDC_EDIT3,m_edit3);
DDX_Text(pDX,IDC_EDIT1,m_edit1);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(circle,CPropertyPage)
//{{AFX_MSG_MAP(circle)
ON_BN_CLICKED(IDC_BUTTON1,OnButton1)
ON_WM_LBUTTONDOWN()
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//circlemessagehandlers
voidcircle:
:
OnButton1()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(true);
m_edit1*=20;
m_edit2*=20;
m_edit3*=20;
int**FunCircle(int);
int**p=FunCircle((int)m_edit3);
CClientDCpdc(this);
tagPOINTpoint;
intx0=X0+(int)m_edit1,y0=Y0-(int)m_edit2;
for(inti=1;p[0][i]||p[1][i];i++)
{
point.x=x0+p[0][i];
point.y=y0-p[1][i];
pdc.SetPixel(point,RGB(0,0,255));
point.x=x0-p[0][i];
point.y=y0+p[1][i];
pdc.SetPixel(point,RGB(0,0,255));
point.x=x0-p[0][i];
point.y=y0-p[1][i];
pdc.SetPixel(point,RGB(0,0,255));
point.x=x0+p[0][i];
point.y=y0+p[1][i];
pdc.SetPixel(point,RGB(0,0,255));
point.x=x0+p[1][i];
point.y=y0-p[0][i];
pdc.SetPixel(point,RGB(0,0,255));
point.x=x0-p[1][i];
point.y=y0+p[0][i];
pdc.SetPixel(point,RGB(0,0,255));
point.x=x0-p[1][i];
point.y=y0-p[0][i];
pdc.SetPixel(point,RGB(0,0,255));
point.x=x0+p[1][i];
point.y=y0+p[0][i];
pdc.SetPixel(point,RGB(0,0,255));
Sleep(15);
}
}
int**FunCircle(intr)
{
int**a,i=0;
intx=0,y=r;
floatp;
a=newint*[2];
a[0]=newint[r];
a[1]=newint[r];
a[0][i]=0;
a[1][i]=r;
p=5/4-r;
while(x { x++; if(p<0) { p=p+2*x+1; } else { p=p+2*x+1-2*y; y-=1; } i++; a[0][i]=x; a[1][i]=y; } a[0][++i]=0; a[1][i]=0; returna; } voidcircle: : OnLButtonDown(UINTnFlags,CPointpoint) { //TODO: Addyourmessagehandlercodehereand/orcalldefault CPropertyPage: : OnLButtonDown(nFlags,point); } voidcircle: : OnPaint() { CPaintDCpdc(this);//devicecontextforpainting //TODO: Addyourmessagehandlercodehere pdc.MoveTo(X0,0); pdc.LineTo(X0,400); intm=0,num=8; for(inti=1;i<20;i++) { m+=20; tagPOINTpoint; point.x=X0; point.y=m; if(num>=0) pdc.TextOut(point.x-10,point.y,char(48+num)); else{ pdc.TextOut(point.x-15,point.y,"-"); pdc.TextOut(point.x-10,point.y,char(48-num)); } num--; for(intj=1;j<6;j++) { pdc.SetPixel(point,RGB(100,100,100)); point.x++; } } pdc.MoveTo(0,Y0); pdc.LineTo(400,Y0); num=9; for(i=1;i<20;i++) { tagPOINTpoint; point.x=m; point.y=Y0; if(num>0) pdc.TextOut(point.x,point.y+5,char(48+num)); elseif(num<0){ pdc.TextOut(point.x-5,point.y+5,"-"); pdc.TextOut(point.x,point.y+5,char(48-num)); } num--; for(intj=1;j<6;j++) { pdc.SetPixel(point,RGB(100,100,100)); point.y--; } m-=20; } //DonotcallCPropertyPage: : OnPaint()forpaintingmessages } BOOLcircle: : PreTranslateMessage(MSG*pMsg) { //TODO: Addyourspecializedcodehereand/orcallthebaseclass if(pMsg->message==WM_KEYDOWN) if(pMsg->wParam==VK_RETURN){ this->OnButton1(); returntrue; } returnCPropertyPage: : PreTranslateMessage(pMsg); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 实验