计算机图形学实验指导(含源码附报告模板)

合集下载

计算机图形学实验报告模板

计算机图形学实验报告模板

巢湖学院计算机图形学实验报告(模板>本课程实验包括:以下为实验二和实验三模板实验一:基本图元绘制一、实验目的了解OpenGL图形软件包绘制图形的基本过程及其程序框架,并在已有的程序框架中添加代码实现直线和圆的生成算法,演示直线和圆的生成过程,从而加深对直线和圆等基本图形生成算法的理解。

b5E2RGbCAP二、实验内容实验操作和步骤:本次实验主要的目的是为了掌握基本画线和画圆算法,对于书上给出的代码,要求通过本次实验来具体的实现。

由于实验已经给出大体的框架,所以只需要按照书上的算法思想来设计具体实现代码,对于直线DDA算法,中点Bresenham算法及其改进算法,以及Bresenham画圆算法都有进一步的体会。

DDA算法是对每一步都要进行增量处理,然后取整,绘制,而Bresenham通过判断误差函数和求取递推公式来实现。

特别是对于整数的选择取舍,以及代码的流程和循环的控制有一个深入的了解。

同时也熟练运用OpenGL基本的绘图函数。

p1EanqFDPw三、体会通过本次实验,我进一步加深了对于基本画图算法的理解。

特别是对于DDA,Bresenham和画圆算法。

其中,DDA算法由于每一步都要处理浮点数的四舍五入,所以在绘图时要进行取整,效率较低,但是代码直观好懂,符合原理。

而对于Bresenham及其改进算法,都是在理论推导的基础上来实现的,然后经过整数化,形成了一个高效率的画图算法,所以需要适当的理解,特别是对于取整操作判断比较巧妙,实现了避免多次判断计算浮点数的目的,所以比较高效。

而绘制圆形的时候,用到的基本思想还是和Bresenham画图算法一样,只不过需要注意的是八分法画圆,这样只需要绘制其中的八分之一就可以利用对称的关系来绘制出整个图形。

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

另外,通过实验训练了自己的编程能力,同时熟悉了OpenGL绘图的函数和流程,也进一步巩固了相关的知识。

计算机图形学--全部实验的实验报告

计算机图形学--全部实验的实验报告

一、实验目的根据曲线和曲面的基础知识和常用曲线的数学基础,对其算法进行程序设计,验证算法的正确性,并通过程序结果加深对常用曲线数学模型的理解。

二、实验任务1.抛物线程序设计;2.Hermite 曲线程序设计;3.Bezier曲线的算法实现;4.B样条曲线的程序设计三、实验内容和实验步骤任务一:抛物线程序设计实现抛物线算法的C语言程序段如下:(工程名:parabola)Par(int xs,int ys,int xm,int ym,int xe,int ye) //已知起点、中点和终点三个控制点的坐标{double t,dt,ax,ay,bx,by,cx,cy;int n,i;ax=xe-2*xm+xs;ay=ye-2*ym+ys;bx=2.0*(xm-xs);by=2.0*(ym-ys);cx=xs; cy=ys;n=sqrt(ax*ax+ay*ay);n=sqrt(n*100.0);moveto(xs,ys);dt=1.0/n; t=0;for (i=0;i<=n; i++){lineto((int)(ax*t*t+bx*t+cx),(int)( ay*t*t+by*t+cy));t=t+dt;}lineto(xe,ye);}读者可以根据上述抛物线程序设计,写出抛物线参数样条曲线的程序。

任务二:Hermite 曲线程序设计P(t)=FB=TMB=[ t3 t2 t 1 ]程序设计时只考虑二维图形的显示,其代数形式为:x(t)=TMBx , Bx =[ P0x P1x R0x R1x]Ty(t)= TMBy , By =[ P0y P1y R0y R1y]T所以,只要给出Hermite曲线的起点坐标(P0x,P0y),终点坐标(P1x,P1y),以及起点处的切矢量(R0x,R0y)和终点处的切矢量(R1x,R1y),参数变量t在[0,1]的范围内分别取0.01,0.02,…,1,步长为0.01,取100个点,分别求出P(t)=[ x(t),y(t)],在计算机屏幕上显示出每个坐标点,即可绘出Hermite曲线。

《计算机图形学》实验报告

《计算机图形学》实验报告

《计算机图形学》实验报告《实验名称》姓名=学号6010203165专业软件外包班级三班任课教师刘世光天津大学仁爱学院计算机系2012年3 月20 日一、实验目的初步熟悉OpenGL这一图形系统的用法,利用Visual C++编程平台。

学习并掌握常用的三维绘制函数。

二、实验内容准备glut库,并联系使用Visual C++进行最简单的图形处理。

调试并学习Teapot绘制程序。

总结三维绘制和二维绘制的异同点。

三、实验结果程序1程序2程序3四、实验分析和总结五、源代码程序1#include <GL/glut.h>//初始化OpenGLvoid init(void){glClearColor(0.0f, 0.0f, 0.0f, 0.0f);//设置背景颜色glShadeModel(GL_FLAT);//设置明暗处理}//主要的绘制过程void display(void){glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓存glColor3f(0.0f,0.0f,1.0f);glRectf(250.0f,250.0f,400.0f,400.0f);glBegin(GL_LINES);//开始画直线glColor3f(1.0f, 1.0f, 1.0f);//设置颜色为白色glVertex2f(30.0f, 30.0f);//第一根线的两个端点glVertex2f(200.0f, 400.0f);glColor3f(1.0f, 0.0f, 0.0f);//设置第二根线的颜色为红色glVertex2f(25.0f, 350.0f);//第二根线的两个端点glVertex2f(250.0f, 50.0f);glEnd();//画线结束glBegin(GL_TRIANGLES);//开始画三角形,注意,没有设颜色,所以还是红色glVertex2f(400.0f, 100.0f);//三角形的三个顶点glVertex2f(600.0f, 100.0f);glVertex2f(500.0f, 300.0f);glEnd();//结束画三角形glFlush();//开始绘制}//在窗口改变大小时调用void reshape(int width, int height)glViewport(0, 0, width, height);//设置视口glMatrixMode(GL_PROJECTION);//设置当前为投影变换模式glLoadIdentity();//用单位矩阵替换当前变换矩阵gluOrtho2D(0.0, width, 0.0, height);//设置正交投影视图体}//处理键盘void keyboard(unsigned char key, int x, int y){switch (key){case 27://esc键退出exit(0);break;default:break;}}int main(int argc, char** argv){glutInit(&argc, argv);//初始化glutglutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//设置为单缓存,RGB模式glutInitWindowSize(640, 480); //设置窗口大小glutInitWindowPosition(0, 0);//设置窗口起始位置glutCreateWindow("Basic");//设置窗口标题init();//初始化OpenGLglutDisplayFunc(display);//设置显示回调函数glutReshapeFunc(reshape);//设置reshape回调函数glutKeyboardFunc(keyboard);//设置键盘回调函数glutMainLoop();//进入主循环return 0;}//代码要有详细的注释程序2#include "StdAfx.h"#include <stdlib.h>#include <GL/glut.h>void init(void){glEnable(GL_DEPTH_TEST);GLfloat position[] = {1.0, 1.0, 1.0, 0.0};glLightfv(GL_LIGHT0, GL_POSITION, position);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);GLfloat ambient[] = {0.0, 0.0, 0.0, 1.0};GLfloat diffuse[] = {0.8, 0.4, 0.3, 0.7};GLfloat specular[] = {0.5, 0.3, 0.3, 0.0};glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, specular);glMaterialf(GL_FRONT, GL_SHININESS, 50.0);}void display(void){glClearColor(0.65f, 0.3f, 0.05f, 1.0f);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glNewList(1, GL_COMPILE);glutSolidTeapot(0.5);glEndList();glCallList(1);glFlush();}void reshape(GLsizei w, GLsizei h){glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);glMatrixMode(GL_MODELVIEW);}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowPosition(260, 100);glutInitWindowSize(500, 500);glutCreateWindow(argv[0]);init();glutReshapeFunc(reshape);glutDisplayFunc(display);glutMainLoop();return 0;}程序3#include <GL/glut.h>//初始化OpenGLvoid init(void){glClearColor(0.0f, 0.0f, 0.0f, 0.0f);//设置背景颜色glShadeModel(GL_FLAT);//设置明暗处理}//主要的绘制过程void display(void){glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓存glColor3f(0.0f,0.0f,1.0f);glRectf(250.0f,250.0f,400.0f,400.0f);glBegin(GL_LINES);//开始画直线glColor3f(1.0f, 1.0f, 1.0f);//设置颜色为白色glVertex2f(30.0f, 30.0f);//第一根线的两个端点glVertex2f(200.0f, 400.0f);glColor3f(1.0f, 0.0f, 0.0f);//设置第二根线的颜色为红色glVertex2f(25.0f, 350.0f);//第二根线的两个端点glVertex2f(250.0f, 50.0f);glEnd();//画线结束glBegin(GL_TRIANGLES);//开始画三角形,注意,没有设颜色,所以还是红色glVertex2f(400.0f, 100.0f);//三角形的三个顶点glVertex2f(600.0f, 100.0f);glVertex2f(500.0f, 300.0f);glEnd();//结束画三角形glFlush();//开始绘制}//在窗口改变大小时调用void reshape(int width, int height){glViewport(0, 0, width, height);//设置视口glMatrixMode(GL_PROJECTION);//设置当前为投影变换模式glLoadIdentity();//用单位矩阵替换当前变换矩阵gluOrtho2D(0.0, width, 0.0, height);//设置正交投影视图体}//处理键盘void keyboard(unsigned char key, int x, int y){switch (key){case 27://esc键退出exit(0);break;default:break;}}int main(int argc, char** argv){glutInit(&argc, argv);//初始化glutglutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//设置为单缓存,RGB模式glutInitWindowSize(640, 480); //设置窗口大小glutInitWindowPosition(0, 0);//设置窗口起始位置glutCreateWindow("Basic");//设置窗口标题init();//初始化OpenGLglutDisplayFunc(display);//设置显示回调函数glutReshapeFunc(reshape);//设置reshape回调函数glutKeyboardFunc(keyboard);//设置键盘回调函数glutMainLoop();//进入主循环return 0;}//代码要有详细的注释。

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

计算机图形学实验报告,DOC
{
glClearColor(1.0f,1.0f,1.0f,0.0f);
glLineWidth(12.0f);
glColor4f(0.0,0.6,1.0,1.0);
lineList=glGenLists(1);//获得一个显示列表标识
glNewList(lineList,GL_COMPILE);//定义显示列表
glVertex2f(x,y);
if(d<0)d+=2*x+3;
else{
d+=2*(x-y)+5;
y--;
}
x++;
}
glEnd();
}
voiddisplay()
{
glClearColor(1,1,1,1);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1,0,0);
glClear(GL_COLOR_BUFFER_BIT);
winWidth=newWidth;
winHeight=newHeight;
}
intmain(intargc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glBegin(GL_POINTS);
glVertex2i(int(x+0.5),(int)(y+0.5));
glEnd();
x+=xIncre;
y+=yIncre;
}
}
voidDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);

《计算机图形学》实验指导书

《计算机图形学》实验指导书

计算机图形学实验指导书袁科计算机技术实验中心目录实验一实现DDA、中点画线算法和Bresenham画线算法 (24)实验二实现Bezier曲线 (25)实验三实现B样条曲线 (26)实验四实现多边形填充的边界标志算法 (27)实验五实现裁剪多边形的Cohen-Sutherland算法 (28)实验六二维图形的基本几何变换 (30)实验七画图软件的编制 (31)实验一实现DDA、中点画线算法和Bresenham画线算法【实验目的】1、掌握直线的多种生成算法;2、掌握二维图形显示原理。

【实验环境】VC++6.0/ BC【实验性质及学时】验证性实验,2学时,必做实验【实验内容】利用任意的一个实验环境,编制源程序,分别实现直线的三种生成算法,即数字微分法(DDA)、中点画线法以及Bresenham画线算法。

【实验原理】1、数字微分法(Digital Differential Analyzer,DDA)算法思想:基于直线的微分方程来生成直线。

ε=1/max(|△x|,|△y|)max(|△x|,|△y|)=|△x|,即|k|≤1 的情况:max(|△x|,|△y|)=|△y|,此时|k|≥1:2、中点画线法算法思想:每次在最大位移方向上走一步,另一方向是否走步取决于误差项的判断。

3、Bresenham画线算法算法思想:其基本思想同中点算法一样,即每次在最大位移方向上走一步,而另一个方向是否走步取决于误差项的判断。

【实验要求】1.上交源程序;2.上交实验报告,实验报告内容如下:(1) 实验名称(2) 实验目的(3) 算法实现的设计方法及程序流程图(4) 程序结果分析【分析与思考】(1) 上述所阐述的三个算法,其基本算法只能适用于直线的斜率(|K|<=1) 的情形,如何将上述算法进行推广,使其能够处理任意斜率的直线?(2) 计算机显示屏幕的坐标圆心在哪里,与我们平时的习惯有什么差异,如何协调二者?实验二 实现Bezier 曲线【实验目的】1、掌握Bezier 曲线的定义;2、能编程实现N 次Bezier 曲线的绘制与显示。

《计算机图形学》实验报告

《计算机图形学》实验报告

《计算机图形学》实验报告目录1实验2:直线的生成 (1)1.1实验要求和目的 (1)1.2实验课时 (1)1.3实验环境 (1)1.4实验内容 (1)1.5核心代码 (3)1.6实验结果 (7)1.6.1DDA算法 (10)1.6.2Mid-Bresenham算法 (11)1.7心得与体会 (12)2实验4:BSpline曲线绘制 (13)2.1实验要求和目的 (13)2.2实验课时 (13)2.3实验环境 (13)2.4实验内容 (13)2.5核心代码 (16)2.6实验结果 (18)2.6.1B-样条算法 (19)2.6.2Bezeir算法 (22)2.7心得与体会 (24)附录 (25)BSpline曲线控制点的测试数据 (25)数据1 (25)数据2 (27)数据3 (29)数据4 (30)数据5 (31)数据6 (33)数据7 (36)数据8 (38)1实验2:直线的生成1.1实验要求和目的理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力;编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel 等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。

1.2实验课时3学时1.3实验环境本试验提供自带实验平台·开发环境:Visual C++ 6.0·实验平台:Free_Curve(自制平台)1.4实验内容本实验提供名为 Experiment_Frame_One的平台,该平台提供基本绘制、设置、输入功能,学生在此基础上实现·平台界面:如图1.4.1所示·设置:通过view->setting菜单进入,如图1.4.2所示·输入:通过view->input…菜单进入,如图1.4.3所示·实现算法:▪DDA算法:void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1)▪Mid_Bresenham算法:voidCExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1)图 1.4.1 总界面图 1.4.2 设置界面图 1.4.3 输入界面1.5核心代码本次实验的核心代码如下所示。

计算机图形学实验--完整版-带结果--vc++实现

计算机图形学实验--完整版-带结果--vc++实现

计算机图形学实验报告信息学院计算机专业20081060183 周建明综括:利用计算机编程语言绘制图形,主要实现以下内容:(1)、中点算法生成任意斜率直线,并设置线型线宽。

(2)、中点算法生成圆(3)、中点算法生成椭圆(4)、扫描算法实现任意多边形填充(5)、Cohen_Sutherland裁剪(6)、自由曲线与曲面的绘制(7)、二维图形变换(8)、三视图变换实验一、直线的生成一、实验内容根据提供的程序框架,修改部分代码,完成画一条直线的功能(中点画线法或者Bresenham画线法任选一),只要求实现在第一象限内的直线。

二、算法原理介绍双击直线生成.dsw打开给定的程序,或者先启动VC++,文件(file)→打开工作空间(open workspace)。

打开直线生成view.cpp,按注释改写下列函数:1.void CMyView::OnDdaline() (此为DDA生成直线)2.void CMyView::OnBresenhamline()(此为Bresenham画直线)3.void CMYView::OnMidPointLine()(此为中点画线法)三、程序源代码1.DDA生成直线画法程序:float x,y,dx,dy,k;dx=(float)(xb-xa);dy=(float)(yb-ya);k=dy/dx;x=xa;y=ya;if(abs(k)<1){for (x=xa;x<=xb;x++){pdc->SetPixel(x, int(y+0.5),COLOR);y=y+k;}}if(abs(k)>=1){for(y=ya;y<=yb;y++){pdc->SetPixel(int(x+0.5),y,COLOR);x=x+1/k;}}//DDA画直线结束}2.Bresenham画直线源程序:float b,d,xi,yi;int i;float k;k=(yb-ya)/(xb-xa);b=(ya*xb-yb*xa)/(xb-xa);if(k>0&&k<=1)for(i=0;i<abs(xb-xa);i++){ d=ya+0.5-k*(xa+1)-b;if(d>=0){ xi=xa+1;yi=ya;xa++;ya=ya+0.5;}if(d<0){ xi=xa+1;yi=ya+1;xa++;ya=ya+1.5;}pdc->SetPixel(xi,yi,COLOR);}//BresenHam画直线结束}3.中点画线法源程序:float b,d,xi,yi;int i;float k;k=(yb-ya)/(xb-xa);b=(ya*xb-yb*xa)/(xb-xa);if(k>0&&k<=1)for(i=0;i<abs(xb-xa);i++){ d=ya+0.5-k*(xa+1)-b;if(d>=0){ xi=xa+1;yi=ya;xa++;ya=ya+0.5;}if(d<0){ xi=xa+1;yi=ya+1;xa++;ya=ya+1.5;}pdc->SetPixel(xi,yi,COLOR); }//BresenHam画直线结束}四、实验结果1、DDA生成直线2、Bresenham画直线3、中点画线法实验二、bresenham画圆一、实验内容根据提供的程序框架,修改部分代码,用Bresenham画法画一段圆弧或者画圆。

《计算机图形学》实验报告

《计算机图形学》实验报告

实验报告模板《计算机图形学》实验报告一、实验目的及要求1.实习三维图形的坐标系之间的变换;2.三维图形几何变换;3.掌握三维图形的坐标系之间的变换算法及三维图形几何变换的原理和实现;4.实现二维图形的基本变换(平移、旋转、缩放、错切、对称、复合等);5.实现三维图形的基本变换(平移、旋转、缩放、复合等);二、理论基础在齐次坐标理论下,二维图形几何变换矩阵可用下式表示:⎪⎪⎪⎭⎫⎝⎛===ifchebgdaTnkxx kk2,1,0,)(ϕ平移变换:[x* y* 1] =[x y 1] *0000001ts⎛⎫⎪⎪⎪⎝⎭=[t*x s*y 1]比例变换:[x* y* 1]=[x y 1] *1000101m n⎛⎫⎪⎪⎪⎝⎭=[m+x n+y 1]旋转变换:在平面上的二维图形饶原点逆时针旋转Ө角,变换矩阵为[x* y* 1]=[x y 1] *cos sin0sin cos0001θθθθ⎛⎫⎪- ⎪⎪⎝⎭= [x*cosө-y*sinө]复合变换:以上各种变换矩阵都是以原点为参照点,当以任意参照点进行变换的时候,我们就要用到复合变换矩阵。

三维变换类似于二维,在画图时,把三维坐标转换为二维即可。

三、算法设计与分析二维变换:#define dx 50#define dy 100void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+dx;a[1]=m[i][1]+dy;b[0]=m[i+1][0]+dx;b[1]=m[i+1][1]+dy;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define h 0.1745#include<math.h>void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*cos(h)-m[i][1]*sin(h);a[1]=m[i][1]*cos(h)+m[i][0]*sin(h);b[0]=m[i+1][0]*cos(h)-m[i+1][1]*sin(h);b[1]=m[i+1][1]*cos(h)+m[i+1][0]*sin(h);DDALine(a,b, RGB(0, 200, 255), pDC);}}#define k 2;#define f 2.5void CCGWithVCView::OnTransMove() //缩放{// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Scale Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*k;a[1]=m[i][1]*f;b[0]=m[i+1][0]*k;b[1]=m[i+1][1]*f;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define n 2#define d 0void CCGWithVCView::OnTransOther(){// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Other Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+n*m[i][1];a[1]=m[i][1]+d*m[i][0];b[0]=m[i+1][0]+n*m[i+1][1];b[1]=m[i+1][1]+d*m[i+1][0];DDALine(a,b, RGB(0, 200, 255), pDC);}}三维变换:#include<math.h>#define dx 100#define dy 100#define dz 0void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]+dy-p3d[i][0]+dx/sqrt(2);p2d[i][1]=p3d[i][2]+dz+p3d[i][0]+dx/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}#define k 0.1745void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]*cos(k)-p3d[i][2]*sin(k)-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]*cos(k)+p3d[i][1]*sin(k)+p3d[i][0]/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}四、程序调试及结果的分析二维:三维:五、实验心得及建议在实验过程中,尽管过程中任由许多不会的地方,而且有待于今后的提高和改进,但我加深了对书本上知识的理解与掌握,同时也学到了很多书本上没有东西,并积累了一些宝贵的经验,这对我以后的学习与工作是不无裨益的。

南邮计算机图形学实验报告(修正版)

南邮计算机图形学实验报告(修正版)

实验报告实验名称指导教师实验类型综合实验学时 2 实验时间一、实验目的和要求能够灵活的运用OpenGL图形API函数,基于C++程序语言,结合操作系统交互接口实现交互式3D动画。

基于实验1的基本内容,设计增加键盘及鼠标输入的互动,实现三维物体交互式运动效果。

(物体的旋转或平移);1.所有图形(例如球体,正方体)有清晰的轮廓,实现3D交互动画效果。

2.学会导入Vertex的其他属性,如normal,texture,实现纹理映射。

二、实验环境(实验设备)硬件:微机软件:vs2012实验报告三、实验过程描述与结果分析实验代码:#include<stdlib.h>#include<GL/glut.h>#include<windows.h>float ratX = 60;float ratY = 60;float ratZ = 60;float tx=0;float ty=0;float sf=0;void DrawBox(){glBegin(GL_QUADS);//前面glColor3f(1,0,0);glVertex3f(-1.0f, -1.0f, 1.0f);// 四边形的左下glVertex3f( 1.0f, -1.0f, 1.0f);// 四边形的右下glVertex3f( 1.0f, 1.0f, 1.0f);// 四边形的右上glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左上// 后面glColor3f(0,1,0);glVertex3f(-1.0f, -1.0f, -1.0f);// 四边形的右下glVertex3f(-1.0f, 1.0f, -1.0f); // 四边形的右上glVertex3f( 1.0f, 1.0f, -1.0f); // 四边形的左上glVertex3f( 1.0f, -1.0f, -1.0f);// 四边形的左下// 顶面glColor3f(0,0,1);glVertex3f(-1.0f, 1.0f, -1.0f); // 四边形的左上glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左下glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右下glVertex3f( 1.0f, 1.0f, -1.0f); // 四边形的右上// 底面glColor3f(1,1,0);glVertex3f(-1.0f, -1.0f, -1.0f);// 四边形的右上glVertex3f( 1.0f, -1.0f, -1.0f);// 四边形的左上glVertex3f( 1.0f, -1.0f, 1.0f); // 四边形的左下glVertex3f(-1.0f, -1.0f, 1.0f); // 四边形的右下// 右面glColor3f(0,1,1);glVertex3f( 1.0f, -1.0f, -1.0f);// 四边形的右下glVertex3f( 1.0f, 1.0f, -1.0f); // 四边形的右上glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的左上glVertex3f( 1.0f, -1.0f, 1.0f); // 四边形的左下// 左面glColor3f(1,0,1);glVertex3f(-1.0f, -1.0f, -1.0f);// 四边形的左下glVertex3f(-1.0f, -1.0f, 1.0f);// 四边形的右下glVertex3f(-1.0f, 1.0f, 1.0f);// 四边形的右上glVertex3f(-1.0f, 1.0f, -1.0f);// 四边形的左上glEnd();}void display(){glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);//清空颜色和深度缓存glMatrixMode(GL_MODELVIEW);glLoadIdentity();//gluLookAt(2.0, 2.0, 2.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);glTranslatef(0.0f+tx,0.0f+ty,-4.0f);//平移变换glScalef(1+sf,1+sf,1+sf);//缩放变换glRotatef(ratX, 1.0f, 0.0f, 0.0f);//绕X轴的旋转变换glRotatef(ratY, 0.0f, 1.0f, 0.0f);//绕Y轴的旋转变换glRotatef(ratZ, 0.0f, 0.0f, 1.0f);//绕Z轴的旋转变换DrawBox();glFlush();glutSwapBuffers();}void reshape(int w, int h) //重绘回调函数,在窗口首次创建或用户改变窗口尺寸时被调用{glViewport(0, 0, w, h);// 指定视口的位置和大小glMatrixMode(GL_PROJECTION);glLoadIdentity();//glFrustum(-1.0, 1.0, -1.0, 1.0, 3.1, 10.0);//gluPerspective(45,1,0.1,10.0);glOrtho(-2.0, 2.0, -2.0, 2.0, 2.0, 10.0);}void init(){glClearColor (1.0, 1.0, 1.0, 1.0);glEnable(GL_DEPTH_TEST);//启动深度测试模式}void myKeyboard(unsigned char key, int x, int y) {if(key == 'a' || key == 'A')ratX += 2;ratY += 2;ratZ += 2;if(key == 's' || key == 'S')ratX -= 2;ratY -= 2;ratZ -= 2;if(key == 'j' || key == 'J')sf+=0.1;if(key == 'k' || key == 'K')sf-=0.1;if(key == 'c' || key == 'C')exit(0);glutPostRedisplay(); //重新调用绘制函数}void myspecialKeyboard(int key,int x,int y){if(key == GLUT_KEY_UP )ty+=0.1;if(key == GLUT_KEY_DOWN)ty-=0.1;if(key ==GLUT_KEY_LEFT)tx-=0.1;if(key==GLUT_KEY_RIGHT)tx+=0.1;glutPostRedisplay();}int main(int argc, char** argv){glutInit(&argc,argv); // 初始GLUT.glutInitDisplayMode(GLUT_DEPTH|GLUT_DOUBLE|GLUT_RGB); //设定显示模式glutInitWindowSize(400,400); // 设定窗口大小glutInitWindowPosition(50,100); // 设定窗口位置glutCreateWindow("立方体的简单三维交互式几何变换"); // 用前面指定参数创建glutReshapeFunc(reshape); //指定重绘回调函数glutDisplayFunc(display); // 进行一些初始化工作glutKeyboardFunc( myKeyboard); //指定键盘回调函数glutSpecialFunc(myspecialKeyboard); //指定键盘回调函数init();glutMainLoop();// 进入无穷循环,等待事件处理}实验结果图:实验报告四、实验小结(包括问题和解决方法、心得体会、意见与建议等)通过此次实验灵活的运用OpenGL图形API函数,基于C++程序语言,结合操作系统交互接口实现了交互式3D动画。

计算机图形学实验报告及代码

计算机图形学实验报告及代码

计算机图形学实验报告及代码第 1 章概述一、教学目标通过本章的学习,使学生能够了解计算机图形学的基本概念、研究内容;当前的发展概况;本门课程的特点和应用。

二、教学要求1.了解计算机图形学的概念和研究内容;2.了解本门课程的发展概况。

三、教学内容提要1. 计算机图形学的研究内容2. 计算机图形学发展概况3. 计算机图形学特点和应用4. 计算机图形学当前研究的课题5. 计算机图形生成和输出的流水线四、教学重点、难点及解决方法本章将主要围绕计算机图形学的基本概念进行介绍,介绍研究内容;当前的发展概况;本门课程的特点和应用等等。

五、课时安排2学时六、教学设备多媒体七、检测教学目标实现程度的具体措施和要求通过课堂提问的方式来检测学生对基本概念的掌握程度。

八、教学内容1.1 计算机图形学的研究内容计算机图形学(Computer Graphics): 研究通过计算机将数据转换为图形,并在专用显示设备上显示的原理、方法和技术的学科。

计算机图形表现形式(1).线条式(线框架图)用线段来表现图形,容易反映客观实体的内部结构,如各类工程技术中结构图的表示,机械设计中零件结构图及电路设计中的电路原理图等。

具有面模型、色彩、浓淡和明暗层次效应,适合表现客观实体的外形或外貌,如汽车、飞机、轮船等的外形设计以及各种艺术品造型设计等。

(2).真实感面模型图形跑车靓照计算机图形分类(空间)(1).二维图形(2D):在平面坐标系中定义的图形(2).三维图形(3D):在三维坐标系中定义的图形计算机图形产生方法(1).矢量法(短折线法)任何形状的曲线都用许多首尾相连的短直线(矢量)逼近。

(2).描点法(像素点串接法)每一曲线都是由一定大小的像素点组成计算机绘图方式:(1)交互式绘图允许操作者以某种方式(对话方式或命令方式)来控制和操纵图形生成过程,使得图形可以边生成、边显示、边修改,直至符合要求为止。

如AUTOCAD等(2)被动式绘图图形在生成过程中,操作者无法对图形进行操作和控制。

南昌大学信工学院计算机图形学实验报告(附详细代码)

南昌大学信工学院计算机图形学实验报告(附详细代码)

实验报告实验课程:计算机图形学学生姓名:XXX学号:XXX专业班级:计算机科学与技术X班20XX年XX月XX日目录实验一直线和圆的生成 (3)实验二区域填充 (12)实验三裁剪算法 (15)实验四Bezier曲线的绘制 (23)实验五B样条曲线的绘制 (27)南昌大学实验报告学生姓名:学号:专业班级:实验类型:□验证□综合□设计□创新实验日期:实验成绩:实验一直线和圆的生成一、实验项目名称直线和圆的生成二、实验目的1、掌握DDA、Bresenham 直线生成算法;2、掌握中点画圆生成算法三、实验要求1、编程实现DDA、Bresenham算法生成直线2、编程实现中点画圆的算法四、实验步骤1、根据实验要求分析实验,并写出相应算法的实现2、选择适当语言实现算法;3、调试程序。

五、实验内容1、Bresenham画线算法的实现#include<gl\glut.h>#include<stdlib.h>#include<math.h>void init(void){glClearColor(1.0,1.0,1.0,0.0);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,600.0,0.0,500.0);}void setPixel(int x,int y){glBegin(GL_POINTS);glVertex2i(x,y);glEnd();}void lineBres(int x0,int y0,int xEnd,int yEnd) {int dx=abs(xEnd-x0),dy=abs(yEnd-y0);int p=2*dy-dx;int twoDy=2*dy,twoDyMinusDx=2*(dy-dx);int x,y;if(x0>xEnd){x=xEnd;y=yEnd;}else{x=x0;y=y0;}setPixel( x, y);while(x<xEnd){x++;if(p<0)p+=twoDy;else{y++;p+=twoDyMinusDx;}setPixel( x, y);}}void lineSegment(void){glClear(GL_COLOR_BUFFER_BIT);glColor3f(0.0,0.0,1.0);lineBres(50,50,400,300);glFlush();}void main(int argc,char** argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(50,100);glutInitWindowSize(400,300);glutCreateWindow("An Line OpenGL Program");init();glutDisplayFunc(lineSegment);glutMainLoop();}2、DDA算法的实现#include<gl\glut.h>#include<math.h>void init(void){glClearColor(1.0,1.0,1.0,0.0);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,600.0,0.0,500.0);}void setPixel(int x,int y){glBegin(GL_POINTS);glVertex2i(x,y);glEnd();}inline int round(const float a){return int(a+0.5);}void lineDDA (int x0,int y0,int xEnd,int yEnd){int dx=xEnd-x0,dy=yEnd-y0,steps,k;float xIncrement,yIncrement,x=x0,y=y0;if(abs(dx)>abs(dy))steps=abs(dx);elsesteps=abs(dy);xIncrement=GLfloat(dx)/GLfloat(steps);yIncrement=GLfloat(dy)/GLfloat(steps);setPixel( x, y);for(k=0;k<steps;k++){x+=xIncrement;y+=yIncrement;setPixel( x, y);}}void lineSegment(void){glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);lineDDA(50,50,400,300);glFlush();}void main(int argc,char** argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(50,100);glutInitWindowSize(400,300);glutCreateWindow("DDA OpenGL Program");init();glutDisplayFunc(lineSegment);glutMainLoop();}3、圆的生成#include<gl\glut.h>#include <math.h>const int n = 20;const GLfloat R = 0.5f;const GLfloat Pi = 3.1415926536f;void init(void){glClearColor(1.0,1.0,1.0,0.0);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,200.0,0.0,150.0);}void myDisplay(void){int i;glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glBegin(GL_POL YGON);for(i=0; i<n; ++i)glVertex2f(R*cos(2*Pi/n*i), R*sin(2*Pi/n*i));glEnd();glFlush();}void main(int argc,char** argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(50,100);glutInitWindowSize(500,500);glutCreateWindow("An Circle OpenGL Program");init();glutDisplayFunc(myDisplay);glutMainLoop();return ;}4、修改后的圆的生成#include <GL/glut.h>#include <math.h>const int n = 20;const GLfloat R = 0.5f;const GLfloat Pi = 3.1415926536f;void myDisplay(void){int i;glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0.0,0.0);glBegin(GL_POL YGON);for(i=0; i<n; ++i)glVertex2f(R*cos(2*Pi/n*i), R*sin(2*Pi/n*i));glEnd();glFlush();}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("画圆的程序");glutDisplayFunc(&myDisplay);glutMainLoop();return 0}5、中点画圆算法#include<gl/glut.h>#include<stdlib.h>#include<math.h>void init(void){glClearColor(1.0,1.0,1.0,0.0);glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,200.0,0.0,150.0);}class screenPt{private:GLint x,y;public:screenPt(){x=y=0;}void setCoords(GLint xCoordValue,GLint yCoordValue){ x=xCoordValue;y= yCoordValue;}GLint getx() const{return x;}GLint gety() const{return y;}void incrementx(){x++;}void decrementy(){y--;}void setPixel(GLint xCoord,GLint yCoord){glBegin(GL_POINTS);glVertex2i(xCoord,yCoord);glEnd();}void circleMidpoint(GLint xc,GLint yc,GLint radius) {screenPt circPt;GLint p=1-radius;circPt.setCoords(0,radius);void cieclePlotPoints(GLint,GLint,screenPt);cieclePlotPoints(xc,yc,circPt);while(circPt.getx()<circPt.gety()){circPt.incrementx();if (p < 0)p += 2 * circPt.getx() + 1;else {circPt.decrementy();p += 2 * (circPt.getx() - circPt.gety()) + 1;}cieclePlotPoints(xc,yc,circPt);}}void cieclePlotPoints(GLint xc,GLint yc,screenPt circPt) {setPixel(xc+circPt.getx(),yc+circPt.gety());setPixel(xc-circPt.getx(),yc+circPt.gety());setPixel(xc+circPt.getx(),yc-circPt.gety());setPixel(xc-circPt.getx(),yc-circPt.gety());setPixel(xc+circPt.gety(),yc+circPt.getx());setPixel(xc-circPt.gety(),yc+circPt.getx());setPixel(xc+circPt.gety(),yc-circPt.getx());setPixel(xc-circPt.gety(),yc-circPt.getx());}void myDisplay(void){glClear(GL_COLOR_BUFFER_BIT);glColor3f(0.0,1.0,0.0);circleMidpoint(50,50,20);glFlush();void main(int argc,char** argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(50,100);glutInitWindowSize(400,300);glutCreateWindow("A Circle OpenGL Program");init();glutDisplayFunc(myDisplay);glutMainLoop();}六、实验结果Bresenham画线算法的实现:DDA算法的实现:圆的生成:中点画圆算法:七、实验心得课本上有画直线和中点画圆的核心代码,只要加上main函数和窗口定义等的基本函数,稍微修改就可以得到完整的程序,比较简单。

三维图形的生成计算机图形学源代码及报告

三维图形的生成计算机图形学源代码及报告

实验报告《计算机图形学》课题:三维图形的生成指导教师:***2013年5月三维图形的生成一.目的1.加深对计算机图形学的理解。

2.熟悉Visual C++ OpenGL的编程方法。

3.学习用编程方法绘制三维图形。

二.实验原理V oid CALLBACK display(void){glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,1.0,1.0);glLoadIdentity();glTranslatef(0.0,0.0,-5.0);glScalef(1.0,2.0,1.0);auxWireCube(1.0);glFlush();} //画图void CALLBACK stepDisplay(void){r tri+=0.01;d isplay();}void CALLBACK myReshape(GLsizei w,GLsizei h){g lMatrixMode(GL_PROJECTION);g lLoadIdentity();g lFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0);g lMatrixMode(GL_MODELVIEW);g lViewport(0,0,w,h);} //旋转三.实验步骤1.复习OpenGL语言。

2.编写图形生成程序,分析绘制结果。

四.实验内容#include<gl/glaux.h>#pragma comment(lib,"glaux.lib")#pragma comment(lib,"opengl32.lib")#pragma comment(lib,"glu32.lib")GLfloat rtri=0;1void myinit(void){glShadeModel(GL_SMOOTH);}void CALLBACK display(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // 清除屏幕及深度缓存glLoadIdentity(); // 重置模型观察矩阵glTranslatef(-1.5,0.0,-6.0); // 左移1.5 单位,并移入屏幕6.0 glRotatef(rtri,0.0,1.0,0.0); // 绕Y轴旋转正方体glBegin(GL_TRIANGLES); // 开始绘制金字塔的各个面glColor3f(1.0f,0.0f,0.0f); // 红色glVertex3f( 0.0f, 1.0f, 0.0f); // 三角形的上顶点(前侧面)glColor3f(0.0f,1.0f,0.0f); // 绿色glVertex3f(-1.0f,-1.0f, 1.0f); // 三角形的左下顶点(前侧面)glColor3f(0.0f,0.0f,1.0f); // 蓝色glVertex3f( 1.0f,-1.0f, 1.0f); // 三角形的右下顶点(前侧面)glColor3f(1.0f,0.0f,0.0f); // 红色glVertex3f( 0.0f, 1.0f, 0.0f); // 三角形的上顶点(右侧面)glColor3f(0.0f,0.0f,1.0f); // 蓝色glVertex3f( 1.0f,-1.0f, 1.0f); // 三角形的左下顶点(右侧面)glColor3f(0.0f,1.0f,0.0f); // 绿色glVertex3f( 1.0f,-1.0f, -1.0f); // 三角形的右下顶点(右侧面)glColor3f(1.0f,0.0f,0.0f); // 红色glVertex3f( 0.0f, 1.0f, 0.0f); // 三角形的上顶点(后侧面)glColor3f(0.0f,1.0f,0.0f); // 绿色glVertex3f( 1.0f,-1.0f, -1.0f); // 三角形的左下顶点(后侧面)glColor3f(0.0f,0.0f,1.0f); // 蓝色glVertex3f(-1.0f,-1.0f, -1.0f); // 三角形的右下顶点(后侧面)glColor3f(1.0f,0.0f,0.0f); // 红色glVertex3f( 0.0f, 1.0f, 0.0f); // 三角形的上顶点(左侧面)glColor3f(0.0f,0.0f,1.0f); // 蓝色glVertex3f(-1.0f,-1.0f,-1.0f); // 三角形的左下顶点(左侧面)glColor3f(0.0f,1.0f,0.0f); // 绿色glVertex3f(-1.0f,-1.0f, 1.0f); // 三角形的右下顶点(左侧面)glEnd();2glTranslatef(0.0f,0.0f,-7.0f); // 先右移再移入屏幕glRotatef(rtri,0.0f,1.0f,0.0f); // 在XYZ轴上旋转立方体glBegin(GL_QUADS); // 开始绘制立方体glColor3f(0.0f,1.0f,0.0f); // 颜色改为蓝色glVertex3f( 1.0f, 1.0f,-1.0f); // 四边形的右上顶点(顶面) glVertex3f(-1.0f, 1.0f,-1.0f); // 四边形的左上顶点(顶面) glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左下顶点(顶面) glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右下顶点(顶面)glColor3f(1.0f,0.5f,0.0f); // 颜色改成橙色glVertex3f( 1.0f,-1.0f, 1.0f); // 四边形的右上顶点(底面) glVertex3f(-1.0f,-1.0f, 1.0f); // 四边形的左上顶点(底面) glVertex3f(-1.0f,-1.0f,-1.0f); // 四边形的左下顶点(底面) glVertex3f( 1.0f,-1.0f,-1.0f); // 四边形的右下顶点(底面)glColor3f(1.0f,0.0f,0.0f); // 颜色改成红色glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的右上顶点(前面) glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的左上顶点(前面) glVertex3f(-1.0f,-1.0f, 1.0f); // 四边形的左下顶点(前面) glVertex3f( 1.0f,-1.0f, 1.0f); // 四边形的右下顶点(前面)glColor3f(1.0f,1.0f,0.0f); // 颜色改成黄色glVertex3f( 1.0f,-1.0f,-1.0f); // 四边形的右上顶点(后面) glVertex3f(-1.0f,-1.0f,-1.0f); // 四边形的左上顶点(后面) glVertex3f(-1.0f, 1.0f,-1.0f); // 四边形的左下顶点(后面) glVertex3f( 1.0f, 1.0f,-1.0f); // 四边形的右下顶点(后面)glColor3f(0.0f,0.0f,1.0f); // 颜色改成蓝色glVertex3f(-1.0f, 1.0f, 1.0f); // 四边形的右上顶点(左面) glVertex3f(-1.0f, 1.0f,-1.0f); // 四边形的左上顶点(左面) glVertex3f(-1.0f,-1.0f,-1.0f); // 四边形的左下顶点(左面) glVertex3f(-1.0f,-1.0f, 1.0f); // 四边形的右下顶点(左面)glColor3f(1.0f,0.0f,1.0f); // 颜色改成紫罗兰色glVertex3f( 1.0f, 1.0f,-1.0f); // 四边形的右上顶点(右面) glVertex3f( 1.0f, 1.0f, 1.0f); // 四边形的左上顶点(右面) glVertex3f( 1.0f,-1.0f, 1.0f); // 四边形的左下顶点(右面) glVertex3f( 1.0f,-1.0f,-1.0f); // 四边形的右下顶点(右面)glEnd(); // 立方体绘制结束3glFlush();}void CALLBACK stepDisplay(void){rtri+=0.01;display();}void CALLBACK myReshape(GLsizei w,GLsizei h) {glMatrixMode(GL_PROJECTION); glLoadIdentity();glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0); glMatrixMode(GL_MODELVIEW);glViewport(0,0,w,h);}int main(int argc,char** argv){auxInitDisplayMode(AUX_SINGLE|AUX_RGBA); auxInitPosition(0,0,500,500);auxInitWindow("bianhuan");myinit();auxReshapeFunc(myReshape);auxIdleFunc(stepDisplay);auxMainLoop(display);}4五.实验结果:六.实验小结:通过这次实验,更深刻的学习了计算机图形学的编程语言,对于OpenGL的了解更一步。

计算机图形学实验报告(一).doc

计算机图形学实验报告(一).doc

实验一OpenGL开发环境及扫描转换算法1、实验目的与要求1.通过实验掌握OpenGL中编程环境的设置,了解相关函数用途及设置步骤;2.通过实验掌握基本图形元素的生成,给出相关代码和运行结果;3.用WINDOWS GDI函数编写生成直线或区域填充的程序(选DDA或Bresenham直线算法,活性边表算法填充多边形),演示算法过程。

4.画矩形,调用一个函数画一个矩形。

画椭圆,调用一个函数画一个椭圆。

画Bezier 曲线。

2、实验方案请描述为达到实验的需要完成哪些方面的实验,列举出实验的基本要点和重点。

在工程WinAPIEX加入void createLine(HDC tmpDC)和void Polyline (tmpDC)在void createLine(HDC tmpDC)用DDA直线算法或Bresenham直线算法生成直线在void Polyline (tmpDC)添加活泩边表填充算法,生成填充四边形和八边形加入Rectangle(tmpDC,x0,y0,x1,y1);加入Ellipse (tmpDC, x0,y0,a,b) ;加入PolyBezier(tmpDC,arr_vertex,4) ;3、实验结果和数据处理1)生成直线的DDA直线算法在createLine(tmpDC)中加入以下代码int x0,y0,x1,y1,color; //自定义直线的起点(x0,y0)和终点(x1,y1),及颜色colorfloat dx,dy,x,y;int length,i;x0=50;y0=160;x1=900;y1=200;//此处修改了color=1000; color=1;if(abs(x1-x0)>=abs(y1-y0))length=abs(x1-x0);elselength=abs(y1-y0);dx=(x1-x0)/(float)length;dy=(y1-y0)/(float)length;i=1;x=(float)x0;y=(float)y0;while(i<=length){SetPixel(tmpDC,int(x+0.5),int(y+0.5),color);x+=dx;y+=dy;i++;}2)区域填充的程序在void Polyline (tmpDC) 添加活性边表填充void Polyline (HDC tmpDC) //多边形边数.{const int POINTNUM=4;//或者是八边形8/******定义结构体用于活性边表AET和新边表NET***************************** ******/typedef struct XET{float x;float dx,ymax;XET* next;}AET,NET;/******定义点结构体point**************************** **************************/struct point{float x;float y;}polypoint[POINTNUM]={100,10 0,400,100,400,400,100,400};//正方形//polypoint[POINTNUM]={600,10 0,700,100,800,200,800,300,700,400,600, 400,500,300,500,200};//八边形顶点/******计算最高点的y坐标(扫描到此结束)****************************** **********/int MaxY=0;int i;for(i=0;i<POINTNUM;i++)if(polypoint[i].y>MaxY) MaxY=(int)polypoint[i].y;/*******初始化AET表********************************* **************************/AET *pAET=new AET;pAET->next=NULL;/******初始化NET表********************************* ***************************/NET *pNET[1024];for(i=0;i<=MaxY;i++){pNET[i]=new NET;pNET[i]->next=NULL;}/******扫描并建立NET表********************************* ************************/for(i=0;i<=MaxY;i++){for(intj=0;j<POINTNUM;j++)if(polypoint[j].y==i){if(polypoint[(j-1+POINTNUM)%POINT NUM].y>polypoint[j].y){NET*p=new NET;p->x=polypoint[j].x;p->ymax=polypoint[(j-1+POINTNUM) %POINTNUM].y;p->dx=(polypoint[(j-1+POINTNUM)%P OINTNUM].x-polypoint[j].x)/(polypoint [(j-1+POINTNUM)%POINTNUM].y-po lypoint[j].y);p->next=pNET[i]->next;pNET[i]->next=p;}if(polypoint[(j+1+POINTNUM)%POIN TNUM].y>polypoint[j].y){NET*p=new NET;p->x=polypoint[j].x;p->ymax=polypoint[(j+1+POINTNUM) %POINTNUM].y;p->dx=(polypoint[(j+1+POINTNUM)% POINTNUM].x-polypoint[j].x)/(polypoint[(j+1+POINTNUM)%POINTNUM].y-polypoint[j].y);p->next=pNET[i]->next;pNET[i]->next=p;}}}/******建立并更新活性边表AET***************************** ************************/for(i=0;i<=MaxY;i++){//计算新的交点x,更新AET***************************** ***************************/NET *p=pAET->next;while(p){p->x=p->x + p->dx;p=p->next;}//更新后新AET先排序********************************* ****************************///断表排序,不再开辟空间AET *tq=pAET;p=pAET->next;tq->next=NULL;while(p){while(tq->next && p->x >= tq->next->x)tq=tq->next;NET *s=p->next;p->next=tq->next;tq->next=p;p=s;tq=pAET;}//(改进算法)先从AET表中删除ymax==i的结点********************************* *******/AET *q=pAET;p=q->next;while(p){if(p->ymax==i){q->next=p->next;delete p;p=q->next;}else{q=q->next;p=q->next;}}//将NET中的新点加入AET,并用插入法按X值递增排序********************************* */p=pNET[i]->next;q=pAET;while(p){while(q->next && p->x >= q->next->x)q=q->next;NET *s=p->next;p->next=q->next;q->next=p;p=s;q=pAET;}/******配对填充颜色********************************* ******************************/p=pAET->next;while(p && p->next){for(floatj=p->x;j<=p->next->x;j++){SetPixel(tmpDC,static_cast<int>(j),i,RG B(255,200,0));//此处我改变了颜色,八边形的为黄色//SetPixel(tmpDC,static_cast<int>(j),i,RG B(255,0,0));//还有四边形的红色}p=p->next->next;//考虑端点情况}} }//画矩形Rectangle(tmpDC,20,20,80,80); //左上顶点,右下顶点//画椭圆Ellipse (tmpDC, 20,20,160,360) ;//画Bezier 曲线,利用已有的顶点数据PolyBezier(tmpDC,arr_vertex,4) ;实验截图:1.DDA算法的直线2.四边形和八边形3.正方形4.椭行5.Bezier 曲线实习总结:通过本次实验,我掌握了opengl绘图的一些基本知识,会在vc里面加入opengl的基本库。

计算机图形学实验报告代码

计算机图形学实验报告代码

计算机图形学OpenGL实验指导书目录实验一:OpenGL基础知识 (1)实验二OpenGL中的建模与变换 (2)实验三OpenGL中的光照 (6)实验四OpenGL中的拾取 (9)实验五OpenGL中的纹理映射 (12)实验一:OpenGL基础知识一、实验目的1、建立Windows系统下的OpenGL实验框架。

2、学习理解OpenGL工作流程。

二、实验环境⒈硬件:每个学生需配备计算机一台。

⒉软件:Visual C++;三、实验内容1、建立非控制台的Windows程序框架。

2、建立OpenGL框架。

3、建立OpenGL框架的类文件。

4、完善Windows框架。

5、理解程序间的相互关系。

四、实验要求1、学习教材第2章的内容。

2、理解教材中相关实例的代码,按要求添加到适当的地方,调试并通过运行。

3、运行结果应该与教材中的相关实例相符。

4、编译第2章的框架代码,修改背景色、窗口标题。

五、程序设计提示(略)六、报告要求1.认真书写实验报告,字迹清晰,格式规范。

报告中应写清姓名、学号、实验日期、实验题目、实验目的、实验原理。

2.报告中应书写主要源程序,且源程序中要有注释。

3.报告中应包含运行结果及结果分析。

如调试通过并得到预期的效果,请注明…通过‟并粘贴运行效果图;如未调试通过或结果不正确,试分析原因。

4.报告最后包含实验总结和体会。

实验二OpenGL中的建模与变换一、实验目的1.学习配置OpenGL环境。

2.掌握在OpenGL中指定几何模型的方法。

3. 掌握OpenGL中的透视投影和正投影的设置方法,学会诊断投影问题导致的显示异常。

二、实验环境⒈硬件:每个学生需配备计算机一台。

⒉软件:Visual C++;三、实验内容1.建立OpenGL编程环境(注:Windows自带gl和glu,还需要安装glut库文件。

)(a)查看Windows自带的OpenGL文件。

在文件夹c:\windows\system32下查看是否存在文件opengl32.dll和glu32.dll;在Visual Studio的安装目录Vc7\PlatformSDK\Include\gl下查看是否存在gl.h和glu.h;在Vc7\PlatformSDK\Lib下是否存在opengl32.lib和glu32.lib。

(完整word版)计算机图形学实验报告.docx

(完整word版)计算机图形学实验报告.docx

一、实验目的1、掌握中点 Bresenham直线扫描转换算法的思想。

2 掌握边标志算法或有效边表算法进行多边形填充的基本设计思想。

3掌握透视投影变换的数学原理和三维坐标系中几何图形到二维图形的观察流程。

4掌握三维形体在计算机中的构造及表示方法二、实验环境Windows 系统 , VC6.0。

三、实验步骤1、给定两个点的坐标P0(x0,y0),P1(x1,y1),使用中点 Bresenham直线扫描转换算法画出连接两点的直线。

实验基本步骤首先、使用 MFC AppWizard(exe)向导生成一个单文档视图程序框架。

其次、使用中点 Bresenham直线扫描转换算法实现自己的画线函数,函数原型可表示如下:void DrawLine(CDC *pDC, int p0x, int p0y, int p1x, int p1y);在函数中,可通过调用 CDC 成员函数 SetPixel 来画出扫描转换过程中的每个点。

COLORREF SetPixel(int x, int y, COLORREF crColor );再次、找到文档视图程序框架视图类的OnDraw 成员函数,调用 DrawLine 函数画出不同斜率情况的直线,如下图:最后、程序直至正确画出直。

2、定多形的点的坐P0(x0,y0),P1(x1,y1),P2(x2,y2),P3(x3,y3),P4(x4,y4 )⋯使用志算法或有效表算法行多形填充。

基本步首先、使用 MFC AppWizard(exe)向生成一个文档程序框架。

其次、志算法或有效表算法函数,如下:void FillPolygon(CDC *pDC, int px[], int py[], int ptnumb);px:数用来表示每个点的x 坐py :数用来表示每个点的 y 坐ptnumb:表示点个数注意函数FillPolygon可以直接通窗口的DC(描述符)来行多形填充,不需要使用冲存。

计算机图形学上机实验报告模板

计算机图形学上机实验报告模板

计算机图形学上机实验报告实验名称:线画图元生成中国石油大学(北京)信息学院计算机科学与技术系班级:计算机08-2班学号:2008082207姓名:周新完成日期:2011-10-23实验一:基本图元绘制一、实验目的与要求(1)理解glut程序框架(2)理解窗口到视区的变换(3)理解OpenGL实现动画的原理(5)添加代码实现“Bresenham算法画直线”(6)添加代码实现圆的绘制(可以适当对框架坐标系进行修改)(7)适当修改代码实现具有宽度的图形(线刷子或方刷子)二、实验内容(算法设计)1.算法流程图和主要数据结构:(1)中点椭圆算法的程序流程图(2)主要数据结构:vector<CPoint>作为存储计算出的点2.关键代码实现(1)DDA算法//DDA算法//参数:bePoint为起点坐标,endPoint为终点坐标void CGraphicsView::DDACreateLine(CPoint bePoint,CPoint endPoint){//画线算法的实现int dx,dy,epsl,k;float x,y,xIncre,yIncre;int bptx=(int)bePoint.x;int bpty=(int)bePoint.y;int eptx=(int)endPoint.x;int epty=(int)endPoint.y;dx = eptx-bptx;dy = epty-bpty;x = bptx;y = bpty;if(abs(dx) > abs(dy)){epsl = abs(dx);}else {epsl = abs(dy);}xIncre = (float)dx /epsl;//x增加步长yIncre = (float)dy /epsl;//y增加步长for(k = 0; k<=epsl; k++){ptList.push_back(CPoint((int)x,(int)y));//将算出的点坐标取整并加入ptList尾部x += xIncre;y += yIncre;}}(2)Bresenham画线算法//中点Bresenham算法画直线(0<=k<=1)//参数:bePoint为起点,endPoint为终点void CGraphicsView::BresenhamLine(CPoint bePoint, CPoint endPoint){int dx,dy,d,upIncre,downIncre,x,y,k=0;int bptx=(int)bePoint.x;int bpty=(int)bePoint.y;int eptx=(int)endPoint.x;int epty=(int)endPoint.y;if(bptx>eptx){x=eptx;eptx=bptx;bptx=x;y=epty;epty=bpty;bpty=y;}x=bptx;y=bpty;dx=eptx-bptx;dy=epty-bpty;d=dx-2*dy;upIncre=2*dx-2*dy;downIncre=-2*dy;//算法实现while(x<eptx){ptList.push_back(CPoint(x,y));//将算出的点坐标取整并加入ptList尾部x++;if(d<0){y++;d+=upIncre;}elsed+=downIncre;}}(3)改进Bresenham画线算法//改进的Bresenham算法画直线(0<=k<=1)//参数:bePoint为起点,endPoint为终点void CGraphicsView::BresenhamImpro(CPoint bePoint, CPoint endPoint) {int x,y,dx,dy,e,k=0;int bptx=(int)bePoint.x;int bpty=(int)bePoint.y;int eptx=(int)endPoint.x;int epty=(int)endPoint.y;dx=eptx-bptx;dy=epty-bpty;e=-dx;x=bptx;y=bpty;while(x<=eptx){ptList.push_back(CPoint(x,y));k++;x++;e=e+2*dy;if(e>0){y++;e=e-2*dx;}}}(4)Bresenham画中点圆//中点圆算法//参数:cirCenter为圆心点,cirEdge为圆周上一点void CGraphicsView::BCircle(CPoint cirCenter, CPoint cirEdge){int d,k=0,xa,ya;int bptx=(int)cirCenter.x;int bpty=(int)cirCenter.y;int eptx=(int)cirEdge.x;int epty=(int)cirEdge.y;int R=sqrt(pow((bptx-eptx),2)+pow((bpty-epty),2));xa=0;ya=R;d=1-R;while(xa<=ya){ptList.push_back(CPoint(xa+bptx,ya+bpty));ptList.push_back(CPoint(ya+bptx,xa+bpty));ptList.push_back(CPoint(-ya+bptx,xa+bpty));ptList.push_back(CPoint(-xa+bptx,ya+bpty));ptList.push_back(CPoint(-xa+bptx,-ya+bpty));ptList.push_back(CPoint(-ya+bptx,-xa+bpty));ptList.push_back(CPoint(ya+bptx,-xa+bpty));ptList.push_back(CPoint(xa+bptx,-ya+bpty));if(d<0)d+=2*xa+3;else{d+=2*(xa-ya)+5;ya--;}xa++;}}(5)Bresenham画中点椭圆while(pow(rb,2)*x<=pow(ra,2)*y){ptList.push_back(CPoint(x+cx,y+cy));ptList.push_back(CPoint(-x+cx,y+cy));ptList.push_back(CPoint(x+cx,-y+cy));ptList.push_back(CPoint(-x+cx,-y+cy));double temp1=2*pow(rb,2)*x+2*pow(rb,2);//定义临时变量,以方便p1的计算double temp2=2*pow(ra,2)*y-2*pow(ra,2);if(p1<0){p1+=temp1+pow(rb,2);}else{p1+=temp1-temp2+pow(rb,2);y--;}x++;}//计算第二区域内点p2=pow(rb,2)*pow((x+(double)1/2),2)+pow(ra,2)*(y-1)-pow(ra,2)*pow(rb,2);while(x<=ra&&y>=0){ptList.push_back(CPoint(x+cx,y+cy));ptList.push_back(CPoint(-x+cx,y+cy));ptList.push_back(CPoint(x+cx,-y+cy));ptList.push_back(CPoint(-x+cx,-y+cy));if(p2>0){y--;p2=p2-2*pow(ra,2)*y+pow(ra,2);}else{y--;x++;p2=p2+2*pow(rb,2)*x-2*pow(ra,2)*y+pow(ra,2);}(6)时钟控制器OnTimerCMainFrame *mainframe=(CMainFrame *)(AfxGetApp()->m_pMainWnd);//定义获取主窗口的指针int mode=mainframe->algoMode;//将从主窗口获取的算法选择变量赋值给临时变量if(4==mode||5==mode)//根据算法选择决定画点的顺序,4或5时为圆或椭圆{for(int i=0;i<8;i++)//画圆或椭圆时,每次画8个点{if(po intID<=(ptList.size()-1)){if(10>=abs(ptList[pointID].x)&&10>=abs(ptList[pointID].y)){DrawPoint(ptList[pointID]);//画一个点的函数pointID++;//定义好的全局变量,记录画点的个数}}else{KillTimer(nIDEvent);//杀掉计时器}}}else//画线时,每次只画一个点{if(pointID<=(ptList.size()-1)){DrawPoint(ptList[pointID]);pointID++;}else{KillTimer(nIDEvent);}}(7)通过点击鼠标左键来获取点坐标OnLButtonDown pDC->DPtoLP(&point);//设备坐标转化为逻辑坐标switch(lButtonDown) {case 0:ptBegin=point;//将获取到的逻辑坐标赋值给已定义的起点lButtonDown+=1;//定义的类的成员变量,左键次数加1break;case 1:ptEnd=point; //将获取到的逻辑坐标赋值给已定义的终点lButtonDown+=1;break;case 2:radiumpt=point;//该点为画椭圆是特有的点,作为椭圆的右顶点lButtonDown+=1;default:break;}(8)窗口视图的模式映射CRect rectClient;GetClientRect(rectClient);//获得当前窗口的客户区大小pDC->SetMapMode(MM_ISOTROPIC);//设置映射模式pDC->SetWindowExt(21,21);//设置窗口范围pDC->SetViewportExt(rectClient.right,-rectClient.bottom);//设置视口范围pDC->SetViewportOrg(rectClient.right/2,rectClient.bottom/2);//设置视口原点三、实验结果1.DDA算法画直线2、Bresenham画线3、改进Bresenham画线4 Bresenham画中点圆5 Bresenham画中点椭圆(1)画刷为正方形(2)画刷为圆形四、实验讨论与体会体会:通过本次实验,让我了解到了上文提到的几种算法实现的具体过程,并且通过动态画线,对几种算法生成线的过程和特点也有个更进一步的学习和掌握。

计算机图形学实验报告

计算机图形学实验报告

计算机图形学实验报告标准化工作室编码[XX968T-XX89628-XJ668-XT689N]目录实验一直线的DDA算法一、【实验目的】1.掌握DDA算法的基本原理。

2.掌握DDA直线扫描转换算法。

3.深入了解直线扫描转换的编程思想。

二、【实验内容】1.利用DDA的算法原理,编程实现对直线的扫描转换。

2.加强对DDA算法的理解和掌握。

三、【测试数据及其结果】四、【实验源代码】#include<>#include<>#include<GL/>#include<>GLsizei winWidth=500;GLsizei winHeight=500;void Initial(void){glClearColor,,,;glMatrixMode(GL_PROJECTION);gluOrtho2D,,,;}void DDALine(int x0,int y0,int x1,int y1){glColor3f,,;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++){glPointSize(3);glBegin(GL_POINTS);glVertex2i(int(x+,(int)(y+);glEnd();x+=xIncre;y+=yIncre;}}void Display(void){glClear(GL_COLOR_BUFFER_BIT);DDALine(100,100,200,180);glFlush();}void winReshapeFcn(GLint newWidth, GLint newHeight){glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D, GLdouble(newWidth), , GLdouble(newHeight)); glClear(GL_COLOR_BUFFER_BIT);winWidth=newWidth;winHeight=newHeight;}int main(int argc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(400,300);glutInitWindowPosition(100,120);glutCreateWindow("line");Initial();glutDisplayFunc(Display);glutReshapeFunc(winReshapeFcn);glutMainLoop();return 0;}实验二 Bresenham绘制直线和圆一、【实验目的】1.掌握Bresenham算法扫描转换圆和直线的基本原理。

计算机图形学报告

计算机图形学报告
}
else if((c[0]==b[0])&&(c[1]==b[1])&&(c[2]==b[2])&&(c[3]==b[3]))
{
setcolor(0);
setlinestyle(0,0,3);
setwritemode(0);
line(x2,y2,x11,y11);
x2=x11;y2=y11;
getcode(x11,y11,b);
专业班级
学号
学生姓名
实验日期
2010年5月28日
成绩
课程名称
图形学
实验名称
实验四VC++图形程序设计
一、实验目的:
1.掌握VC++进行图形程序设计的基本方法;
2.了解VC++的图形功能,了解常见的图形库函数,请读者参见VC++帮助;
3.能设计较复杂的动、静态图形。
二、实验环境:
普通PC386以上微机; VC++语言程序设计环境。
}
else if(c[2]==1)
{
x11=(int)((x2-x1)*(bottom-y1)/(y2-y1)+x1);
y11=bottom;
}
else if(c[3]==1)
{
x11=(int)((x2-x1)*(top-y1)/(y2-y1)+x1);
y11=top;
} /*3:求交运算结束*/
{
e=d*(1+*cos(8*a));
f=e*(1+sin(16*a));
x1=150+f*cos(a);
x2=150+f*cos(a+pi/16);
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机图形学实验指导目录实验1 直线的绘制 (2)实验2 圆和椭圆的绘制 (4)实验3 图形填充 (7)实验4 二维图形几何变换 (10)实验5 二维图形裁剪 (13)实验6 曲线生成算法的实现 (18)附录:实验报告模板 (20)实验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 <graphics.h># include <math.h>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);elseepsl=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 ;gdriver = DETECT;initgraph(&gdriver , &gmode ,"C:\\TC20\\BGI");DDALine(0,0,35,26,4);getch ( );closegraph ( );}Bresenham:#include<graphics.h>#include<math.h>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;}}}main(){int gdriver ,gmode ;gdriver = DETECT;initgraph(&gdriver , &gmode ,"c:\\TC20\\BGI");BresenhamLine(0, 0 , 120, 200,5 );getch ( );closegraph ( );}实验2 圆和椭圆的绘制实验目的1、通过实验,进一步理解和掌握中点算法;2、掌握以上算法生成椭圆或圆的基本过程;3、通过编程,会在TC环境下完成用中点算法实现椭圆或圆的绘制。

实验环境计算机、Turbo C或其他C语言程序设计环境实验学时2学时,必做实验。

实验内容用中点(Besenham)算法实现椭圆或圆的绘制。

实验步骤1.算法、原理清晰,有详细的设计步骤;2.依据算法、步骤或程序流程图,用C语言编写源程序;3.编辑源程序并进行调试;4.进行运行测试,并结合情况进行调整;5.对运行结果进行保存与分析;6.打印源程序或把源程序以文件的形式提交;7.按格式书写实验报告。

分析与思考1.为何在程序运行时,有的椭圆或圆仅在屏幕左上角显示了一部分?2.用中点算法生成的椭圆,为何在半径较大时,图形的失真严重?实验代码:圆:#include<graphics.h>#include<math.h>void CirclePoint(int x,int y,int color){putpixel(x+100,y+100,color);putpixel(-x+100,y+100,color);putpixel(x+100,-y+100,color);putpixel(-x+100,-y+100,color);putpixel(y+100,x+100,color);putpixel(y+100,-x+100,color);putpixel(-y+100,x+100,color);putpixel(-y+100,-x+100,color);}void MidBresenhamCircle(int r,int color){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++;}}main( ){int gdriver ,gmode ;gdriver = DETECT;initgraph(&gdriver , &gmode ,"c:\\tc20\\bgi" );MidBresenhamCircle(50,6);getch ( );closegraph ( );}实验截图:椭圆:#include "graphics.h"void MidBresenhamEllipse(int a,int b,int color){int x,y;float d1,d2;x=0;y=b;d1=b*b+a*a*(-b+0.5);putpixel(x+100,y+100,color); putpixel(-x+100,-y+100,color);putpixel(-x+100,y+100,color);putpixel(x+100,-y+100,color);while(b*b*(x+1)<a*a*(y-0.5)){if(d1<=0){d1+=b*b*(2*x+3);x++;}else{d1+=b*b*(2*x+3)+a*a*(-2*y+2);x++;y--;}putpixel(x+100,y+100,color); putpixel(-x+100,-y+100,color);putpixel(-x+100,y+100,color);putpixel(x+100,-y+100,color);}d2=b*b*(x+0.5)*(x+0.5)+a*a*(y-1)*(y-1)-a*a*b*b;while(y>0){if(d2<=0){d2+=b*b*(2*x+2)+a*a*(-2*y+3);x++; y--;}else{d2+=a*a*(-2*y+3);y--;}putpixel(x+100,y+100,color); putpixel(-x+100,-y+100,color);putpixel(-x+100,y+100,color);putpixel(x+100,-y+100,color);}}main( ){int gdriver ,gmode ;gdriver = DETECT;initgraph(&gdriver , &gmode ,"c:\\tc20\\bgi" );MidBresenhamEllipse(8,6,2);getch ( );closegraph ( );}实验截图:实验3 图形填充实验目的4、通过实验,进一步理解和掌握图形填充常用算法;5、掌握以上算法进行填充图形的基本过程;6、通过编程,会在TC环境下完成图形填充。

实验环境计算机、Turbo C或其他C语言程序设计环境实验学时2学时,必做实验。

实验内容任意画一个多边形,并用边填充算法进行填充。

(多边形的顶点坐标存放在数组中,坐标值由键盘输入)实验步骤1、算法、原理清晰,有详细的设计步骤;2、依据算法、步骤或程序流程图,用C语言编写源程序;3、编辑源程序并进行调试;4、进行运行测试,并结合情况进行调整;5、对运行结果进行保存与分析;6、打印源程序或把源程序以文件的形式提交;7、按格式书写实验报告。

实验代码:#include<graphics.h>#include<stdio.h>#include<math.h>#include<conio.h>#define MP 100#include<stdlib.h>#define false 0void edge_mark(int arr[][2],int value,int polydeflen){int by,x,y,ax,ay;int i,j;float k;by=arr[polydeflen-1][1];for (i=0;i<polydeflen;i++){if (i == polydeflen-1){ax=arr[0][0];ay=arr[0][1];}else{ax=arr[i+1][0];ay=arr[i+1][1];}x=arr[i][0];y=arr[i][1];if((y-ay)!=0)k=(ax-x)/(float)(y-ay);if((y-by)*(ay-y)>=0)putpixel(x,y,value);getch();if(ay<y)for(j=y-1;j>ay;j--)putpixel(x+(int)((y-j)*k),j,value);else for(j=y+1;j<ay;j++)putpixel(x-(int)((j-y)*k),j,value);by=y;}}void edge_mark_fill(int ar[][2],int value,int polydeflen) {int i,x,y,inside;int min,max;inside=false;min=ar[0][1];max=ar[0][1];edge_mark(ar,value,polydeflen);for (i=1;i<polydeflen;i++){if (ar[i][1]>max)max=ar[i][1];if (ar[i][1]<min)min=ar[i][1];}for (y=min;y<=max;y++){for(x=0;x<=640;x++){if (getpixel(x,y) == value)inside=!(inside);if (inside!=false)putpixel(x,y,value);else putpixel(x,y,0);}if(getch()==17)exit(1);}}void main(){char t[100];int polydef[MP][2];int i,j,gdriver,gmode,polydeflen,value;gdriver=DETECT;initgraph(&gdriver,&gmode,"c:\\tc20\\bgi" );printf("please input the number of edges:\n");scanf("%d",&polydeflen);printf("please input the color:\n");scanf("%d",&value);printf("please input the (x,y):\n");for (i=0;i<polydeflen;i++)for (j=0;j<2;j++)scanf("%d",&polydef[i][j]);printf("please press the space key!");edge_mark_fill(polydef,value,polydeflen);for(i=0;i<polydeflen;i++){sprintf(t,"(%d,%d)",polydef[i][0],polydef[i][1]);outtextxy(polydef[i][0],polydef[i][1],t);}getch();closegraph();}实验截图:实验4 二维图形几何变换实验目的1、通过实验,进一步理解和掌握二维图形几何变换算法;2、掌握以上算法进行二维图形几何变换基本过程;3、通过编程,会在TC环境下完成二维图形几何变换过程。

相关文档
最新文档