湖北民族学院信息工程学院实验报告(数字媒体技术专业用)班级:0312413姓名:谌敦斌学号:031241318实验成绩:实验时间:2013年10 月14 日9、10 节实验地点:数媒实验室课程名称:计算机图形学基础教程实验类型:设计型实验题目:直线与圆的绘制一、实验目的通过本次实验,熟练掌握DDA、中点、Bresenham直线绘制方法和中点、Bresenham圆的画法,能够在vc环境下独立完成实验内容,逐渐熟悉opengl的语法特点,提高程序基本绘图的能力。
二、实验环境(软件、硬件及条件)Microsoft vc++6.0 多媒体计算机三、实验内容1.从DDA、中点、Bresenham画线法中任选一种,完成直线的绘制。
2.从中点、Bresenham画圆法中任选一种,完成圆的绘制。
四、实验方法与步骤打开vc++6.0,新建一个工程,再在工程里面建一个.cpp文件,编辑程序,编译连接后执行即可。
程序如下bresenham画线法:#include<graphics.h>#include<conio.h>int bresenham(int x0,int y0,int x1,int y1,int color) {int x,y,dx,dy,e,i;dx=x1-x0;dy=y1-y0;e=-dx;y=y0;for(x=x0;x<=x1;x++){putpixel(x,y,color);e+=2*dy;if(e>=0){ y++;e-=2*dx;}}return 0;}int main(){initgraph(640,480);bresenham(0,0,500,200,255);while(!kbhit()){}closegraph();return 0;}Bresenham画圆法:#include<graphics.h>#include<conio.h>int circlepoints(int x,int y,int color){putpixel(255+x,255+y,color);putpixel(255+y,255+x,color);putpixel(255-x,255+y,color);putpixel(255+y,255-x,color);putpixel(255-x,255-y,color);putpixel(255-y,255-x,color);putpixel(255+x,255-y,color);putpixel(255-y,255+x,color);return 0;}int bresenhamcircle(int r,int color){int x,y,d;x=0;y=r;d=3-2*r;while(x<=y){circlepoints(x,y,color);if(d<0)d+=4*x+6;else{d=d+4*(x-y)+10;y--;}x++;}return 0;}int main(){initgraph(640,480);bresenhamcircle(100,255);while(!kbhit()){}closegraph();return 0;}五、实验结果记录与分析实验结果如下:六、疑难问题报告湖北民族学院信息工程学院实验报告(数字媒体技术专业用)班级:0312413姓名:谌敦斌学号:031241318实验成绩:实验时间:2013年10 月29 日9、10 节实验地点:数媒实验室课程名称:计算机图形学基础教程实验类型:设计型 实验题目:多边形的填充算法和曲线的绘制一、实验目的通过本次实验,熟练掌握种子填充算法和多边形扫描线填充算法以及bezier曲线或者B样条曲线的基本绘制算法,能够独立在vc环境下实现任意多边形的填充和一般曲线的绘制,进一步熟悉opengl的语法结构和强大的绘图功能,增强多媒体底层程序绘图能力。
二、实验环境(软件、硬件及条件)Microsoft vc++6.0 多媒体计算机三、实验内容1.选择种子填充算法或者多边形的扫描线算法完成多边形的填充。
2.选择bezier曲线或者B样条曲线算法完成曲线的绘制。
四、实验方法与步骤打开vc++6.0,新建一个工程,再在工程里面建一个.cpp文件,编辑程序,编译连接后执行即可。
程序如下:多边形扫描线填充算法://sweep.h#ifndef SWEEP_H#define SWEEP_Hstruct Edge {int nxty;int curx;int dx, dy;Edge *nxt;};void sweep(int p[][2], int n, void (*setPixel)(int, int));#endif//sweepline.cpp#include <stdlib.h>#include <stdio.h>#include <glut.h>#include "sweep.h"void myInit();void setPixel(int x, int y);void myDisplay();int main(int argc, char **argv) {glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(640, 480);glutInitWindowPosition (100, 150);glutCreateWindow("SweepLine");glutDisplayFunc(&myDisplay);myInit();glutMainLoop();return 0;}void setPixel(int x, int y) {glBegin(GL_POINTS);glVertex2i(x, y);glEnd();}void myInit() {glClearColor(1.0, 1.0, 1.0, 0.0);glColor3f(0.0, 0.0, 0.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0, 640.0, 0.0, 480.0);}void myDisplay() {int i, j;glClear(GL_COLOR_BUFFER_BIT);int p[5][2];p[0][0] = 100; p[0][1] = 300;p[1][0] = 200; p[1][1] = 50;p[2][0] = 300; p[2][1] = 100;p[3][0] = 400; p[3][1] = 0;p[4][0] = 350; p[4][1] = 470;sweep(p, 5, setPixel);glFlush();}//sweep.cpp#include "sweep.h"#include <algorithm>using namespace std;const int MAXN = 1024;int cp[MAXN][2], n;inline bool cmp(int i, int j) {return cp[i][1] < cp[j][1] || (cp[i][1] == cp[j][1] && cp[i][0] < cp[j][0]);}Edge * e[MAXN], *h, *ph, *data;void insert(int ly, int px, int ind) {int y1,y2,y, nxt, pre, flag=0;nxt = (ind + 1) % n; pre = (ind - 1 + n) % n;y = cp[ind][1]; y1 = cp[nxt][1]; y2 = cp[pre][1];if (y1 > y2) swap(y1, y2);if (y1 < y && y < y2) {//需缩短一个单位flag = 1;}h = e[ly]; ph=NULL;while (h) {if (h->dy > cp[ind][1] || (h->dy == cp[ind][1] && h->dx > cp[ind][0])) break;ph = h;h = h->nxt;}data->curx = px; data->nxty = cp[ind][1]; data->dx = cp[ind][0] - px; data->dy = cp[ind][1] - ly; data->nxt = NULL;if (flag) data->nxty--;if (ph) {data->nxt = ph->nxt;ph->nxt = data;} else {data->nxt = e[ly];e[ly] = data;}}int ex[MAXN][MAXN], ne[MAXN];inline int abs(int a) {return a > 0 ? a : -a;}void makepoint(int line, Edge *h) {int dx = h->dx, dy = h->dy, cnt=0;int x, y, flag=1;if ((h->dx)*(h->dy)<0) flag=0;for (y=line, x=h->curx; y<=h->nxty; y++) {ex[y][ne[y]++] = x;cnt += 2*abs(dx);while (cnt>=2*abs(dy)) {cnt -= 2*abs(dy);if (flag) x++;else x--;}}}void sweep(int p[][2], int nn, void (*setPixel)(int, int)) {//对所有点按y坐标递增排序,y坐标相等的按x坐标递增排序n = nn;int i, j, k, ind, nxt, pre;int *num = new int[n]; //点索引;for (i=0; i<n; i++) num[i] = i;memcpy(cp, p, sizeof(cp));sort(num, num+n, cmp);//建立有序边表memset(e, 0, sizeof(e));for (i=0; i<n; i++) {nxt = (ind + 1) % n;pre = (ind - 1 + n) % n;if (p[nxt][1] > p[ind][1]) insert(p[ind][1], p[ind][0], nxt);if (p[pre][1] > p[ind][1]) insert(p[ind][1], p[ind][0], pre);}//处理active edge listmemset(ne, 0, sizeof(ne));for (i=0; i<MAXN; i++) {h = e[i]; ph = NULL;while (h) {makepoint(i, h);h = h->nxt;}sort(ex[i], ex[i]+ne[i]);for (j=0; j<ne[i]; j+=2)for (k=ex[i][j]; k<=ex[i][j+1]; k++)setPixel(k,i);}}Bezier曲线绘制:#include<glut.h>#include<stdlib.h>GLfloat ctrlpoints[4][3]={{-4.0,-4.0,0.0},{-2.0,4.0,0.0},{2.0,-4.0,0.0},{4.0,4.0,0.0}}; void init(void){glClearColor(1.0,0.0,0.0,0.0);glShadeModel(GL_FLAT);glMap1f(GL_MAP1_VERTEX_3,0.0,1.0,3,4,&ctrlpoints[0][0]);glEnable(GL_MAP1_VERTEX_3);}void display(void){int i;glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,1.0,0.0);glBegin(GL_LINE_STRIP);for(i=0;i<=30;i++)glEvalCoord1f((GLfloat)i/30.0);glEnd();glPointSize(5.0);glBegin(GL_POINTS);for(i=0;i<4;i++)glVertex3fv(&ctrlpoints[i][0]);glEnd();glFlush();}void reshape(int w,int h){glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<=h)glOrtho(-5.0,5.0,-5.0*(GLfloat)h/(GLfloat)w,5.0*(GLfloat)h/(GLfloat)w,-5.0,5.0);elseglOrtho(-5.0*(GLfloat)w/(GLfloat)h,5.0*(GLfloat)w/(GLfloat)h,-5.0,5.0,-5.0,5.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void keyboard(unsigned char key,int x,int y){switch(key){case 27:exit(0);break;}}int main(int argc,char*argv[]){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(100,100);glutInitWindowSize(400,400);glutCreateWindow(argv[0]);init();glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutMainLoop();return 0;}五、实验结果记录与分析六、疑难问题报告湖北民族学院信息工程学院实验报告(数字媒体技术专业用)班级:0312413姓名:谌敦斌学号:031241318实验成绩:实验时间:2013年11 月26 日9、10 节实验地点:数媒实验室课程名称:计算机图形学基础教程实验类型:设计型实验题目:简易交互式绘图系统的制作一、实验目的运用前面所学的绘图知识,利用opengl基于MFC或者直接在MFC 上调用函数构建一个简单的绘图系统,完成直线、圆、多边形、椭圆、bezier曲线等的绘制以及三维图形的简单运动与变幻以提高综合绘图能力和程序框架建构能力。