计算机图形学上机报告
计算机图形学上机实验报告计算机科学与技术学院班级:学号:姓名:指导教师:完成日期:实验一:基本图元绘制一. 实验目的1. 了解如何利用OpenGL库绘制图形2. 理解glut程序框架3. 理解窗口到视区的变换4. 理解OpenGL实现动画的原理二. 实验内容1. 实现中点Bresenham算法画直线2. 实现改进Bresenham算法画直线3. 实现圆的绘制三. 实验结果1.DDA算法画直线2. 中点Bresenham算法画直线3. 改进Bresenham算法画直线4. Bresenham算法画圆四. 源程序#include <windows.h>#include <gl/glut.h>#include "stdio.h"int m_PointNumber = 0; //动画时绘制点的数目int m_DrawMode = 4; //绘制模式 1 DDA算法画直线// 2 中点Bresenham算法画直线// 3 改进Bresenham算法画直线// 4 八分法绘制圆// 5 四分法绘制椭圆//绘制坐标线void DrawCordinateLine(void){int i = 0 ;//坐标线为黑色glColor3f(0.0f, 0.0f ,0.0f);glBegin(GL_LINES);for (i=10;i<=250;i=i+10){glVertex2f((float)(i), 0.0f);glVertex2f((float)(i), 250.0f);glVertex2f(0.0f, (float)(i));glVertex2f(250.0f, (float)(i));}glEnd();}//绘制一个点,这里用一个正方形表示一个点。
void putpixel(GLsizei x, GLsizei y){glRectf(10*x,10*y,10*x+10,10*y+10);}void DDACreateLine(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num){//设置颜色glColor3f(1.0f,0.0f,0.0f);//对画线动画进行控制if(num == 1)printf("DDA画线算法:各点坐标\n");else if(num==0)return;//画线算法的实现GLsizei dx,dy,epsl,k;GLfloat 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 / epsl ;yIncre = (float)dy / epsl ;for(k = 0; k<=epsl; 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));break;}x += xIncre;y += yIncre;if(x >= 25 || y >= 25) break;}}void BresenhamLine(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num){glColor3f(1.0f,0.0f,0.0f);if(num == 1)printf("中点Bresenham算法画直线:各点坐标及判别式的值\n");else if(num==0)return;//画线算法的实现GLsizei dx,dy,d,UpIncre,DownIncre,x,y,xend=0;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);if (x>=num-1) {break;}x++;if(d<0){y++;d+=UpIncre;}else d+=DownIncre;if(x >= 50 || y >= 50) break;}}void Bresenham2Line(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num) {glColor3f(1.0f,0.0f,0.0f);if(num == 1)printf("改进的Bresenham算法画直线:各点坐标及判别式的值\n");else if(num==0)return;//画线算法的实现GLsizei x,y,dx,dy,e;dx=x1-x0;dy=y1-y0;e=-dx;x=x0;y=y0;while (x<=x1){putpixel(x,y);if (x>=num-1) {break;}x++;e=e+2*dy;if(e>0){y++;e=e-2*dx;}if(x >= 50 || y >= 50) break;}}void BresenhamCircle(GLsizei x, GLsizei y, GLsizei r, GLsizei num){glColor3f(1.0f,0.0f,0.0f);if(num == 1)printf("Bresenham算法画圆:各点坐标及判别式的值\n");x=0,y=r;GLsizei d=1-r;while (x<y){putpixel(x,y);if (x>=num) {break;}putpixel(y,x);if (x>=num) {break;}putpixel(-y,x);if (x>=num) {break;}putpixel(-x,y);if (x>=num) {break;}putpixel(-x,-y);if (x>=num) {break;}putpixel(-y,-x);if (x>=num) {break;}putpixel(y,-x);if (x>=num) {break;}putpixel(x,-y);if(d<0)d+=2*x+3;else{d+=2*(x-y)+5;y--;}x++;}}//初始化窗口void Initial(void){// 设置窗口颜色为蓝色glClearColor(1.0f, 1.0f, 1.0f, 1.0f);}// 窗口大小改变时调用的登记函数void ChangeSize(GLsizei w, GLsizei h){if(h == 0) h = 1;// 设置视区尺寸glViewport(0, 0, w, h);// 重置坐标系统glMatrixMode(GL_PROJECTION);glLoadIdentity();// 建立修剪空间的范围if (w <= h)glOrtho (0.0f, 250.0f, 0.0f, 250.0f*h/w, 1.0, -1.0);elseglOrtho (0.0f, 250.0f*w/h, 0.0f, 250.0f, 1.0, -1.0); }// 在窗口中绘制图形void ReDraw(void){//用当前背景色填充窗口glClear(GL_COLOR_BUFFER_BIT);//画出坐标线DrawCordinateLine();switch(m_DrawMode){case 1:DDACreateLine(0,0,20,15,m_PointNumber);break;case 2:BresenhamLine(0,0,20,15,m_PointNumber);break;case 3:Bresenham2Line(1,1,8,6,m_PointNumber);break;case 4:BresenhamCircle(5,5,18,m_PointNumber);break;default:break;}glFlush();}//设置时间回调函数void TimerFunc(int value){if(m_PointNumber == 0)value = 1;m_PointNumber = value;glutPostRedisplay();glutTimerFunc(500, TimerFunc, value+1);}//设置键盘回调函数void Keyboard(unsigned char key, int x, int y){if (key == '1') m_DrawMode = 1;if (key == '2') m_DrawMode = 2;if (key == '3') m_DrawMode = 3;if (key == '4') m_DrawMode = 4;m_PointNumber = 0;glutPostRedisplay();}//void main(void)int main(int argc, char* argv[]){glutInit(&argc, argv);//初始化GLUT库OpenGL窗口的显示模式glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(800,600);glutInitWindowPosition(100,100);glutCreateWindow("基本图元绘制程序");glutDisplayFunc(ReDraw);glutReshapeFunc(ChangeSize);glutKeyboardFunc(Keyboard);//键盘响应回调函数glutTimerFunc(500, TimerFunc, 1);// 窗口初始化Initial();glutMainLoop(); //启动主GLUT事件处理循环return 0;}实验二:日地月模型一. 实验目的1. 理解OpenGL中的变换过程2. 理解透视投影与平行投影的不同3. 了解深度测试二. 实验内容1. 通过变换调整观察的位置与方向2. 实现太阳、地球和月亮的运动模型三. 实验结果太阳、地球和月亮的运动模型图1.图2.图3.四. 源程序#include <windows.h>#include <gl/gl.h>#include <gl/glu.h>#include <gl/glut.h>void Initial(){glEnable(GL_DEPTH_TEST); // 启用深度测试glFrontFace(GL_CCW); // 指定逆时针绕法表示多边形正面glClearColor(1.0f, 1.0f, 1.0f, 1.0f ); //背景为白色}void ChangeSize(int w, int h){if(h == 0) h = 1;// 设置视区尺寸glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();// 设置修剪空间GLfloat fAspect;fAspect = (float)w/(float)h;gluPerspective(45.0, fAspect, 1.0, 500.0);/*if (w <= h)glOrtho (-nRange, nRange, nRange*h/w, -nRange*h/w, -nRange*2.0f, nRange*2.0f);elseglOrtho (-nRange*w/h, nRange*w/h, nRange, -nRange, -nRange*2.0f, nRange*2.0f); */glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void RenderScene(void){// 绕原子核旋转的角度static float fElect1 = 0.0f;static float f2=0.0f;glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);// 重置模型视图矩阵glMatrixMode(GL_MODELVIEW);glLoadIdentity();//将图形沿z轴负向移动glTranslatef(0.0f, 0.0f, -250.0f);// 绘制红色的原子核glColor3f(1.0f, 0.0f, 0.0f);glutSolidSphere(50.0f, 15, 15);// 当前绘制颜色变为黄色glColor3f(0.0f, 0.0f, 0.0f);//绘制第一个电子//保存当前的模型视图矩阵glRotatef(fElect1, 0.0f, 1.0f, 0.0f);//绕y轴旋转一定的角度glTranslatef(80.0f, 0.0f, 0.0f);//平移一段距离glutSolidSphere(12.0f, 15, 15);//画出电子// 恢复矩阵// 第二个电子glPushMatrix();glRotatef(45.0f, 0.0f, 0.0f, 1.0f);glRotatef(f2, 0.0f, 1.0f, 0.0f);glTranslatef(-20.0f, 0.0f, 0.0f);glutSolidSphere(6.0f, 15, 15);glPopMatrix();/* // 第三个电子glPushMatrix();glRotatef(-45.0f,0.0f, 0.0f, 1.0f);glRotatef(fElect1, 0.0f, 1.0f, 0.0f);glTranslatef(0.0f, 0.0f, 60.0f);glutSolidSphere(6.0f, 15, 15);glPopMatrix();*/// 增加旋转步长fElect1 += 10.0f;f2=fElect1*6;if(fElect1 > 360.0f){fElect1 = 10.0f;}glutSwapBuffers();}void TimerFunc(int value){glutPostRedisplay();glutTimerFunc(100, TimerFunc, 1);}int main(int argc, char* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);glutCreateWindow("日地月模型");glutReshapeFunc(ChangeSize);glutDisplayFunc(RenderScene);glutTimerFunc(500, TimerFunc, 1);Initial();glutMainLoop();return 0;}。
计算机图形学上机实验报告
计算机图形学实验报告姓名:学号:班级:目录实验一OpenGL程序结构练习 (3)实验二基本图形生成 (6)实验三交互式控制 (9)实验四图形基本变换 (12)实验五三维图形生成及显示 (15)实验六三维图形生成及显示 (19)实验一OpenGL程序结构练习【实验目的】1.熟悉C语言环境下OpenGL的使用方法;2.了解OpenGL程序的基本结构。
【实验原理】绝大多数OpenGL程序具有类似的结构,包含下述函数main():定义回调函数,打开一个或多个具有指定属性的窗口,进入事件循环(最后一条可执行语句)init():设置状态变量、视图、属性、回调、显示函数、输入和窗口函数#include <GL/glut.h> // glut.h includes gl.h and glu.hvoid display(){ ……}void init(){ ……}int main( intargc, char **argv){ ……}【实验内容】1.了解程序中各个结构的功能;2.用OpenGL生成三角形。
【实验步骤及结果】1.导入OpenGL的glut32.lib和glut.h文件:将.lib文件存放到C 语言程序文件夹的Library下,.h文件放到Include下;导入应用程序扩展文件glut32.dll,存放到system文件夹下。
2.打开VC 6.0,新建工程,并命名为text1,如图1.图 13.在工程text1下新建源文件,并命名为text1.cpp。
4.编写代码并编译链接,如图2所示。
图 25.运行,结果如图3所示。
图 3实验二基本图形生成【实验目的】1.熟悉OpenGL的程序结构,并了解各部分的功能。
2.学会应用OpenGL语言绘制出点,线,多边形。
【实验原理】1.GLUT函数glutInit使得应用程序可以获取命令行参数并初始化系统。
glutInitDisplayMode设置窗口的属性、RGB颜色、单缓冲区、属性按照逻辑或组合在一起。
计算机图形学第一次上机实验报告
计算机图形学上机实验报告实验名称:用DDA算法生成直线姓名:***班级:信息与计算科学学号:**********一:DDA 算法的思想精髓实现直线段光栅化的最简单的方法就是解直线的微分方程。
设直线的起点坐标为 (x s , y s ),终点坐标为 (x e , y e ),那么该直线的微分方程是:()m x x y y dx dy se s e =--=其离散解为:x x x y y y y y y s e s e i i i ∆--+=∆+=+1或: y y y x x x x x x s e s e i i i ∆--+=∆+=+1这里 (x i , y i ) 是直线上一点的坐标值。
式(3.2.1)和(3.2.2)表示所求直线 y 值和 x 值关于相应增量的逐次递归关系,递归初值为直线的起点。
DDA (Digital Differential Analyzer) 算法即数字微分分析算法就是基于式(3.2.1)或(3.2.2)对直线进行光栅化的算法。
在一个坐标轴上以单位间隔对直线采样,以决定另一个坐标轴上最靠近直线的对应整数值。
(1)当直线斜率 0 ≤ m ≤ 1 时,则按单位 x 间隔(D x = 1)取样并计算每个连续的 y 值:m y y i i +=+1(2)当 -1≤ m ≤ 0 时,则仍按单位 x 间隔(D x =-1)取样并计算每个连续的 y 值:m y y i i -=+1(3)当 m >1 时,则将 x 和 y 交换,这就是说,按单位 y 间隔(D y = 1) 取样并计算每个连续的 x 值:11-++=m x x i i(4)当 m <- 1 时,则同样交换 x 和 y 交换,并按 D y =- 1间隔取样计算每个连续的 x 值:11-+-=m x x i i应用上面的算式,解可以设计斜率为任意值的直线。
二:程序代码:#include<stdio.h>#include<graphics.h>#include<math.h>void lineDDA(int xs,int ys,int xe,int ye,int c){int i;float x=xs,y=ys;float xIncrement ,yIncrement,steps,dx=xe-xs,dy=ye-ys; steps=abs(dx);if(abs(dy)>abs(dx))steps=abs(dy);xIncrement=dx/steps;yIncrement=dy/steps;putpixel(x,y,c);for(i=1;i<=steps;i++){x+=xIncrement;y+=yIncrement;putpixel(x,y,c);}}main(){int gdriver=DETECT;int gmode;initgraph(&gdriver,&gmode,""); setbkcolor(MAGENTA); lineDDA(10,14,20,50,1); getch();closegraph();}三:程序截图如下:四:试验心得体会:(1)DDA算法生成直线是非常快的,但是有一点需要注意的,就是x,y的数值类型。
计算机图形学实习报告
实习报告实习名称:计算机图形学实习班级:学号:姓名:实习地点:实习指导教师:实习时间:年月日至月日一、实习目的与意义本次计算机图形学的实习分两部分,一部分是利用AutoCAD进行二维和三维模型的制作,另一部分是利用VC6.0进行编程实现对图形的简单操作。
通过对AutoCAD的实习,熟悉该软件的基本功能及操作特点,掌握二维及三维图形的基本制作过程。
通过对VC6.0的编程实习,理解图形的生成、图形的变换、图形的显示以及二维裁剪的基本思想,熟练掌握计算机图形学的基本原理和方法;熟练掌握计算机图形学算法的实现算法;学习和掌握图形系统的设计;学习用VC++编写计算机图形学程序;建立面向对象编程的基本概念。
二、实习主要内容1、AutoCAD软件操作(1)简单图形绘制(2)图形的基本编辑命令操作(3)标注文字及填充(4)三维图形绘制2.基于VC6.0下的计算机图形学程序编写(1)图形的生成:画直线、画圆、画曲线、画字符(2)图形的变换:平移、旋转、缩放、对称变换(3)图形的显示:扫描线填充、边缘填充、种子填充(4)图形的二维裁剪:CS裁剪、多边形裁剪、梁友栋裁剪、圆裁剪、中点分割法三、实习的主要过程第一部分 AutoCAD软件操作AutoCAD软件可以处理很多问题,在机械制图,土木建筑等方面有着广泛的应用,我们在机房打开AutoCAD软件对其进行系统配置,然后进行具体操作。
通过配置可以实现工具栏之类的快捷运用。
(1)简单图形绘制实习开始的第一天,在老师的讲解以及演示下,我们了解了AutoCAD软件的基本使用方法,与此同时,我们跟着老师的操作也逐渐熟悉了该软件的一些基本操作方法。
从设置基本绘图环境开始,按照指导书上的指示,采用边完成简单图形边学习各种命令的方式,逐渐熟练掌握了AutoCAD的使用,熟练掌握了其基本绘图功能,如掌握了绘图命令POINT、LINE、CIRCLE、ARC、DONUT、RECTANGLE、POLYLINE的功能及操作;掌握了实体绘图命令键盘输入的方法;掌握了缩放命令(ZOOM)的使用方法等。
《计算机图形学》实验报告
《计算机图形学》实验报告目录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核心代码本次实验的核心代码如下所示。
计算机图形学上机实验
《计算机图形学》上机实验报告一、实验设计在曲线上按参数t进行for循环200次,每次将ti=i/200代入参数方程计算出一个点。
将这些点连成折线段即可。
glBegin(GL_LINE_STRIP);for(… )glVertex(xi,yi);glEnd();二、关键代码// test4.cpp : 此文件包含 "main" 函数。
程序执行将在此处开始并结束。
//#include"pch.h"#include<cstdio>#include<cmath>#include<GL/glut.h>const GLfloat Pi = 3.1415926536f;//定义点集struct data {GLfloat x;GLfloat y;}Point[201];void init() //初始化函数{glClearColor(1.0, 1.0, 1.0, 0.0); //设置背景颜色glMatrixMode(GL_PROJECTION); // 设置投影参数gluOrtho2D(0.0, 600.0, 0.0, 400.0); // 设置场景的大小}void mydisplay() //显示函数{glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0, 0.0, 0.0); //设置线条颜色glPointSize(2); //设置点的大小glTranslatef(100.0f, 0.0f, 0.0f); //平移图形glScalef(0.5f, 0.5f, 0.0f); //缩小图像0.5倍glRotatef(60.0f, 1.0f, 0.0f, 0.0f); //沿x轴旋转60度glBegin(GL_LINE_STRIP);for (int i = 1; i <= 200; i++){GLfloat t = i / 200.0;Point[i].x = 200.0 + 50.0 * (2.0 * cos(2.0 * Pi*t) - cos(4.0 * Pi*t)); //参数曲线Point[i].y = 150.0 + 50.0 * (2.0 * sin(2.0 * Pi*t) - sin(4.0 * Pi*t)); //参数曲线glVertex2i(Point[i].x, Point[i].y); //绘制曲线}glEnd();glFlush();}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("绘制曲线及图形变换");init();glutDisplayFunc(&mydisplay);glutMainLoop();return 0;}三、实验结果截图。
计算机图形学报告
计算机图形学总结报告学院:计算机与通信工程学院班级:计算机12-01学号:姓名:指导教师:计算机图形学总结报告一:课程总结通过一个学期的学习,了解了什么是计算机图形学、什么是图形API、为什么需要计算机图形学以及计算机图形学在各个领域的应用。
在学习过程中我们也通过实验课真正的了解和尝试的制作某些比较简单的图形学案例,比如一些基本的画笔与画刷、用鼠标交互式画图的算法、菜单编辑、一些基本的图形算法等等,其中我还以金刚石图案算法作为了我的特色程序设计。
计算机图形学是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学,研究的是应用计算机产生图像的所有工作,不管图像是静态的还是动态的,可交互的还是固定的,等等。
图形API是允许程序员开发包含交互式计算机图形操作的应用而不需要关注图形操作细节或任务系统细节的工具集。
计算机图形学有着广泛的应用领域,包括物理、航天、电影、电视、游戏、艺术、广告、通信、天气预报等几乎所有领域都用到了计算机图形学的知识,这些领域通过计算机图形学将几何模型生成图像,将问题可视化从而为各领域更好的服务。
计算机图形学利用计算机产生让人赏心悦目的视觉效果,必须建立描述图形的几何模型还有光照模型,再加上视角、颜色、纹理等属性,再经过模型变换、视图变换、投影操作等,通过这些步骤从而实现一个完整的OpenGL程序效果。
OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植。
计算机图形学通过应用OpenGL的功能,使得生成的图形效果具有高度真实感。
学习计算机图形学的重点是掌握OpenGL在图形学程序中的使用方法。
21世纪是信息的时代,在日新月异的科技更新中相信计算机会发挥越来越重要的作用,计算机图形学也会在更多的领域所应用,虽然我国在这方面还比较薄弱,但相信会有越来越好的时候的。
二:特色程序设计——金刚石图案算法(一):知识要点●在Visual C++ 6.0环境下创建MFC AppWizard(exe)。
上机报告表,计算机图形学
计算机图形学上机报告上机项目:计算机图形学系别:班级:学号:姓名:上机报告上机项目计算机图形学上机日期指导教师实验地点一、上机目的熟练掌握dda直线生成算法、中点画线法、bresenham画线法、中点画元发、bresenham 画圆法、二维图形变幻的方法、线段裁剪以及bezier曲线参数方程。
画出直线、圆、变换图形、裁剪图形及生成三次bezier曲线。
二、内容用vb实现dda直线生成算法、中点画线法、bresenham画线法、中点画元发、bresenham 画圆法、二维图形变幻的方法、线段裁剪以及bezier曲线参数方程。
分别画出直线、圆、变换图形、裁剪图形及生成三次bezier曲线。
三、上机实现过程(步骤、方法等)根据算法思想及计算方法通过vb实现各个图形的编程及显示。
1、分析算法思想2、编辑程序代码3、运行、纠正直到显示所要结果实验报告四、上机源程序1:Dda直线生成算法(1):Private Sub Command1_Click()Call ddaline(200, 1001, 2000, 3000)Call ddaline(900, 6001, 3000, 1000)Call ddaline(2300, 500, 10000, 4000)Call ddaline(700, 300, 8000, 5000)End SubPublic Sub ddaline(x1, y1, x2, y2 As Integer)Dim x, y, dx, dy, e As Doubledx = x2 - x1: dy = y2 - y1If Abs(dx) > Abs(dy) Thene = Abs(dx)Elsee = Abs(dy)End Ifdx = dx / e: dy = dy / ex = x1: y = y1For i = 0 To ePSet (Int(x + 0.5), Int(y + 0.5))x = x + dxy = y + dyNext iEnd SubDda直线生成算法(2):Public Sub ddaline(ByVal x1 As Integer, ByVal y1 As Integer, ByVal x2 As Integer, ByVal y2 As Integer)Dim x, y, dx, dy, e As Doubledx = x2 - x1: dy = y2 - y1If Abs(dx) > Abs(dy) Thene = Abs(dx)Else: e = Abs(dy)End Ifdx = dx / e: dy = dy / ex = x1: y = y1For i = 0 To ePSet (Int(x + 0.5), Int(y + 0.5))x = x + dx: y = y + dyNext iEnd SubPrivate Sub Command1_Click()Form1.Scale (-ScaleWidth / 2, ScaleHeight / 2)-(ScaleWidth / 2, -ScaleHeight / 2)Dim x(7), y(7) As IntegerFor i = 0 To 7x(i) = Int(Cos(i * 3.14 / 4) * 4000 + 0.5)y(i) = Int(Sin(i * 3.14 / 4) * 4000 + 0.5)Next iFor i = 0 To 6Call ddaline(x(i), y(i), x(i + 1), y(i + 1))Next iCall ddaline(x(0), y(0), x(7), y(7))For i = 0 To 4Call ddaline(x(i), y(i), x(i + 3), y(i + 3))Next iCall ddaline(x(5), y(5), x(0), y(0))Call ddaline(x(6), y(6), x(1), y(1))Call ddaline(x(7), y(7), x(2), y(2))End Sub2:Presenham画线法:Public Sub bresenhamline(x1 As Integer, y1 As Integer, x2 As Integer, y2 As Integer) Dim x, y, p, dx, dy As Integerdx = x2 - x1: dy = y2 - y1: p = 2 * dy - dxx = x1: y = y1For x = x1 To x2PSet (x, y)If p >= 0 Theny = y + 1: p = p + 2 * (dy - dx)Elsep = p + 2 * dyEnd IfNext xEnd SubPrivate Sub Command1_Click()Form1.Scale (-ScaleWidth / 2, ScaleHeight / 2)-(ScaleWidth / 2, -ScaleHeight / 2) Call bresenhamline(-1500, -1500, 2000, 2000)Call bresenhamline(-1900, -1800, -2000, 2000)End Sub3:中点画线法Public Sub midline(x1 As Integer, y1 As Integer, x2 As Integer, y2 As Integer)Dim x, y, d, a, b As Integera = y1 - y2:b = x2 - x1x = x1: y = y1: d = 2 * a + bFor x = x1 To x2PSet (x, y)If d >= 0 Thend = d + 2 * aElsey = y + 1: d = d + 2 * a + 2 * bEnd IfNext xEnd SubPrivate Sub Command1_Click()Form1.Scale (-ScaleWidth / 2, ScaleHeight / 2)-(ScaleWidth / 2, -ScaleHeight / 2) Call midline(-1100, -1500, 4000, 2000)Call midline(-2000, -3000, -4000, 3000)End Sub中点画圆法Private Sub Command1_Click()Call midpointcircle(3000)End SubPrivate Sub Form_Load()Form1.Scale (-ScaleWidth / 2, ScaleHeight / 2)-(ScaleWidth / 2, -ScaleHeight / 2) End SubPublic Sub midpointcircle(R As Integer)Dim d, x, y As Integerd = 1 - R: x = 0: y = RDo While x <= yPSet (x, y)PSet (y, x)PSet (-x, y)PSet (-y, x)PSet (-x, -y)PSet (-y, -x)PSet (x, -y)PSet (y, -x)If d >= 0 Thend = d + 2 * x - 2 * y + 5x = x + 1: y = y - 1Elsed = d + 2 * x + 3x = x + 1End IfLoopEnd SubBresenham画圆法:Private Sub Form_Load()Form1.Scale (-ScaleWidth / 2, ScaleHeight / 2)-(ScaleWidth / 2, -ScaleHeight / 2) End SubPublic Sub midpointcircle(R As Integer)Dim p, x, y As Integerx = 0: y = R: p = 3 - 2 * RDo While x <= yPSet (x, y)PSet (y, x)PSet (-x, y)PSet (-y, x)PSet (-x, -y)PSet (-y, -x)PSet (x, -y)PSet (y, -x)If p >= 0 Thenp = p + 4 * (x - y) + 10x = x + 1: y = y - 1Elsep = p + 4 * x + 6x = x + 1End IfLoopEnd Sub二维坐标变换:Dim x(4), y(4) As IntegerPrivate Sub Command1_Click()Form1.ForeColor = vbBlueCall pingyi(-500, -500)End SubPrivate Sub Command2_Click()Form1.ForeColor = vbBlueCall cuoqie(0, 3)End SubPrivate Sub Command3_Click()Form1.ForeColor = vbBlueCall bili(2, 2)End SubPrivate Sub Command4_Click()Call xuanzhuan(45)End SubPrivate Sub Command5_Click()Call duichen(1, 0, 0, -1)End SubPrivate Sub Form_Load()Form1.Scale (-ScaleWidth / 2, ScaleHeight / 2)-(ScaleWidth / 2, -ScaleHeight / 2) Showx(0) = 500y(0) = 500x(1) = 1500y(1) = 500x(2) = 1500y(2) = 1500x(3) = 500y(3) = 1500Call lianxianEnd SubPublic Sub lianxian()For i = 0 To 2Line (x(i), y(i))-(x(i + 1), y(i + 1))Next iLine (x(3), y(3))-(x(0), y(0))End SubPublic Sub pingyi(tx As Integer, ty As Integer)For i = 0 To 3x(i) = x(i) + txy(i) = y(i) + tyNext iCall lianxianEnd SubPublic Sub cuoqie(b As Single, d As Single)Dim a As IntegerFor i = 0 To 3a = x(i)x(i) = Int(x(i) + b * y(i) + 0.5)y(i) = Int(y(i) + d * a + 0.5)Next iCall lianxianEnd SubPublic Sub bili(sx As Single, sy As Single)For i = 0 To 3x(i) = Int(x(i) * sx + 0.5)y(i) = Int(y(i) * sy + 0.5)Next iCall lianxianEnd SubPublic Sub xuanzhuan(l As Single)Dim a As Integer, b As IntegerFor i = 0 To 3a = x(i):b = y(i)x(i) = Int(a * Cos(l) - b * Sin(l) + 0.5)y(i) = Int(b * Cos(l) + a * Sin(l) + 0.5)Next iCall lianxianEnd SubPublic Sub duichen(a As Integer, b As Integer, d As Integer, e As Integer) Dim m As Integer, n As IntegerFor i = 0 To 3m = x(i): n = y(i)x(i) = Int(a * m + b * n + 0.5)y(i) = Int(d * m + e * n + 0.5)Next iCall lianxianEnd Sub直线段的裁剪:Dim x0, y0, x1, y1 As IntegerDim xl, yb, xr, yt As IntegerPrivate Sub Command1_Click()ForeColor = vbRedCall caijian(2000, 2500, 200, 2000)Call caijian(3000, 2000, 4000, 5000)Call caijian(2500, 1500, 1500, 7000)Call caijian(1500, 2000, 3000, 500)End SubPrivate Sub Form_Load()Showxl = 1000xr = 5000yb = 1000yt = 3000Line (1000, 1000)-(1000, 3000)Line -(5000, 3000)Line -(5000, 1000)Line -(1000, 1000)Line (2000, 2500)-(200, 2000)Line (3000, 2000)-(4000, 5000)Line (2500, 1500)-(1500, 7000)Line (1500, 2000)-(3000, 500)End SubPublic Sub caijian(x0 As Long, y0 As Long, x1 As Long, y1 As Long)If x0 > xl And x0 < xr And y0 > yb And y0 < yt ThenIf x1 > xl And x1 < xr And y1 > yb And y1 < yt ThenLine (x0, y0)-(x1, y1)ElseIf x1 < xl And y1 > yb And y1 < yt Thena = x1x1 = xly1 = Int(((y1 - y0) / (a - x0)) * xl + 0.5) + Int((a * y0 - x0 * y1) / (a - x0) + 0.5) Line (x0, y0)-(x1, y1)End IfIf y1 > yt And x1 < xr And x1 > xl Thena = y1y1 = ytx1 = Int(((yt - (x1 * y0 - x0 * a) / (x1 - x0)) / ((a - y0) / (x1 - x0))) + 0.5)Line (x0, y0)-(x1, y1)End IfIf x1 > xr And y1 > yr And y1 < yt Thena = x1x1 = xry1 = Int(((y1 - y0) / (a - x0)) * xl + 0.5) + Int((a * y0 - x0 * y1) / (a - x0) + 0.5)Line (x0, y0)-(x1, y1)End IfIf y1 < yb And x1 > xl And x1 < xr Thena = y1y1 = ybx1 = Int(((yb - (x1 * y0 - x0 * a) / (x1 - x0)) / ((a - y0) / (x1 - x0))) + 0.5)Line (x0, y0)-(x1, y1)End IfEnd IfEnd IfEnd SubBezier曲线的生成:Private Sub Form_Click()Call bezier3(100, 100, 7000, 200, 9000, 3000, 5000, 600)End SubPublic Sub bezier3(x1 As Integer, y1 As Integer, x2 As Integer, y2 As Integer, x3 As Integer, y3 As Integer, x4 As Integer, y4 As Integer)Dim x(1000), y(1000) As DoubleDim i As IntegerFor i = 0 To 100t = i / 100x(i) = (1 - t) ^ 3 * x1 + 3 * t * (1 - t) ^ 2 * x2 + 3 * t ^ 2 * (1 - t) * x3 + t ^ 3 * x4y(i) = (1 - t) ^ 3 * y1 + 3 * t * (1 - t) ^ 2 * y2 + 3 * t ^ 2 * (1 - t) * y3 + t ^ 3 * y4PSet (Int(x(i) + 0.5), Int(y(i) + 0.5))Next iFor i = 0 To 99Line (x(i), y(i))-(x(i + 1), y(i + 1))Next iEnd Sub五、上机中遇到问题及解决方法运行结果不理想检查算法是否正确检查代码是否出错改正错误六、上机结果Presenham画线法中点画线法: 中点画圆法:Bresenham画圆法:二维坐标变换:直线段裁剪:七、心得体会通过几次实习我学到了很多计算机图形学的实践知识,也了解到编程的一些技巧,深刻的体会到计算机的深奥。
计算机图形学总结报告
ON_COMMAND(ID_MENUITEM32774, OnMidPiontCircle)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
{ if(d<0) d+=2*x+3;
else { d+=2*(x-y)-5; y--;}
x++;
描点(x,y)以及其他七个对称点;
}
ReleaseDC(pDC);
}
源程序:
// ddaView.cpp : implementation of the CDdaView class
//
#include "stdafx.h"
#include "dda.h"
#include "ddaDoc.h"
#include "ddaView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDdaView construction/destruction
CDdaView::CDdaView()
{
江苏大学-计算机图形学实验1报告【范本模板】
实验报告的内容提纲实验报告应包括以下内容:(1)实验题目(2)实验内容(3)实验环境:本次上机实验所使用的平台和相关软件。
(4)问题分析:对所要解决的问题进行阐述和分析,提出解决方法,列出解决步骤。
(5)算法设计:用流程图或伪代码描述解决问题的算法。
(6)源代码(7)程序运行结果(8)总结1实验报告的格式规范(1)报告按以下内容次序编排:封面、成绩评定表、报告。
(2)用A4纸,通栏排版,页边距:上2。
2厘米,下2厘米,左2.7厘米,右2.3厘米;(3)行距一律用1.5倍行距;(4)中文一律用宋体,英文和数字一律用Times New Roman;(5)一级标题用四号粗体,段前段后不空行,二级标题用小四号粗体,左端不缩进,段前段后均不留多余空格;(6)正文用小四号,每段文字首行缩进2个字符.(7)关于正文中的“图”和“表”:➢图形下方标示图号与图名(见下面示例),图号与图名字体要求:中文宋体小五号,数字和英文Times New Roman,小五号;图1 学员报名信息管理模块➢表格上方标示表号与表名(见下面示例),表号与表名字体要求:中文宋体小五号, 数字和英文Times New Roman,小五号。
表1 科目表(tb_Subject)计算机科学与通信工程学院实验报告课程计算机图形学实验题目二维图形绘制学生姓名学号专业班级指导教师日期成绩评定表1. 实验内容绘制金刚石图案。
金刚石图案的成图规则是:把一个圆周等分成n份,然后每两点之间连线.当n取奇数时,该图案可一笔连续绘成,即用MoveTo函数确定一个当前点,然后连续用LineTo函数连点成线。
绘制下图所示的魔术三角形图案,采用三种可明显区分的颜色填充.绘制递归圆应用递归的方法绘制如下所示的图案2。
实验环境操作系统:Windows xp编译环境:Vc++6。
03. 问题分析1。
金刚石绘制本实验的核心是在圆的基础上绘制金刚石图案。
金刚石图案是一个二维图案,仅使用二维坐标(x,y)就可以绘制,本实验使用数组实现。
计算机图形学实验报告_2
计算机图形学实验报告学号:********姓名:班级:计算机 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,Thisis my first SDI Application"。
(必选任务)3)利用MFC AppWizard(exe)建立一个SDI 程序,在文档视口内绘制基本图形(直线、圆、椭圆、矩形、多边形、曲线、圆弧、椭圆弧、填充、文字等),练习图形属性的编程(修改线型、线宽、颜色、填充样式、文字样式等)。
定义图形数据结构Point\Line\Circle 等保存一些简单图形数据(在文档类中),并在视图类OnDraw 中绘制。
3、实验过程1)使用MFC AppWizard(exe)建立一个SDI 程序,选择单文档;2)在View类的OnDraw()函数中添加图形绘制代码,说出字符串“Hello,Thisis my first SDI Application”,另外实现各种颜色、各种边框的线、圆、方形、多边形以及圆弧的绘制;3)在类视图中添加图形数据point_pp,pp_circle的类,保存简单图形数据,通过在OnDraw()函数中调用,实现线、圆的绘制。
4、实验结果正确地在指定位置显示了"Hello,This is my first SDI Application"字符串,成功绘制了圆,椭圆,方形,多边形以及曲线圆弧、椭圆弧,同时按指定属性改绘了圆、方形和直线。
