当前位置:文档之家› 20025级计算机图形学课程设计

20025级计算机图形学课程设计

20025级计算机图形学课程设计
20025级计算机图形学课程设计

计算机图形学课程设计报告

课题名称 直线和圆中点Bresenham 算法

小组成员

林珊珊 0701 1307101118 王金韬 0701 1307101123

陈文辉 0702 1307101215 周叶青 0702 1307101224

院、系、部 数理系

专 业 信息与计算科学 指导教师 林杰

※※※※※※※※※ ※※ ※

※ ※

※ ※※

※※※※※※

2007级学生计算机图形学课程设计

目录

1、课程设计目的 (2)

2、课程设计描述及要求 (2)

3、系统开发环境 (2)

4、直线的Bresenham算法原理 (2)

4.1中点Bresenham算法 (2)

4.2该进的Bresenham算法 (5)

5、圆的Bresenham算法原理 (7)

6、程序运行结果 (9)

7、总结 (11)

8、参考资料 (11)

9、附录 (11)

计算机图形学课程设计报告

1.课程设计目的

本学期系统学习了计算机图形学的概论原理,在学期期末按课程要求进行实验。通过实验,进一步理解和掌握中点算法、Bresenham 算法和二阶差分算法, 并掌握以上算法生成圆和直线等图形的基本过程,提高学生对计算机图形学的了解与运用技巧,同时通过此次课程设计提高动手实践能力与学习分析能力。 2.课程设计描述及要求 ●直线中点Bresenham 算法

掌握中点Bresenham 算法绘制直线的原理,设计中点Bresenham 算法,编写Mbline()子函数,使用中点Bresenham 算法绘制斜率为0≦k ≦1的直线 ●圆中点Bresenham 算法

掌握八分法中点Bresenham 算法绘制圆的原理,设计八分法绘制圆的中点Bresenham 算法,编写八分法绘制圆的CirclePoint(x,y)子函数,编写绘制整圆的Mbcircle()子函数,使用中点Bresenham 算法绘制圆心位于屏幕客户区中心的圆。

此次课程设计的课题为通过编程,实现圆和直线等基本图形的绘制。要求用Bresenham 算法实现圆和直线等基本图形的绘制,并给出代码和结果截图。 3.系统开发环境 开发工具:VC 6.0

操作系统:Microsoft Windows XP 4. 直线的Bresenham 算法原理 4.1中点Bresenham 算法

给定直线的两个端点00111P X Y P X Y (,)和(,),可得到直线方程F(x,y)=y-kx-b=0且

这时直线将平面分为三个区域:对于直线上的点,F(x,y)=0;对于直线上方的点,F(x,y)>0;对于直线下方的点,F(x,y)<0。

由Bresenham 提出的直线生成算法的基本原理是,每次在最大位移方向上走一步,而另一个方向是走步还是不走步取决于误差项的判别,如下图所示。

1010k Y Y y x X X -?==

?-

u

假定0≤k ≤1,由于x 是最大位移方向,因此每次在x 方向上加1,y 方向上或加1,或加0.假设当前点是P (,)i i x y ,则下一个点在(1,1)u i i P x y ++与(1,)d i i P x y +中选一。以M 表示u P 与d P 的中点,即(1,0.5)i i M x y ++。又设Q 是理想直线与垂直直线x=i x +1的交点;显然,若M 在Q 的下方,则(1,1)u i i P x y ++离直线近,应取为下一个像素;否则取(1,)d i i P x y +。

如前所述,直线方程为F(x,y)=y-kx-b 。欲判断Q 在M 上方还是下方,只要把M 代入F(x,y),并判断它的符号即可。

构造判别式如下:

d (,)(1,0.5)0.5(i M M i i i i F x y F x y y k x b

==++

=+-+- 当d i <0时,M 在直线下方,故应取u P 。当d i >0时,则应取正右方的d P 。当

d i =0时,二者一样合适,可以随便取一个。我们约定取d P ,即

当d i <0时,取右上方像素u P ,欲判断再下一个像素应取哪一个,应计算

1d (2, 1.5)i i i F x y +=++ 1.5(2)i i y k x b =+-+

-

1.5(1)i i y k x b k =+-+-- 1i d k =+-

此时,d i 的增量为1-k 。

当d i ≥0时,取正右方像素d P ,要判断再下一个像素应取哪一个,应计算

1d (2,0.5)i i i F x y +=++ 0.5(2)i i y k x b =+-+

-

0.5(1)i i y k x b k =+-+-- i d k =-

此时,d i 的增量为-k 。

(,)i i P x y

(1,)

d i i P x y +(1,1)

u i i P x y ++(1,0.5)

i i M x y ++Q

(0)

1(0)

i i d y y d y <+?=?

≥?

下面计算d i 的初值。显然,直线的第一个像素000(,)P x y 在直线上,因此相应的d i 的初始值计算如下:

000d (1,0.5)F x y =++ 000.5(2)y k x b =+-+- 000.5y kx b k =---+

0.5

k =- 由于我们使用的只是d i 的符号,因此可以用2d i x ?代替d i 来摆脱小数。此时算法只涉及整数运算。这样,0≤k ≤1时,Bresenham 算法的绘图过程如下:

① 输入直线的两端点00111P X Y P X Y (,)和(,); ② 计算初始值x ?,y ?,002,,d x y x X y Y =?-?==;

③ 绘制点(x,y)。判断d 的符号,若d<0,则(x,y)更新为(x+1,y+1),d 更新为d+2x ?-2y ?;否则(x,y)更新为(x+1,y ),d 更新为d-2y ?; ④ 当直线没有画完时,重复步骤③,否则结束。

0≤k ≤1时Bresenham 算法绘制直线的程序(仅包含整数运算)如下: void MidBresenhamLine(int x0,int y0,int x1,int y1,int color) {

int dx,dy,UpIncre,DownIncre,x,y; if(x0>x1)

{

x=x1;x1=x0;x0=x; y=y1;y1=y0;y0=y; }

x=x0;y=y0; dx=x1-x0;dy=y1-y0; d=dx-2*dy;

UpIncre=2*dx-2*dy; DownIncre=-2*dy; while(x<=x1) {

putpixel(x,y,color); x++;

if(d<0) { y++; d+= UpIncre ; }

else d+=DownIncre;

} }

4.2改进Bresenham 算法

虽然中点Bresenham 算法是一种效率很高的算法,但也还有改进的余地。当然,其基本原理仍然是每次在最大位移方向上走一步,二另一个方向上走步是不走步取决于误差项的判别。为叙述简单,同样定0≤k ≤1的直线段(k=y ?/x ?),其端点为00111

P X Y P X Y (,)和(,)。 于是这样考虑该直线段的绘制:过各行、各列像素中心构造一组虚拟网格线,按直线从起点到终点的顺序计算直线与各垂直网格线的交点,交点与网格线之间的误差为d i ,根据d i 确定该列网格中与此交点最近的像素点。当d i >0.5时,直线更接近于像素点(1,1)u i i P x y ++;当d i <0.5时,更接近于像素点(1,)d i i P x y +;当d i =0.5时,与上述两像素点一样接近,约定取(1,)d i i P x y +,即

其中的关键在于误差项d i ,它的初始值为0,每走一步有 一旦y 方向上走了一步,就把它减去1(此时可能出现负误差,这表明交点在所取网格点之下)。为方便计算,令0.5i i e d =-。则当i e >0时,下一像素的y 坐标增加1;否则,下一像素的y 坐标不增,即有 此时,i e 的初值为-0.5,每走一步有1e e i i k +=+。当i e >0时,将i e 减1.

改进的Bresenham 算法还有一个缺点:在计算直线斜率与误差时,要用到小

1111(0.5)(0.5)

i i i i i i i x x y d y y d ++=+??

+>??

=??≤??

1d d ()i i y k k x

+?=+=?111

1(0)(0)

i i i i i i

i x x y e y y e ++=+??

+>??=??≤??

数与除法,不利于硬件实现。因此改进如下:由于算法中只用到误差项的符号,于是可以用2e x ?来替换e 。这样就能获得整数Bresenham 算法且可避免除法。其算法步骤如下:

① 输入直线的两端点00111P X Y P X Y (,)和(,); ②计算初始值x ?,y ?,e = x -?,00,x X y Y == ③绘制点(x,y)。

④e 更新为e+2y ?。判断e 的符号,若e>0,则(x,y)更新为(x+1,y+1),同时将e 更新为e-2x ?;否则(x,y)更新为(x+1,y ); ⑤当直线没有画完时,重复步骤③,否则结束。 0≤k ≤1时改进的Bresenham 算法绘制直线的程序如下: void BresenhamLine(int x0,int y0,int x1,int y1,int color) {

int x,y,dx,dy,e; dx=x1-x0; dy=y1-y0; e=-dx;x=x0;y=y0; while(x<=x1)

{

Putpixel(x,y,color); x++; e=e+2*dy; if(e>0) { y++; e=e-2*dx; } }

}

5、圆的Bresenham 算法原理

给定圆心在原点,半径为R 的圆,其方程为222x y R +=。构造函数

222

(,)F x y x y R

=+-。对于圆上的点,有F(x,y)=0;对于圆外的点,F(x,y)>0;而对于圆内的点,F(x,y)<0.

这里只考虑如下图所示的第一象限内 的八分八分之一圆弧。此时中点Bresenham 画圆算法要从点(0,

顺时针地确定最佳逼近于该圆弧的像素序列。

对于该圆弧,由于最大位移方向为x ,因此其基本原理是:每次沿x 方向上走一步,而y 方向上或减1,或减0。如图所示,假定当前与圆弧最近的像素点已确定为P (,)i i x y ,那么,下一候选像素点只能是正右方的(1,)u i i P x y +和右下方的d (1

,1)i i P x y +-

假设M 是u P 和d P 的中点,即有(1,0.5)i i M x y +-。则当(,)M M F x y <0时,M 在圆内,此时u P 离圆弧更近,应取(1,)u i i P x y +为下一像素点。当(,)M M F x y >0,说明d P 离圆弧更近,应取d (1,1)i i P x y +-。当(,)M M F x y =0时,在u P 和d P 之中随便选取一个即可,约定取d P 。

构造判别式

2

22

d (,)(1,0.5)(1)(0.5)

i M M i i i i F x y F x y x y R ==+-

=+

+-

- 当d i <0,下一点取(1,)u i i P x y +;当d i ≥0时,下一点取(1

,1)d i i P x y +-。 x

八分之一圆弧

2

0,x ?∈??

现在进行误差项的递推。d i <0,取正右方像素(1,)u i i P x y +,欲判断再下一个像素应取哪一个,应计算

1d (2,0.5)i i i F x y +=+- 222

(2)(0.5)i i x y R =++-

- 222(1)(0.5)23i i i x y R x =++--++ 23i i d x =++

所以,沿正右方向,d i 的增量为23i x +。d i ≥0时,应取右下方像素

d (1,1)i i P x y +-,要判断再下一个像素,则要计算

1d (2, 1.5)i i i F x y +=+- 222

(2)( 1.5)i i x y R =++-

- 222(1)(0.5)(23)(22)

i i i i x y R x y =++--+++-+

2(5i i i d x y =+-+

) 所以,沿右下方向,判别式d i 的增量为2(5i i x y -+)。

显然所绘制圆弧段的第一个像素点为0(0,R)P ,因此判别式d i 的初始值 0d F(1,0.5)R =- 221(0.5)R R =+--

1.25R =-

由于使用的只是d i 的符号,因此可以用d i -0.25代替d i 来摆脱小数。此时算法只涉及整数运算。这样初始化运算0d 1.25R =-对应于0d 1R =-。判别式d i <0对应于d i <-0.25。d i <-0.25等价于d i <0。

于是可写出中点Bresenham 画圆算法的步骤如下: ① 输入圆半径R ;

② 计算初始值0d 1R =-,x=0,y=R ;

③ 绘制点(x,y)及其在八分圆中的另外7个对称点;

④ 判断d 的符号。若d<0,则先将d 更新为d+2x+3,再将(x,y)更新为(x+1,y);否则先将d 更新为d+2(x-y)+5,再将(x,y)更新为(x+1,y-1); ⑤ 当x

int x,y,d; x=0;y=r;d=1-r; while (x<=y) {

CirclePoint(x,y,color); if(d<0)d+=2*x+3; else {

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

6.程序运行结果

7、总结

通过这次课程设计,使我们加深了对Bresenham算法的了解和应用。增强了我们的实践能力,对以后的学习和工作有很大帮助。

8、参考资料:

《计算机图形学基础(第2版)》陆枫何云峰编著

太原工业学院精品课程

9、附录:源程序代码清单

●TestView.h

// TestView.h : interface of the CTestView class

//

/////////////////////////////////////////////////////////////////////////////

#if !defined(AFX_TESTVIEW_H__A75FDCFB_621C_4E38_A154_C344803E6372 __INCLUDED_)

#define

AFX_TESTVIEW_H__A75FDCFB_621C_4E38_A154_C344803E6372__INCLUD ED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#include "InputDlg.h"//对话框头文件

#include "InputDlg2.h"

class CTestView : public CView

{

protected: // create from serialization only

CTestView();

DECLARE_DYNCREATE(CTestView)

// Attributes

public:

CTestDoc* GetDocument();

// Operations

public:

void Mbline();//Bresenham函数

void GetMaxY();//获得屏幕的最大x值函数

void GetMaxX();//获得屏幕的最大y值函数

void CirclePoint(double x,double y);//八分法画圆子函数

void Mbcircle();//Bresenham算法

// Overrides

// ClassWizard generated virtual function overrides

//{{AFX_VIRTUAL(CTestView)

public:

virtual void OnDraw(CDC* pDC); // overridden to draw this view

virtual BOOL PreCreateWindow(CREATESTRUCT& cs);

protected:

virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);

virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);

virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);

//}}AFX_VIRTUAL

// Implementation

public:

virtual ~CTestView();

#ifdef _DEBUG

virtual void AssertValid() const;

virtual void Dump(CDumpContext& dc) const;

#endif

protected:

double x0, y0, x1, y1;//直线的起点和终点坐标

int MaxX,MaxY;//屏幕x和y的最大坐标

double R;//圆的半径

// Generated message map functions

protected:

//{{AFX_MSG(CTestView)

afx_msg void OnMENUMbline();

afx_msg void OnMENUMbcircle();

//}}AFX_MSG

DECLARE_MESSAGE_MAP()

};

#ifndef _DEBUG // debug version in TestView.cpp

inline CTestDoc* CTestView::GetDocument()

{ return (CTestDoc*)m_pDocument; }

#endif

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}

// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif

// !defined(AFX_TESTVIEW_H__A75FDCFB_621C_4E38_A154_C344803E6372_ _INCLUDED_)

●TestView.cpp

// TestView.cpp : implementation of the CTestView class

//

#include "stdafx.h"

#include "Test.h"

#include "TestDoc.h"

#include "TestView.h"

#define ROUND(a) int(a+0.5) //四舍五入

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

/////////////////////////////////////////////////////////////////////////////

// CTestView

IMPLEMENT_DYNCREATE(CTestView, CView)

BEGIN_MESSAGE_MAP(CTestView, CView)

//{{AFX_MSG_MAP(CTestView)

ON_COMMAND(ID_MENUMbline, OnMENUMbline)

ON_COMMAND(ID_MENUMbcircle, OnMENUMbcircle)

//}}AFX_MSG_MAP

// Standard printing commands

ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)

ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview) END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////

// CTestView construction/destruction

CTestView::CTestView()

{

// TODO: add construction code here

}

CTestView::~CTestView()

{

BOOL CTestView::PreCreateWindow(CREATESTRUCT& cs)

{

// TODO: Modify the Window class or styles here by modifying

// the CREATESTRUCT cs

return CView::PreCreateWindow(cs);

}

/////////////////////////////////////////////////////////////////////////////

// CTestView drawing

void CTestView::OnDraw(CDC* pDC)

{

CTestDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

// TODO: add draw code for native data here

}

/////////////////////////////////////////////////////////////////////////////

// CTestView printing

BOOL CTestView::OnPreparePrinting(CPrintInfo* pInfo)

{

// default preparation

return DoPreparePrinting(pInfo);

}

void CTestView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {

// TODO: add extra initialization before printing

}

void CTestView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {

// TODO: add cleanup after printing

}

/////////////////////////////////////////////////////////////////////////////

// CTestView diagnostics

#ifdef _DEBUG

void CTestView::AssertValid() const

CView::AssertValid();

}

void CTestView::Dump(CDumpContext& dc) const

{

CView::Dump(dc);

}

CTestDoc* CTestView::GetDocument() // non-debug version is inline

{

ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CTestDoc)));

return (CTestDoc*)m_pDocument;

}

#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////

// CTestView message handlers

void CTestView::Mbline()//Bresenham函数

{

CClientDC dc(this);

COLORREF rgb=RGB(0,0,255);//定义直线颜色为蓝色

double x,y,d,k;

x=x0;y=y0;k=(y1-y0)/(x1-x0);d=0.5-k; //定义x,y,k及d的初始值

for(x=x0;x<=x1;x++)

{

dc.SetPixel(ROUND(x),ROUND(y),rgb);

if(d<0)

{

y++;

d+=1-k;//d<0时,取右上方像素点,d的增量为1-k }

else

d-=k;//d>=0时,取正右方向像素点,d的增量为-k }

}

void CTestView::OnMENUMbline()//菜单函数

{

// TODO: Add your command handler code here

InputDlg dlg;

if(dlg.DoModal()==IDOK)

{

x0=dlg.m_x0;//变量x0即为InputDlg中的m_x0

y0=dlg.m_y0;//变量y0即为InputDlg中的m_y0

x1=dlg.m_x1;//变量x1即为InputDlg中的m_x1

y1=dlg.m_y1;//变量y1即为InputDlg中的m_y1

}

AfxGetMainWnd()->SetWindowText("实验:直线中点Bresenham算法");

RedrawWindow();

Mbline();

}

void CTestView::GetMaxX()//得到客户区的最大横坐标

{

CRect Rect;

GetClientRect(&Rect);

MaxX=Rect.right;

}

void CTestView::GetMaxY()//得到客户区最大纵坐标

{

CRect Rect;

GetClientRect(&Rect);

MaxY=Rect.bottom;

}

void CTestView::Mbcircle()//Bresenham算法

{

double x,y,d;

d=1.25-R;x=0;y=R; //定义d,x,y的初始值

for(x=0;x

{

CirclePoint(x,y);//调用八分法画圆子函数

if (d<0)

d+=2*x+3;//d<0时,取正右方向像素点,d的增量为2x-3 else

{

d+=2*(x-y)+5;//d>=0时,取右下方像素点,d的增量为2(x-y)+5

y--;

}

}

}

void CTestView::CirclePoint(double x, double y)//八分法画圆子函数

{

CClientDC dc(this);

COLORREF rgb=RGB(0,0,255);//定义圆的颜色

dc.SetPixel(ROUND(x)+MaxX/2,ROUND(y)+MaxY/2,rgb);//x,y

dc.SetPixel(ROUND(y)+MaxX/2,ROUND(x)+MaxY/2,rgb);//y,x

dc.SetPixel(ROUND(y)+MaxX/2,-ROUND(x)+MaxY/2,rgb);//y,-x

dc.SetPixel(ROUND(x)+MaxX/2,-ROUND(y)+MaxY/2,rgb);//x,-y

dc.SetPixel(-ROUND(x)+MaxX/2,-ROUND(y)+MaxY/2,rgb);//-x,-y

dc.SetPixel(-ROUND(y)+MaxX/2,-ROUND(x)+MaxY/2,rgb);//-y,-x

dc.SetPixel(-ROUND(y)+MaxX/2,ROUND(x)+MaxY/2,rgb);//-y,x

dc.SetPixel(-ROUND(x)+MaxX/2,ROUND(y)+MaxY/2,rgb);//-x,y

}

void CTestView::OnMENUMbcircle()//菜单函数

{

// TODO: Add your command handler code here

InputDlg2 dlg;

if(dlg.DoModal()==IDOK)

{

R=dlg.m_r;//R即为InputDlg2中的圆的半径r

}

AfxGetMainWnd()->SetWindowText("实验:圆中点Bresenham算法");

RedrawWindow();

GetMaxX();GetMaxY();

Mbcircle();

}

计算机图形学实验一

实验一二维基本图元的生成与填充 实验目的 1.了解并掌握二维基本图元的生成算法与填充算法。 2.实现直线生成的DDA算法、中点算法和Bresenham算法。 3.实现圆和椭圆生成的DDA和中点算法, 对几种算法的优缺点有感性认识。 二.实验内容和要求 1.选择自己熟悉的任何编程语言, 建议使用VC++。 2.创建良好的用户界面,包括菜单,参数输入区域和图形显示区域。 3.实现生成直线的DDA算法、中点算法和Bresenham算法。 4.实现圆弧生成的中点算法。 5.实现多边形生成的常用算法, 如扫描线算法,边缘填充算法。 6.实现一般连通区域的基于扫描线的种子填充算法。 7.将生成算法以菜单或按钮形式集成到用户界面上。 8.直线与圆的坐标参数可以用鼠标或键盘输入。 6. 可以实现任何情形的直线和圆的生成。 实验报告 1.用户界面的设计思想和框图。 2.各种实现算法的算法思想。 3.算法验证例子。 4.上交源程序。 直线生成程序设计的步骤如下: 为编程实现上述算法,本程序利用最基本的绘制元素(如点、直线等),绘制图形。如图1-1所示,为程序运行主界面,通过选择菜单及下拉菜单的各功能项分别完成各种对应算法的图形绘制。 图1-1 基本图形生成的程序运行界面 2.创建工程名称为“基本图形的生成”单文档应用程序框架 (1)启动VC,选择“文件”|“新建”菜单命令,并在弹出的新建对话框中单击“工程”标签。 (2)选择MFC AppWizard(exe),在“工程名称”编辑框中输入“基本图形的生成”作为工程名称,单击“确定”按钮,出现Step 1对话框。 (3)选择“单个文档”选项,单击“下一个”按钮,出现Step 2对话框。 (4)接受默认选项,单击“下一个”按钮,在出现的Step 3~Step 5对话框中,接受默认选项,单击“下一个”按钮。

计算机图形学实验报告 (2)

中南大学信息科学与工程学院 实验报告实验名称 实验地点科技楼四楼 实验日期2014年6月 指导教师 学生班级 学生姓名 学生学号 提交日期2014年6月

实验一Window图形编程基础 一、实验类型:验证型实验 二、实验目的 1、熟练使用实验主要开发平台VC6.0; 2、掌握如何在编译平台下编辑、编译、连接和运行一个简单的Windows图形应用程序; 3、掌握Window图形编程的基本方法; 4、学会使用基本绘图函数和Window GDI对象; 三、实验内容 创建基于MFC的Single Document应用程序(Win32应用程序也可,同学们可根据自己的喜好决定),程序可以实现以下要求: 1、用户可以通过菜单选择绘图颜色; 2、用户点击菜单选择绘图形状时,能在视图中绘制指定形状的图形; 四、实验要求与指导 1、建立名为“颜色”的菜单,该菜单下有四个菜单项:红、绿、蓝、黄。用户通过点击不同的菜单项,可以选择不同的颜色进行绘图。 2、建立名为“绘图”的菜单,该菜单下有三个菜单项:直线、曲线、矩形 其中“曲线”项有级联菜单,包括:圆、椭圆。 3、用户通过点击“绘图”中不同的菜单项,弹出对话框,让用户输入绘图位置,在指定位置进行绘图。

五、实验结果: 六、实验主要代码 1、画直线:CClientDC *m_pDC;再在OnDraw函数里给变量初始化m_pDC=new CClientDC(this); 在OnDraw函数中添加: m_pDC=new CClientDC(this); m_pDC->MoveTo(10,10); m_pDC->LineTo(100,100); m_pDC->SetPixel(100,200,RGB(0,0,0)); m_pDC->TextOut(100,100); 2、画圆: void CMyCG::LineDDA2(int xa, int ya, int xb, int yb, CDC *pDC) { int dx = xb - xa; int dy = yb - ya; int Steps, k; float xIncrement,yIncrement; float x = xa,y= ya; if(abs(dx)>abs(dy))

计算机图形学实验

实验1 直线的绘制 实验目的 1、通过实验,进一步理解和掌握DDA和Bresenham算法; 2、掌握以上算法生成直线段的基本过程; 3、通过编程,会在TC环境下完成用DDA或中点算法实现直线段的绘制。实验环境 计算机、Turbo C或其他C语言程序设计环境 实验学时 2学时,必做实验。 实验内容 用DDA算法或Besenham算法实现斜率k在0和1之间的直线段的绘制。 实验步骤 1、算法、原理清晰,有详细的设计步骤; 2、依据算法、步骤或程序流程图,用C语言编写源程序; 3、编辑源程序并进行调试; 4、进行运行测试,并结合情况进行调整; 5、对运行结果进行保存与分析; 6、把源程序以文件的形式提交; 7、按格式书写实验报告。 实验代码:DDA: # include # include

void DDALine(int x0,int y0,int x1,int y1,int color) { int dx,dy,epsl,k; float x,y,xIncre,yIncre; dx=x1-x0; dy=y1-y0; x=x0; y=y0; if(abs(dx)>abs(dy)) epsl=abs(dx); else epsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { putpixel((int)(x+0.5),(int)(y+0.5),4); x+=xIncre; y+=yIncre; } } main(){ int gdriver ,gmode ;

计算机图形学实验内容汇总

计算机图形学实验 肖加清

实验一图形学实验基础 一、实验目的 (1)掌握VC++绘图的一般步骤; (2)掌握OpenGL软件包的安装方法; (3)掌握OpenGL绘图的一般步骤; (4)掌握OpenGL的主要功能与基本语法。 二、实验内容 1、VC++绘图实验 (1)实验内容:以下是绘制金刚石图案。已给出VC++参考程序,但里面有部分错误,请改正,实现以下图案。 N=3 N=4

N=5 N=10 N=30

N=50 (2)参考程序 //自定义的一个类 //此代码可以放在视图类的实现文件(.cpp) 里class CP2 { public: CP2(); virtual ~CP2(); CP2(double,double); double x; double y; }; CP2::CP2() { this->x=0.0; this->y=0.0; } CP2::~CP2() { } CP2::CP2(double x0,double y0) { this->x=x0; this->y=y0; }

//视图类的一个成员函数,这个成员函数可以放在OnDraw函数里调用。 //在视图类的头文件(.h)里定义此函数 void Diamond(); //在视图类的实现文件(.cpp)里实现此函数 void CTestView::Diamond() { CP2 *P; int N; double R; R=300; N=10; P=new CP2[N]; CClientDC dc(this); CRect Rect; GetClientRect(&Rect); double theta; theta=2*PI/N; for(int i=0;i #include #include #include //定义输出窗口的大小 #define WINDOW_HEIGHT 300

计算机图形学实验报告,DOC

欢迎共阅

目录

实验一直线的DDA算法 一、【实验目的】 1.掌握DDA算法的基本原理。 2.掌握 3. 1.利用 2.加强对 四 { glClearColor(1.0f,1.0f,1.0f,1.0f); glMatrixMode(GL_PROJECTION); gluOrtho2D(0.0,200.0,0.0,150.0); } voidDDALine(intx0,inty0,intx1,inty1) { glColor3f(1.0,0.0,0.0); intdx,dy,epsl,k; floatx,y,xIncre,yIncre; dx=x1-x0;dy=y1-y0;

x=x0;y=y0; if(abs(dx)>abs(dy))epsl=abs(dx); elseepsl=abs(dy); xIncre=(float)dx/(float)epsl; yIncre=(float)dy/(float)epsl; for(k=0;k<=epsl;k++) { glPointSize(3); glBegin(GL_POINTS); glEnd(); } } { } { } { glutInitWindowSize(400,300); glutInitWindowPosition(100,120); glutCreateWindow("line"); Initial(); glutDisplayFunc(Display); glutReshapeFunc(winReshapeFcn); glutMainLoop(); return0; }

计算机图形学实验二

实验报告 课程名称:计算机图形学 实验项目:区域填充算法 实验仪器:计算机 系别:计算机学院 专业:计算机科学与技术 班级姓名:计科1602/ 学号:2016011 日期:2018-12-8 成绩: 指导教师:

一.实验目的(Objects) 1.实现多边形的扫描线填充算法。 二.实验内容 (Contents) 实现多边形的扫描线填充算法,通过鼠标,交互的画出一个多边形,然后利用种子填充算法,填充指定的区域。不能使用任何自带的填充区域函数,只能使用画点、画线函数或是直接对图像的某个像素进行赋值操作;

三.实验内容 (Your steps or codes, Results) //widget.cpp //2016CYY Cprogramming #include"widget.h" #include #include #include using namespace std; #define H 1080 #define W 1920 int click = 0; //端点数量 QPoint temp; QPoint first; int result = 1; //判断有没有结束 int sign = 1; //2为画线 int length = 5; struct edge { int ymax; float x; float dx; edge *next; }; edge edge_; QVector edges[H]; QVector points;//填充用 bool fin = false; QPoint *Queue = (QPoint *)malloc(length * sizeof(QPoint)); //存放端点的数组 Widget::Widget(QWidget *parent) : QWidget(parent) { } Widget::~Widget() { } void Widget::mouseMoveEvent(QMouseEvent *event) { setMouseTracking(true); if (click > 0 && result != 0) { startPt = temp; endPt =event->pos(); sign = 2; update(); } } void Widget::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { } else if (event->button() == Qt::RightButton) { sign = 2;

计算机图形学实验指导书1

佛山科学技术学院计算机图形学实验指导书 李晓东编 电信学院计算机系 2011年11月

实验1 直线段的扫描转换 实验类型:设计性 实验类别:专业实验 实验目的 1.通过实验,进一步理解直线段扫描转换的DDA算法、中点bresenham算法及 bresenham算法的基本原理; 2.掌握以上算法生成直线段的基本过程; 3.通过编程,会在C/C++环境下完成用DDA算法、中点bresenham算法及 bresenham算法对任意直线段的扫描转换。 实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用DDA算法中点bresenham算法及bresenham算法实现任意给定两点的直线段的绘制(直线宽度和线型可自定)。 实验步骤: 1、复习有关算法的基本原理,明确实验目的和要求; 2、依据算法思想,绘制程序流程图; 3、设计程序界面,要求操作方便; 4、用C/C++语言编写源程序并调试、执行; 5、分析实验结果 6、对程序设计过程中出现的问题进行分析与总结; 7、打印源程序或把源程序以文件的形式提交; 8、按格式要求完成实验报告。 实验报告要求: 1、各种算法的基本原理; 2、各算法的流程图 3、实验结果及分析(比较三种算法的特点,界面插图并注明实验条件) 4、实验总结(含问题分析及解决方法)

实验2 圆的扫描转换 实验类型:设计性 实验类别:专业实验 实验目的 1、通过实验,进一步理解和掌握中点bresenham画圆算法的基本原理; 2、掌握以上算法生成圆和圆弧的基本过程; 3、掌握在C/C++环境下完成用中点bresenham算法圆或圆弧的绘制方法。实验设备及实验环境 计算机(每人一台) VC++6.0或其他C/C++语言程序设计环境 实验学时:2学时 实验内容 用中点(Besenham)算法实现圆或圆弧的绘制。 实验步骤 1.复习有关圆的生成算法,明确实验目的和要求; 2.依据算法思想,绘制程序流程图(注意圆弧生成时的输入条件); 3.设计程序界面,要求操作方便; 4.用C/C++语言编写源程序并调试、执行; 5.分析实验结果 6.对程序设计过程中出现的问题进行分析与总结; 7.打印源程序或把源程序以文件的形式提交; 8.按格式要求完成实验报告。 实验报告要求: 1.分析算法的工作原理; 2.画出算法的流程图 3.实验结果及分析(比较圆与圆弧生成算法的不同) 4.实验总结(含问题分析及解决方法)

计算机图形学课程设计书

计算机图形学课程设计 书 文档编制序号:[KKIDT-LLE0828-LLETD298-POI08]

课程设计(论文)任务书 理学院信息与计算科学专业2015-1班 一、课程设计(论文)题目:图像融合的程序设计 二、课程设计(论文)工作: 自2018 年1 月10 日起至2018 年1 月12日止 三、课程设计(论文) 地点: 2-201 四、课程设计(论文)内容要求: 1.本课程设计的目的 (1)熟悉Delphi7的使用,理论与实际应用相结合,养成良好的程序设计技能;(2)了解并掌握图像融合的各种实现方法,具备初步的独立分析和设计能力;(3)初步掌握开发过程中的问题分析,程序设计,代码编写、测试等基本方法;(4)提高综合运用所学的理论知识和方法独立分析和解决问题的能力; (5)在实践中认识、学习计算机图形学相关知识。 2.课程设计的任务及要求 1)基本要求: (1)研究课程设计任务,并进行程序需求分析; (2)对程序进行总体设计,分解系统功能模块,进行任务分配,以实现分工合作;(3)实现各功能模块代码; (4)程序组装,测试、完善系统。 2)创新要求: 在基本要求达到后,可进行创新设计,如改进界面、增加功能或进行代码优化。

3)课程设计论文编写要求 (1)要按照书稿的规格打印誊写课程设计论文 (2)论文包括封面、设计任务书(含评语)、摘要、目录、设计内容、设计小结(3)论文装订按学校的统一要求完成 4)参考文献: (1)David ,《计算机图形学的算法基础》,机械工业出版社 (2)Steve Cunningham,《计算机图形学》,机械工业出版社 (3) 5)课程设计进度安排 内容天数地点 程序总体设计 1 实验室 软件设计及调试 1 实验室 答辩及撰写报告 1 实验室、图书馆 学生签名: 2018年1月12日 摘要 图像融合是图像处理中重要部分,能够协同利用同一场景的多种传感器图像信息,输出一幅更适合于人类视觉感知或计算机进一步处理与分析的融合图像。它可明显的改善单一传感器的不足,提高结果图像的清晰度及信息包含量,有利于更为准确、更为可靠、更为全面地获取目标或场景的信息。图像融合主要应用于军事国防上、遥感方面、医学图像处理、机器人、安全和监控、生物监测等领域。用于较多也较成熟的是红外和可见光的融合,在一副图像上显示多种信息,突出目标。一般情况下,图像融合由

计算机图形学课程参考文献

《计算机图形学》课程参考文献 [1 Kenneth R. Castleman, “Digital Image Processing”, Prentice-Hall International,Inc, 1996 [2] James Sharman. The Marching Cubes Algorithm[EB]. https://www.doczj.com/doc/998305866.html,/. [3] William E. Lorensen, Harvey E. Cline. Marching Cubes: A High Resolution 3D Surface Construction Algrorithm[J].Computer Graphics, 1987, 21(4). [4] Jan Horn. Metaballs程序[CP]. http://www.sulaco.co.za. [5] 唐泽圣,等.三维数据场可视化[M].北京:清华大学出版社,1999.177-179. [6] 白燕斌,史惠康,等.OpenGL三维图形库编程指南[M].北京:机械工业出版社,1998. [7] 费广正,芦丽丹,陈立新.可视化OpenGL程序设计[M].北京:清华大学出版社,2001. [8] 田捷,包尚联,周明全.医学影像处理与分析[M].北京:电子工业出版社,2003. [9] 三维表面模型的重构、化简、压缩及其在计算机骨科手术模拟中的应用[R]. https://www.doczj.com/doc/998305866.html,/~yike/uthesis.pdf ; [10] 首套中国数字化可视人体二维图像[DB]. http://www.chinesevisiblehuman. com/ pic/pictype.asp [11] 季雪岗,王晓辉,张宏林,等.Delphi编程疑难详解[M].北京:人民邮电出版社,2000. [12] 郑启华.PASCAL程序设计(第二版)[M].北京:清华大学出版社,1996. [13] 涂晓斌,谢平,陈海雷,蒋先刚.实用微机工程绘图实验教程[M].西南交通大学出版社,2004,4. [14] David F.Rogers.计算机图形学算法基础[M].北京:电子工业出版社,2002. [15] 李信真,车刚明,欧阳洁,封建湖.计算方法[M].西安:西北工业大学出版社,2000. [16] Paul Bourke Polygonising a scalar field [CP]. http://astronomy. https://www.doczj.com/doc/998305866.html,.au/ ~pbourke/ modelling/polygonise/ [17] 刘骏.Delphi数字图像处理及高级应用[M].北京:科学出版社,2003. [18] 李弼程,彭天强,彭波,等.智能图像处理技术[M].北京:电子工业出版社,2004. [19] Kenneth R.Castleman著,朱志刚,石定机,等译.数字图像处理[M].北京:电子工业出版社,2002. [20] Milan Sonka, Vaclav Hlavac, Roger Boyle.Image Processing, Analysis, and Machine Vision [M].北京:人民邮电出版社,2003. [21] 阮秋奇.数字图像处理学[M]. 北京:电子工业出版社, 2001. [22] 刘宏昆,等.Delphi应用技巧与常见问题[M]. 北京:机械工业出版社, 2003. [23] 张增强,李鲲程,等.专家门诊—Delphi开发答疑300问[M].北京:人民邮电出版社,2003.6.

计算机图形学实验三报告

计算机科学与通信工程学院 实验报告 课程计算机图形学 实验题目二维图形变换 学生姓名 学号 专业班级 指导教师 日期

成绩评定表

二维图形变换 1. 实验内容 完成对北极星图案的缩放、平移、旋转、对称等二维变换。 提示:首先要建好图示的北极星图案的数据模型(顶点表、边表)。另外,可重复调用“清屏”和“暂停”等函数,使整个变换过程具有动态效果。 2. 实验环境 软硬件运行环境:Windows XP 开发工具:visual studio 2008 3. 问题分析

4. 算法设计 程序框架: //DiamondView.h class CDiamondView : public CView { …… public: //参数输入和提示对话框 void Polaris();//北极星 …… }; //DiamondView.cpp void CDiamondView::OnMenuDiamond() { IsCutting = FALSE; if(dlgDiamond.DoModal()==IDOK) DrawDiamond(dlgDiamond.m_nVertex,dlgDiamond.

m_nRadius,100);//调用绘制金刚石的函数 } //北极星 void CDiamondView::Polaris() {......} 5. 源代码 //北极星 void hzbjx(CDC* pDC,long x[18],long y[18]) { CPen newPen1,*oldPen; newPen1.CreatePen(PS_SOLID,2,RGB(255,0,0)); oldPen = pDC->SelectObject(&newPen1); POINT vertex1[11]={{x[1],y[1]},{x[2],y[2]},{x[3],y[3]},{x[4],y[4]},{x[5],y[5]},{x[3],y[3]},{x[1],y[1]}, {x[6],y[6]},{x[3],y[3]},{x[7],y[7]},{x[5],y[5]}}; pDC->Polyline(vertex1, 11); newPen1.DeleteObject(); newPen1.CreatePen(PS_SOLID, 2, RGB(0,255,0)); oldPen = pDC->SelectObject(&newPen1); POINT vertex2[5]={{x[6],y[6]},{x[8],y[8]},{x[9],y[9]},{x[3],y[3]},{x[8],y[8]}}; pDC->Polyline(vertex2, 5); POINT vertex3[5]={{x[4],y[4]},{x[10],y[10]},{x[11],y[11]},{x[3],y[3]},{x[10],y[10]}}; pDC->Polyline(vertex3, 5);

计算机图形学 课程设计作品

《计算机图形学Visual c++版》考试作业报告 题目:计算机图形学图形画板 专业:推荐IT学长淘宝日用品店530213 班级:推荐IT学长淘宝日用品店530213 学号:推荐IT学长淘宝日用品店530213 姓名:推荐IT学长淘宝日用品店530213 指导教师:推荐IT学长淘宝日用品店530213 完成日期: 2015年12月2日

一、课程设计目的 本课程设计的目标就是要达到理论与实际应用相结合,提高学生设计图形及编写大型程序的能力,并培养基本的、良好的计算机图形学的技能。 设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握计算机图形学基本知识和算法设计的基本技能术,掌握分析、解决实际问题的能力。 通过这次设计,要求在加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。 二、设计内容推荐IT学长淘宝日用品店530213 设计一个图形画板,在这个图形画板中要实现: 1,画线功能,而且画的线要具备反走样功能。 2, 利用上面的画线功能实现画矩形,椭圆,多边形,并且可以对这些图形进行填充。 3,可以对选中区域的图形放大,缩小,平移,旋转等功能。 三、设计过程 程序预处理:包括头文件的加载,常量的定义以及全局变量的定义 #include "stdafx.h" #include "GraDesign.h" #include "GraDesignDoc.h" #include "GraDesignView.h" #include "math.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif //******自定义全局变量 int type = -1; CPoint point1; CPoint point2; CPoint temp[2];

一种基于计算几何方法的最小包容圆求解算法.kdh

2007年 工 程 图 学 学 报2007 第3期 JOURNAL OF ENGINEERING GRAPHICS No.3一种基于计算几何方法的最小包容圆求解算法 张 勇, 陈 强 (清华大学机械工程系先进成形制造重点实验室,北京 100084) 摘要:为实现点集最小包容圆(最小外接圆)的求解,将计算几何中的α-壳的概 念应用到最小包容圆的计算过程,提出了一种精确有效的最小包容圆求解算法。根据α-壳定 义及最小包容圆性质,证明当1/α等于最小包容圆半径时点集的α-壳顶点共圆,1/α小于最小 包容圆半径时α-壳不存在,1/α大于最小包容圆半径时随着1/α减小α-壳顶点数逐渐减小的规 律。将α-壳顶点数目作为搜索最小包容圆半径的依据,实现了最小包容圆半径的搜索和最小包容圆的求解。 关键词:计算机应用;优化算法;计算几何;最小包容圆;α-壳 中图分类号:TP 391 文献标识码:A 文章编号:1003-0158(2007)03-0097-05 Algorithm for Minimum Circumscribed Circle Detection Based on Computational Geometry Technique ZHANG Yong, CHEN Qiang ( Key Laboratory for Advanced Manufacturing by Materials Processing Technology, Department of Mechanical Engineering, Tsinghua University, Beijing 100084, China ) Abstract: α-hulls are applied to calculate the minimum circumscribed circle (MCC) of point set and an accurate and effective method for MCC detection is established through finding the least squares circle of the point set and iteratively approaching the MCC with recursive subdivision. Several theorems concerning the properties of α-hulls are presented. If 1/α is equal to the radius of points’ MCC, all vertices of the α-hull will be on the same circle. When 1/α is larger than the MCC’s radius, the number of vertices of α-hulls will decrease with decreasing of 1/α, and the number of vertices’ number will reach zero when 1/α is smaller than MCC’s radius. From the above rules, an algorithm for detecting MCC is developed, and experimental results show this algorithm is reliable. Key words: computer application; optimized algorithm; computational geometry; minimum circumscribed circle; α-hull 收稿日期:2005-12-20 基金项目:国家自然科学基金资助项目(50275083);高校博士点基金资助项目(20020003053)

计算机图形学上机实验指导

计算机图形学上机实验指导 指导教师:张加万老师 助教:张怡 2009-10-10

目录 1.计算机图形学实验(一) – OPENGL基础 ..................................... - 1 - 1.1综述 (1) 1.2在VC中新建项目 (1) 1.3一个O PEN GL的例子及说明 (1) 2.计算机图形学实验(二) – OPENGL变换 ..................................... - 5 - 2.1变换 (5) 3.计算机图形学实验(三) - 画线、画圆算法的实现....................... - 9 - 3.1MFC简介 (9) 3.2VC6的界面 (10) 3.3示例的说明 (11) 4.计算机图形学实验(四)- 高级OPENGL实验...................... - 14 - 4.1光照效果 (14) 4.2雾化处理 (16) 5.计算机图形学实验(五)- 高级OPENGL实验........................ - 20 - 5.1纹理映射 (20) 5.2反走样 (24) 6.计算机图形学实验(六) – OPENGL IN MS-WINDOWS .......... - 27 - 6.1 实验目标: (27) 6.2分形 (28)

1.计算机图形学实验(一) – OpenGL基础 1.1综述 这次试验的目的主要是使大家初步熟悉OpenGL这一图形系统的用法,编程平台是Visual C++,它对OpenGL提供了完备的支持。 OpenGL提供了一系列的辅助函数,用于简化Windows操作系统的窗口操作,使我们能把注意力集中到图形编程上,这次试验的程序就采用这些辅助函数。 本次实验不涉及面向对象编程,不涉及MFC。 1.2在VC中新建项目 1.2.1新建一个项目 选择菜单File中的New选项,弹出一个分页的对话框,选中页Projects中的Win32 Console Application项,然后填入你自己的Project name,如Test,回车即可。VC为你创建一个工作区(WorkSpace),你的项目Test就放在这个工作区里。 1.2.2为项目添加文件 为了使用OpenGL,我们需要在项目中加入三个相关的Lib文件:glu32.lib、glaux.lib、opengl32.lib,这三个文件位于c:\program files\microsoft visual studio\vc98\lib目录中。 选中菜单Project->Add To Project->Files项(或用鼠标右键),把这三个文件加入项目,在FileView中会有显示。这三个文件请务必加入,否则编译时会出错。或者将这三个文件名添加到Project->Setting->Link->Object/library Modules 即可。 点击工具条中New Text File按钮,新建一个文本文件,存盘为Test.c作为你的源程序文件,再把它加入到项目中,然后就可以开始编程了。 1.3一个OpenGL的例子及说明 1.3.1源程序 请将下面的程序写入源文件Test.c,这个程序很简单,只是在屏幕上画两根线。 #include

计算机图形学课程设计

《计算机图形学》课程设计报告题目名称:球体背面剔除消隐算法 专业计算机科学与技术 班级计科15升-1班 学号 1516353004 姓名 指导教师王玉琨 2016 年 06 月 07 日

目录 设计内容与要求 (03) 总体目标和要求 (03) 内容与要求 (03) 总体设计 (03) 2.1 球的消隐处理基本原理 (03) 2.2 具体设计实现 (04) 详细设计 (04) 3.1调试后正确的程序清单 (04) 功能实现 (08) 4.1程序运行结果 (09) 4.2 功能实现及分析 (09) 总结 (09) 参考文献 (10)

球体背面剔除消隐算法 第 1章设计内容与要求 1.1 总体目标和要求 课程设计的目的:以图形学算法为目标,深入研究。继而策划、设计并实现一个能够表现计算机图形学算法原理的或完整过程的演示系统, 并能从某些方面作出评价和改进意见。 通过完成一个完整程序,经历策划、设计、开发、测试、总结和验收各阶段,达到: 1) 巩固和实践计算机图形学课程中的理论和算法; 2) 学习表现计算机图形学算法的技巧; 3) 培养认真学习、积极探索的精神; 4) 具备通过具体的平台实现图形算法的设计、编程与调试的能力; 5) 完成对实验结果分析、总结及撰写技术报告的能力。 总体要求:策划、设计并实现一个能够充分表现图形学算法的演示系统,界面要求美观大方,能清楚地演示算法执行的每一个步骤。 开发环境:Viusal C++ 6.0 1.2 内容与要求 球体背面剔除消隐算法 内容:(1)掌握背面剔除消隐算法原理; (2)实现矢量点积与叉积运算; (3)透视投影变换 (4)曲面体经纬线划分方法 功能要求: (1)绘制球体线框模型的透视投影图,使用背面剔除算法实现动态消隐; (2)通过右键菜单显示消隐效果,右键菜单有两个选项:未消隐与消隐; (3)使用键盘的上下左右控制键旋转消隐前后的球体; (4)单击左键增加视距,右击缩短视距; 第2章总体设计 2.1 球的消隐处理基本原理 球体的曲面通常采用一组网格多边形来表示,即把曲面离散成许多小平面片,用平面逼近曲面,一般使用许多四边形来逼近曲面。 网格四边形愈多,逼近曲面的精度就愈高,逼近效果就愈好,曲面看起来就越光滑。一般根据实际需要来确定合适的逼近精度即网格多边形数目。 当曲面表示为一组网格多边形时,消隐处理的主要工作是确定各网格多边形的可见性,由此可用平面立体的算法对曲面进行消隐处理。 球面的参数方程为:

计算机图形学实验报告

计算机图形学 实验报告 学号:20072115 姓名: 班级:计算机 2班 指导老师:何太军 2010.6.19

实验一、Windows 图形程序设计基础 1、实验目的 1)学习理解Win32 应用程序设计的基本知识(SDK 编程); 2)掌握Win32 应用程序的基本结构(消息循环与消息处理等); 3)学习使用VC++编写Win32 Application 的方法。 4)学习MFC 类库的概念与结构; 5)学习使用VC++编写Win32 应用的方法(单文档、多文档、对话框); 6)学习使用MFC 的图形编程。 2、实验内容 1)使用WindowsAPI 编写一个简单的Win32 程序,调用绘图API 函数绘制若干图形。(可选任务) 2 )使用MFC AppWizard 建立一个SDI 程序,窗口内显示"Hello,This is my first SDI Application"。(必选任务) 3)利用MFC AppWizard(exe)建立一个SDI 程序,在文档视口内绘制基本图形(直线、圆、椭圆、矩形、多边形、曲线、圆弧、椭圆弧、填充、文字等),练习图形属性的编程(修改线型、线宽、颜色、填充样式、文字样式等)。定义图形数据结构Point\Line\Circle 等保存一些简单图形数据(在文档类中),并在视图类OnDraw 中绘制。 3、实验过程

1)使用MFC AppWizard(exe)建立一个SDI 程序,选择单文档; 2)在View类的OnDraw()函数中添加图形绘制代码,说出字符串“Hello,This is my first SDI Application”,另外实现各种颜色、各种边框的线、圆、方形、多边形以及圆弧的绘制; 3)在类视图中添加图形数据point_pp,pp_circle的类,保存简单图形数据,通过在OnDraw()函数中调用,实现线、圆的绘制。 4、实验结果 正确地在指定位置显示了"Hello,This is my first SDI Application"字符串,成功绘制了圆,椭圆,方形,多边形以及曲线圆弧、椭圆弧,同时按指定属性改绘了圆、方形和直线。成功地完成了实验。 结果截图: 5、实验体会 通过实验一,了解了如用使用基本的SDI编程函数绘制简单的图

计算机图形学实验报告

《计算机图形学》实验报告姓名:郭子玉 学号:2012211632 班级:计算机12-2班 实验地点:逸夫楼507 实验时间:15.04.10 15.04.17

实验一 1 实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力; 编程实现DDA 算法、Bresenham 中点算法;对于给定起点和终点的直线,分别调用DDA 算法和Bresenham 中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel 等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。 2 实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One (自制平台) 3 实验结果 3.1 程序流程图 (1)DDA 算法 是 否 否 是 是 开始 计算k ,b K<=1 x=x+1;y=y+k; 绘点 x<=X1 y<=Y1 绘点 y=y+1;x=x+1/k; 结束

(2)Mid_Bresenham 算法 是 否 否 是 是 是 否 是 否 开始 计算dx,dy dx>dy D=dx-2*dy 绘点 D<0 y=y+1;D = D + 2*dx - 2*dy; x=x+1; D = D - 2*dy; x=x+1; x

3.2程序代码 //-------------------------算法实现------------------------------// //绘制像素的函数DrawPixel(x, y); (1)DDA算法 void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) { //----------请实现DDA算法------------// float k, b; float d; k = float(Y1 - Y0)/float(X1 - X0); b = float(X1*Y0 - X0*Y1)/float(X1 - X0); if(fabs(k)<= 1) { if(X0 > X1) { int temp = X0; X0 = X1; X1 = temp; }

计算机图形学实验报告

计算机图形学 实验报告 姓名:谢云飞 学号:20112497 班级:计算机科学与技术11-2班实验地点:逸夫楼507 实验时间:2014.03

实验1直线的生成 1实验目的和要求 理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析 实验数据的能力; 编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的 直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记 录两种算法的绘制时间;利用excel等数据分析软件,将试验结果编 制成表格,并绘制折线图比较两种算法的性能。 2实验环境和工具 开发环境:Visual C++ 6.0 实验平台:Experiment_Frame_One(自制平台)。 本实验提供名为 Experiment_Frame_One的平台,该平台提供基本 绘制、设置、输入功能,学生在此基础上实现DDA算法和Mid_Bresenham 算法,并进行分析。 ?平台界面:如错误!未找到引用源。所示 ?设置:通过view->setting菜单进入,如错误!未找到引 用源。所示 ?输入:通过view->input…菜单进入.如错误!未找到引用 源。所示 ?实现算法: ◆DDA算法:void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1) Mid_Bresenham法:void CExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1)

3实验结果 3.1程序流程图 1)DDA算法流程图:开始 定义两点坐标差dx,dy,以及epsl,计数k=0,描绘点坐标x,y,x增 量xIncre,y增量yIncre ↓ 输入两点坐标x1,y1,x0,y0 ↓ dx=x1-x0,dy=y1-y0; _________↓_________ ↓↓ 若|dx|>|dy| 反之 epsl=|dx| epsl=|dy| ↓________...________↓ ↓ xIncre=dx/epsl; yIncre=dy/epsl ↓ 填充(强制整形)(x+0.5,y+0.5); ↓←←←← 横坐标x+xIncre; 纵坐标y+yIncre; ↓↑ 若k<=epsl →→→k++ ↓ 结束 2)Mid_Bresenham算法流程图开始 ↓ 定义整形dx,dy,判断值d,以及UpIncre,DownIncre,填充点x,y ↓ 输入x0,y0,x1,y1 ______↓______ ↓↓ 若x0>x1 反之 x=x1;x1=x0;x0=x; x=x0;

相关主题
文本预览
相关文档 最新文档