2023年计算机图形学实验报告2_第1页
2023年计算机图形学实验报告2_第2页
2023年计算机图形学实验报告2_第3页
2023年计算机图形学实验报告2_第4页
2023年计算机图形学实验报告2_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机图形学

实验一:基本图形生成算法演示

一、实验目的与规定

了解OpenGL图形软件包绘制图形的基本过程及其程序框架,并在已有的程序框架中

添加代码实现直线和圆的生成算法,演示直线和圆的生成过程,从而加深对直线和圆等基本

图形生成算法的理解。

二、实验内容

实验规定:(1)理解g1ut程序框架

(2)理解窗口到视区的变换

(3)理解。PenGL实现动画的原理

(4)添加代码实现中点Bresenham算法画直线

(5)添加代码实现改善Bresenham算法画直线

(6)添加代码实现圆的绘制(可以适当对框架坐标系进行修改)

实验操作和环节:本次实验重要的目的是为了掌握基本画线和画圆算法,对于书上给出的代

码,规定通过本次实验来具体的实现。由于实验已经给出大体的框架,所以只需要按照书上

的算法思想来设计具体实现代码,对于直线DDA算法,中点Bresenham算法及其改善算

法,以及Bresenham画圆算法都有进一步的体会。DDA算法是对每一步都要进行增量解

决,然后取整,绘制,而Bresenham通过判断误差函数和求取递推公式来实现。特别是对

于整数的选择取舍,以及代码的流程和循环的控制有一个进一步的了解。同时也纯熟运用Op

enGL基本的绘图函数。

三、实验结果

1-1.。。DDA算法画直线。

冕JC:\Yindows\systea32\cad.-lalxi

DDA画线算法:各点坐标

x=0.000000,y=0.000000,取整后x=0,y=0

x»l.000000,y=0.7S0000,前整后

x=2.000000,y=l.500003,戢整后x=2,y=2

x-3.000000,y-2.250000,x-3,y=2

x=4.000000,y=3.000000,x=4,y=3

x=5.000000.y»3.750000,x-5,ya4

x=6.000000,y=4.500000,x=6,y=5

xa7.000000,y»5.250000,

x=8.000000,y=6.000000,x=8,y=6

x=9.000000.y=6.750000,取x=9.y"

x=10.000000,y=7.500000,目x=10,y=8

x=ll.000000,y=8.250000,^/।x=ll,y=8

x=12.000000,y=9.000000,J??'x=12,y=9

x=13.000000,y=9.750000,双।x=13,y,B10

x=14.000000,y=10.500000,i□x=14,y=ll

x=15.000000.y=11.250000,gx=15,y=ll

x=16.000000,y=12.000000,gx=16,y=12

x=17.000000,y=12.750000,gx=17,y=13

x=18.000000,y=13.500000,gx=18,«/=14

x=19.000000,y=14.250000,gx=19,y=14

x=20.000000,y=15.000000,□x=20,y=15

Ld

图1-1-1,显示每次DDA算法画线的坐标结果(如上)。

图显示DDA算法画圆过程及截图

1—2.。中点Bresenham算法画直线

1-3.运用改善的Bresenham画线算法来画图

Asystea32\cad.exe-laix|

Bresenham算法来画图各点坐标如上:

运用改善的Bresenham算法画直线图形如上

1-4.运用Bresenham画圆算法来作图

1-4-1.运用Bresenham画圆法作图各点坐标如上:

1-4-2.运用BresenhamlEj圆法作图及截图如上。

四、体会

。通过本次实验,我进一步加深了对于基本画图算法的理解。特别是对于DDA,Bresenham

和画圆算法。其中,DDA算法由于每一步都要解决浮点数的四舍五入,所以在绘图时要进行取

整,效率较低,但是代码直观好懂,符合原理。而对于Bresenham及其改善算法,都是在理

论推导的基础上来实现的,然后通过整数化,形成了一个高效率的画图算法,所以需要适当的

理解,特别是对于取整操作判断比较巧妙,实现了避免多次判断计算浮点数的目的,所以比较

高效。而绘制圆形的时候,用到的基本思想还是和Bresenham画图算法同样,只但是需

要注意的是八分法画圆,这样只需要绘制其中的八分之一就可以运用对称的关系来绘制出整

个图形。而对于是否走下一步,或者是停留,判断的依据还是误差函数,和前面的思想是类

似。此外,通过实验训练了自己的编程能力,同时熟悉了OpenGL绘图的函数和流程,也进一

步巩固了相关的知识。

五、源程序

源代码如下:

//un//////nn/mmumunmmun/1/1/1/n/urn////1///nu/1/nn

//实验规定:(I)理解glut程序框架//

//(2)理解窗口到视区的变换//

//(3)理解OpenGL实现动画的原理//

//(4)添加代码实现中点Bresenham算法画直线//

II(5)添加代码实现改善Bresenham算法画直线〃

//(6)添加代码实现圆的绘制(可以适当对框架坐标系进行修改)〃

//(7)适当修改代码实现具有宽度的图形(线刷子或方刷子)//

////////ini//////////////////////////////////////////mum///m////////

#include<windows.h>

#include<gl/glut.h>

#inc1udcnstdio.h"

intm_PointNumber=0;〃动画时绘制点的数目

intm_DrawMode=1;〃绘制模式1DDA算法画直线

//2中点Bresenham算法画直线

//3改善Brcsenham算法画直线

//4八分法绘制圆

//5四分法绘制椭圆

//绘制坐标线

voidDrawCordinateLine(void)

(

®inti=0;

“/坐标线为黑色

oglColor3f(0.Of,0.Of,0.0f);

oglBegin(GL_LINES);

for(i=10;i<=250;i=i+10)

3{

。oglVertex2f((float)(i),O.Of);

.gIVertex2f((float)⑴,250.0f);

。。glVertex2f(0.Of,(float)(i));

gglVertex2f(250.0f,(float)(i));

do|

oglEnd();

)

〃绘制一个点,这里用一个正方形表达一个点。

voidputpixel(GLsizeix,GLsizeiy)

og1Rectf(10*xJ0*y,10*x+10,10*y+10);

/////////////////////////////////〃〃/////〃〃//〃//〃〃〃//〃〃〃/

//DDA画线算法

//参数说明:x0,yO起点坐标//

Uxl,yl终点坐标//

//num扫描转换时从起点开始输出的点的数目,用于动画//

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

voidDDACreateLine(GLsizeix0,GLsizeiyO,GLsizeix1,GLsizeiy1,GLsizeinum)

(

〃设立颜色

oglColor3f(l.Of,O.Of,O.OD;

〃对画线动画进行控制

if(num==1)

叩rintf("DDA画线算法:各点坐标\n");

®elseif(num==0)

etum;

//画线算法的实现

®GLsizeidx,dy,eps1,k;

GLfloatx,y,xlncre,yIncre;

®dx=x1-x0;

dy=y1-yO;

ex=xO;

y=y0;

®if(abs(dx)>abs(dy))cpsl=abs(dx);

®elseeps1=abs(dy);

oxincre=(float)dx/epsi;

yincre=(float)dy/epsl;

for(k=0;kv=eps1;k++){

putpixel((int)(x+0.5),(int)(y+0.5));

if(k>=num-1){

。printf("x=%f,y=%f,取整后x=%d,y=%d\n",x,y,(int)(x+0.5),(int)(y+0.5));

。ftbreak;

oo|

+=xIncre;

。y+=yIncre;

Mf(x>=25||y>=25)break;

)

)

ilil////////////////////////////////////1HUH////////////////////

//中点Bresenham算法画直线(0<=k<=l)//

//参数说明:x0,yO起点坐标//

//xl,yl终点坐标//

//num扫描转换时从起点开始输出的点的数目,用于动画〃

1/1//////////////////////////////////////////////////1111//////////

voidBresenhamLine(GLsizeixO,GLsizeiyO,GLsizeixl,GLsizeiyl,GLsizeinum)

(

-glColor3f(l.Of,0.0f,0.Of);

if(num==1)

。(

叩rintf(n中点Bresenham算法画直线:各点坐标及判别式的值5”);

®elseif(num==0)

®return;

。〃中点Brcsenham划线算法的实现

<>GLsizeidx>dy,d,Uplncre»Downlncre,x,y;

if(x0>xl){

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

y=y1;yl=yO;y0=y;

)

x=xO;y=yO;

dx=x1-xO;dy=y1-yO;

d=dx-2*dy;

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

while(x<=x1)

{

。putpixe1(x,y);

。printf(Hx=%d,y=%d\n",x,y);

◎x++;

“f(d<0)

U

y++;

d+=UpIncre;

)

else

g。d+=Downlncre;

。}

)

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

//改善的Bresenham算法画直线(0〈二k<=1)//

//参数说明:xO,y0起点坐标//

//xl,yl终点坐标//

//num扫描转换时从起点开始输出的点的数目,用于动画〃

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

voidBresenham2Line(GLsizeix0,GLsizeiy0,GLsizeixl,GLsizeiy1,GLsizei

um)

(

0gleolor3f(1.0f,0.0f,0.Of);

dif(num==1)

gprintf("改善的Bresenham算法画直线:各点坐标及判别式的值\n");

delseif(num==0)

«return;

〃画线算法的实现

GLsizeix,y,dx,dy,e;

dx=x1-x0;

dy=yl-y0;

®e=—dx;x=xO;y=yO;

awhile(x<=xl)

putpixe1(x,y);

。printf(,rx=%d,y=%d\nH,x,y);

x++;

。空=e+2*dy;

®®if(e>0)

ft{

y++;

e=c-2*dx;

)

。}

)

////////////////////////umu/////////////////HUHH///////////

//Bresenham算法画圆

〃参数说明:x,y圆心坐标〃

//R圆半径〃

//num扫描转换时从起点开始输出的点的数目,用于动画〃

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

voidBresenhamCircle(GLsizeix,GLsizeiy,GLsizeiR,GLsizeinum)

(

oglColor3f(1.0f,0.0f,O.Of);

«if(num==1)

oprintf(”Bresenham算法画圆:各点坐标及判别式的值\n”);

“ntd,k=0,xa,ya;

»xa=0;ya=R;d=1-R;

while(xa<=ya){

putpixel(xa+x,ya+y);

gpulpixel(ya+x,xa+y);

。putpixe1(-ya+x,xa+y);

gputpixel(-xa+x,ya+y);

gputpixe1(-xa+x,-ya+y);

。putpixeI(-ya+x,-xa+y);

。putpixel(ya+x,-xa+y);

wputpixe1(xa+x,-ya+y);

if(k>=num-1){

qprintf("x=%d,y=%d\n",xa+x,ya+y);

«break;

1

k++;

if(d<0)d+=2*xa+3;

«»else(

。。d+=2*(xa-ya)+5;

0ya-;

)

0xa++;

a)&

)

//初始化窗口

voidInitial(void)

(

//设立窗口颜色为蓝色

glClearColor(l.Of,l.Of,1.Of,l.Of);

)

//窗口大小改变时调用的登记函数

voidChangeSize(GLsizeiw,GLsizeih)

(

&if(h==0)。。h=1;

。//设立视区尺寸

g1Viewport(0,0,w,h);

。//重置坐标系统

0glMatrixMode(GL_PROJECTION);

glLoadldentity();

//建立修剪空间的范围

if(w<=h)

glOrtho(O.Of,250.0f,0.0f,250.0f*h/w,1.0,-1.0);

eIse

g1Ortho(0.0f,250.0f*w/h,O.Of,250.0f,1.0,-1.0):

}

//在窗口中绘制图形

voidReDraw(void)

{

//用当前背景色填充窗口

glClear(GL_COLOR_BUFFER_BIT);

〃画出坐标线

®DrawCordinateLine();

switch(m—DrawMode)

U

case1:

。DDACreateLine(0,0,20,15,m_Poin(Number);

break;

®case2:

®BresenhamLine(0,0,20,15,m_PointNumber);

®®break;

case3:

oBresenham2Line(1,1,8,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论