西电图形学上机报告

合集下载

西电DSP上机实验报告2

西电DSP上机实验报告2

DSP实验报告及大作业学院:电子信息工程班级:学号:姓名:实验一 VISUAL DSP++的使用入门一、实验目的1、熟悉VISUAL DSP++的开发环境。

针对ADSP-21065L SHARC DSP,利用几个用C、C++和汇编语言写成的简单例子来描述VISUAL DSP+十编程环境和调试器(debugger)的主要特征和功能。

2、对于运行在其它类型SHARC处理器的程序只需对其链接描述文件(.LDF)做一些小的变化,用于ADSP-21065L硬件仿真。

二、实验内容实验一:启动Visual DSP++,建立一个用C源代码的工程(Project),同时用调试器来评估用C 语言所编写代码的性能;实验二:创立一个新的工程,修改源码来调用一个汇编(asm)程序,重新编译工程,用调试器来评估用汇编语言所写程序的性能;实验三:利用调试器的绘图(plot)功能来图形显示一个卷积算法中的多个数据的波形;实验四:利用调试器的性能统计功能(Statistical profile来检查练习三中卷积算法的效率。

利用所收集到的性能统计数据就能看出算法中最耗时的地方。

三、实验步骤及结果练习一:1、进入 Visual DSP++,显示Visual DSP++的集成开发和调试环境窗口。

选择菜单中的Session\New Session\SHARK\ADSP-21065L SHARK processing Simulator.此过程为将要编译运行的程序建立了一个Session.2、选择菜单File 中Open 打开Project\E:\float\unit_1\dot_product_c \dotprodc.dpj。

(注:练习中将float压缩包解压与E盘)3、在菜单 Project中选择 Build Project来对工程进行编译。

在本例子中,编译器会检测到一个未定义的错误,显示为:“.\dotprod_main.c”,line 115:error #20:identifier“itn”is undefined itn i;双击该行文字,光标会自动定位出错行,再该行中将“itn”改为“int”,重新编译后没有错误。

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

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

KMUSTTeaching Records昆明理工大学《上机实验指导书》课程名称:计算机图形学所在系(部):国资院测绘系学年学期: 2012 — 2013 学年第 2 学期授课专业班级:地信101/土管101/测绘101 班级人数: 27/24/56 讲授教师:李向新教材名称:计算机图形学课程总学时: 64 ;总学分:理论学时: 38 ;实验(或实践)学时: 上机学时: 32 ;辅导(或答疑)学时: 系主任签章:第1部分计算机图形学上机实验大纲1.1 目的与任务计算机图形学上机是计算机图形学课程的组成部分之一,是掌握计算机图形学课程内容的一个重要实践环节。

通过上机实验,一方面可以让学生巩固课堂所学的计算机图形学基础理论,另一方面能让学生掌握基本的OpenGL的编程方法及技能,掌握使用OpenGL绘制基本图形,进行2D及3D维图形变换,生成曲线曲面及构建具有真实感的3D场景。

1.2 基本要求1. 了解OpenGL在计算机图形学中的应用基础知识。

2. 掌握基本的OpenGL的编程方法及技能。

3. 学会使用OpenGL绘制基本图形。

4. 学会使用OpenGL进行2D及3D维图形变换、生成曲线曲面及构建具有真实感的3D场景。

1.3 内容及学时安排上机1:glut工具包的安装及使用 2学时上机2:OpenGL编程练习 2学时上机3:OpenGL中基本几何图形的绘制 2学时上机4:二维图形变换编程练习 2学时上机5:交互式绘图技术编程练习 2学时上机6:三维图形变换编程练习 2学时上机7:OpenGL三维物体表示编程练习 2学时上机8:真实感图形的生成与处理上机 2学时合计 16学时1.4 教学参考书(1) 成思源等编著:计算机图形学,冶金工业出版社,2003.(2) (美)安杰尔(Edward Angel)著;李桂琼,张文祥译: OpenGL程序设计指南(第二版),北京:清华大学出版社,2005.(3) Edward Angel: Interactive Computer Graphics—A Top-Down Approach withOpenGL, Third Edition, Pearson Education, Inc., 2003.(4) F.S. Hill, JR:Computer Graphics Using OpenGL Second Edition, PearsonEducation, Inc., 2003.(5) James D. Foley et al.: Computer Graphics—Principles and Practice, SecondEdition in C, Pearson Education, Inc., 2002.(6) 朱家义:Visual C++程序设计,机械工业出版社,2003。

计算机图形学上机报告

计算机图形学上机报告

计算机图形学上机实验报告计算机科学与技术学院班级:学号:姓名:指导教师:完成日期:实验一:基本图元绘制一. 实验目的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;}。

图形学上机实验报告讲解

图形学上机实验报告讲解

计算机图形学上机实验报告实验一:kock分形雪花图案的绘制一、实验目的与要求目的:1.通过实验初步了解OPENGL。

2通过上机编程掌握OPENGL的画图机理和OPENGL。

要求:1.了解分形绘图的过程。

二、实验内容以Kock曲线为例,说明分形图形是如何生成的。

Kock曲线的初始生成元是一条直线段,生成规则是将直线段均分为三等分,首尾两端保持不变,中间用两端等长且互成60度角的直线段代替。

迭代公式如下:分别迭代1,3,6次,并记录结果。

三、实验结果实验结果图如下:3-1第一次分形3-2三次分形3-3六次分形四、体会通过这次实验了解到了分形系统的从图元到图形的形成过,分形在图形学的应用中,可以用来表示岩层、云、水、树、等。

并且亲手实现了“雪花”的分形图形。

通过迭代次数可控制图形的不同。

掌握了分形系统的形成过程。

完成了此次试验目的。

五、源程序void drawline(pt pt1, pt pt2)//绘制线{glBegin(GL_LINES);glVertex2d(pt1.x, pt1.y);glVertex2d(pt2.x, pt2.y);glEnd();}void drawkoch(pt pt1, pt pt2, int n)//n为确定的迭代次数{pt p1, p2, p3, p4, p5;glColor3f(0.0, 0.0, 0.0);p1.x = pt1.x;p1.y = pt1.y;p2.x = pt2.x;p2.y = pt2.y;if (n == 1){ drawline(p1, p2); }if (n>1){p3.x = p1.x + (-p1.x + p2.x) / 3;p3.y = p1.y + (-p1.y + p2.y) / 3;p4.x = p1.x + 2 * (-p1.x + p2.x) / 3;p4.y = p1.y + 2 * (-p1.y + p2.y) / 3;p5.x = (p4.x - p3.x) / 2 - (p4.y - p3.y)*sqrt(3.0) / 2 + p3.x;p5.y = (p4.y - p3.y) / 2 + (p4.x - p3.x)*sqrt(3.0) / 2 + p3.y;drawkoch(p1, p3, n - 1);drawkoch(p3, p5, n - 1);drawkoch(p5, p4, n - 1);drawkoch(p4, p2, n - 1);}if (n == 0)exit(0);}void display(void){glClear(GL_COLOR_BUFFER_BIT);pt p1, p2, p3;p1.x = 30;p1.y = 30;p2.x = 110;p2.y = 30;p3.x = 70;p3.y = 30 + 40 * sqrt(3.0);int n;do{//循环改变迭代次数glClear(GL_COLOR_BUFFER_BIT);printf("请输入Koch雪花的迭代次数,或输入0退出:");scanf("%d", &n);drawkoch(p1, p3, n);drawkoch(p3, p2, n);drawkoch(p2, p1, n);glFlush();} while (n != 0);}int main(int argc, char**argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowPosition(50, 100);glutInitWindowSize(500, 400);glutCreateWindow("KOCHCURVE");init();glutDisplayFunc(display);glutMainLoop();return 0;}实验二:星球环绕模型一、实验目的与要求目的:1.通过实验初步了解OpenGL中的深度测试缓存器算法。

操作系统上机实验报告(西电)

操作系统上机实验报告(西电)

操作系统上机题目一、题目实验1:LINUX/UNIX Shell部分(一)系统基本命令1.登陆系统,输入whoami 和pwd ,确定自己的登录名和当前目录;登录名yuanye ,当前目录/home/yuanye2.显示自己的注册目录?命令在哪里?a.键入echo $HOME,确认自己的主目录;主目录为/home/yuanyeb.键入echo $PA TH,记下自己看到的目录表;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/gamesc.键入which abcd,看看得到的错误信息;再键入which ls 和which vi,对比刚刚得到的结果的目录是否在a.、b.两题看到的目录表中;/bin/ls /usr/bin/vi3.ls 和cd 的使用:a.键入ls,ls -l ,ls -a ,ls -al 四条命令,观察输出,说明四种不同使用方式的区别。

1. examples.desktop 公共的模板视频图片文档音乐桌面; 总计322.-rw-r--r-- 1 yuanye yuanye 357 2011-03-22 22:15 examples.desktopdrwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 23:25 公共的drwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 23:25 模板drwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 23:25 视频drwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 23:25 图片drwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 23:25 文档drwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 23:25 音乐drwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 23:25 桌面3. . .fontconfig .local .Xauthority.. .gconf .mozilla .xsession-errors.bash_logout .gconfd .nautilus 公共的.bashrc .gksu.lock .profile 模板.cache .gnome2 .pulse 视频.chewing .gnome2_private .pulse-cookie 图片.config .gnupg .recently-used.xbel 文档.dbus .gstreamer-0.10 .scim 音乐.dmrc .gtk-bookmarks .sudo_as_admin_successful 桌面.esd_auth .gvfs .update-manager-coreexamples.desktop .ICEauthority .update-notifier4. 总计156drwxr-xr-x 28 yuanye yuanye 4096 2011-03-24 16:55 .drwxr-xr-x 3 root root 4096 2011-03-22 22:15 ..-rw-r--r-- 1 yuanye yuanye 220 2011-03-22 22:15 .bash_logout-rw-r--r-- 1 yuanye yuanye 3115 2011-03-22 22:15 .bashrcdrwxr-xr-x 3 yuanye yuanye 4096 2011-03-22 23:30 .cachedrwx------ 2 yuanye yuanye 4096 2011-03-22 23:24 .chewingdrwxr-xr-x 4 yuanye yuanye 4096 2011-03-22 23:30 .configdrwx------ 3 yuanye yuanye 4096 2011-03-22 22:31 .dbus-rw------- 1 yuanye yuanye 49 2011-03-24 16:54 .dmrc-rw------- 1 yuanye yuanye 16 2011-03-22 22:31 .esd_auth-rw-r--r-- 1 yuanye yuanye 357 2011-03-22 22:15 examples.desktopdrwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 23:15 .fontconfigdrwx------ 4 yuanye yuanye 4096 2011-03-24 16:54 .gconfdrwx------ 2 yuanye yuanye 4096 2011-03-24 16:56 .gconfd-rw-r----- 1 yuanye yuanye 0 2011-03-22 23:19 .gksu.lockdrwx------ 6 yuanye yuanye 4096 2011-03-22 23:20 .gnome2drwx------ 2 yuanye yuanye 4096 2011-03-22 22:32 .gnome2_privatedrwx------ 2 yuanye yuanye 4096 2011-03-22 22:31 .gnupgdrwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 22:32 .gstreamer-0.10-rw-r--r-- 1 yuanye yuanye 156 2011-03-24 16:55 .gtk-bookmarksdr-x------ 2 yuanye yuanye 0 2011-03-24 16:54 .gvfs-rw------- 1 yuanye yuanye 479 2011-03-24 16:54 .ICEauthoritydrwx------ 3 yuanye yuanye 4096 2011-03-22 23:30 .localdrwx------ 4 yuanye yuanye 4096 2011-03-22 23:29 .mozilladrwxr-xr-x 3 yuanye yuanye 4096 2011-03-22 22:32 .nautilus-rw-r--r-- 1 yuanye yuanye 675 2011-03-22 22:15 .profiledrwx------ 2 yuanye yuanye 4096 2011-03-24 16:54 .pulse-rw------- 1 yuanye yuanye 256 2011-03-22 22:31 .pulse-cookie-rw------- 1 yuanye yuanye 861 2011-03-22 23:30 .recently-used.xbeldrwx------ 3 yuanye yuanye 4096 2011-03-22 23:24 .scim-rw-r--r-- 1 yuanye yuanye 0 2011-03-22 22:35 .sudo_as_admin_successful drwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 22:33 .update-manager-core drwx------ 2 yuanye yuanye 4096 2011-03-22 22:32 .update-notifier-rw------- 1 yuanye yuanye 117 2011-03-24 16:54 .Xauthority-rw-r--r-- 1 yuanye yuanye 3385 2011-03-24 16:56 .xsession-errorsdrwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 23:25 公共的drwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 23:25 模板drwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 23:25 视频drwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 23:25 图片drwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 23:25 文档drwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 23:25 音乐drwxr-xr-x 2 yuanye yuanye 4096 2011-03-22 23:25 桌面b.利用cd 转到/bin,/sbin ,/etc ,/dev,再利用ls 列出各个目录的内容,如果"迷路",可以利用pwd 确定位置,或键入cd ,cd ~ 观察效果.cd ,cd ~的区别: 1. bash dnsdomainname mountpoint sleepbunzip2 dumpkeys mt sttybzcat echo mt-gnu subzcmp ed mv syncbzdiff egrep nano tailfbzegrep false nc tarbzexe fgconsole nc.traditional tempfilebzfgrep fgrep netcat touchbzgrep fuser netstat truebzip2 fusermount ntfs-3g ulockmgr_serverbzip2recover grep ntfs-3g.probe umountbzless gunzip open unamebzmore gzexe openvt uncompresscat gzip pidof unicode_startchgrp hostname ping vdirchmod ip ping6 whichchown kbd_mode ps zcatchvt kill pwd zcmpcp ld_static rbash zdiffcpio ln readlink zegrepdash loadkeys rm zfgrepdate login rmdir zforcedbus-cleanup-sockets ls rnano zgrepdbus-daemon lsmod run-parts zlessdbus-uuidgen mkdir sed zmoredd mknod setfont znewdf mktemp setupcondir more shdmesg mount sh.distrib2. acpi_available getty mii-tool resize_reiserfsalsa grub-install mkdosfs rmmodalsactl halt mke2fs routeapm_available hdparm mkfs rtacctapparmor_parser hwclock mkfs.bfs rtmonbadblocks ifconfig mkfs.cramfs runlevelblkid ifdown mkfs.ext2 sfdisk blockdev ifup mkfs.ext3 shadowconfig brltty init mkfs.ext4 shutdownbrltty-setup initctl mkfs.ext4dev slattachcfdisk insmod mkfs.minix sscrda installkernel mkfs.msdos startctrlaltdel ip mkfs.reiserfs start-stop-daemon debugfs ip6tables mkfs.vfat status debugreiserfs ip6tables-restore mkreiserfs stopdepmod ip6tables-save mkswap sulogin dhclient ipmaddr modinfo swapoff dhclient3 iptables modprobe swapon dhclient-script iptables-restore mount.fuse sysctldmsetup iptables-save mount.ntfs syslogddosfsck iptunnel mount.ntfs-3g tcdosfslabel isosize mount.vmhgfs telinitdumpe2fs iwconfig nameif tune2fse2fsck iwevent on_ac_power udevadme2image iwgetid pam_tally udevde2label iwlist parted umount.hale2undo iwpriv partprobe unix_chkpwd fdisk iwspy pccardctl unix_update findfs kbdrate pivot_root update-grubfsck killall5 plipconfig usplashfsck.cramfs klogd poweroff usplash_down fsck.ext2 ldconfig rarp usplash_write fsck.ext3 ldconfig.real raw vol_idfsck.ext4 logd readahead-list vstpfsck.ext4dev logsave readahead-watch wpa_action fsck.minix losetup reboot wpa_clifsck.msdos lrm-manager regdbdump wpa_supplicant fsck.nfs lsmod reiserfsckfsck.reiserfs lspcmcia reiserfstunefsck.vfat MAKEDEV resize2fs3. acpi login.defsadduser.conf logrotate.confadjtime logrotate.dalsa lsb-basealternatives lsb-base-logging.shanacrontab lsb-releaseapm ltrace.conf apparmor magicapparmor.d magic.mimeapport mailcapapt mailcap.orderat.deny manpath.configavahi mime.typesbash.bashrc mke2fs.confbash_completion modprobe.dbash_completion.d modules bindresvport.blacklist monoblkid.tab motdblkid.tab.old motd.tailbluetooth mtabbogofilter.cf mtools.confbonobo-activation nanorcbrlapi.key netscsid.confbrltty networkbrltty.conf NetworkManagerca-certificates networksca-certificates.conf nsswitch.confcalendar obex-data-server chatscripts openoffice checkbox.d optcompizconfig pam.conf ConsoleKit pam.dconsole-setup pangoconsole-tools papersizecron.d passwdcron.daily passwd-cron.hourly pcmciacron.monthly perlcrontab pmcron.weekly pnm2ppa.confcups PolicyKitdbus-1 popularity-contest.conf debconf.conf powerdebian_version pppdefault profiledefoma profile.ddeluser.conf protocolsdepmod.d pulse dhcp3 purple dictionaries-common pythondm python2.6 doc-base rc0.ddpkg rc1.de2fsck.conf rc2.d emacs rc3.d environment rc4.d esound rc5.d event.d rc6.d firefox-3.0 rc.localfonts rcS.d foomatic readahead fstab resolvconf fuse.conf resolv.conf gai.conf rmtgamin rpcgconf samba gdm sane.d gimp scim gnome screenrc gnome-app-install scsi_id.config gnome-system-tools securetty gnome-vfs-2.0 security gnome-vfs-mime-magic sensors.conf gre.d services groff sgmlgroup shadow group- shadow- grub.d shells gshadow skel gshadow- soundgtk-2.0 sshhal ssl hdparm.conf sudoers hesiod.conf sysctl.conf host.conf sysctl.d hostname syslog.conf hosts terminfo hosts.allow timezonehosts.deny tpvmlp.confhp ts.confifplugd ucf.confinit.d udevinitramfs-tools ufwinputrc updatedb.confiproute2 updatedb.conf.BeforeVMwareToolsInstallissue update-manager update-motd.dkbd update-notifierkernel usplash.confkernel-img.conf vimlaptop-mode vmware-toolsldap w3mld.so.cache wgetrcld.so.conf wodim.confld.so.conf.d wpa_supplicantlftp.conf X11libpaper.d xdglocale.alias xmllocaltime xulrunner-1.9logcheck zsh_command_not_foun4. adsp loop7 ram7 tty15 tty43 usbdev1.1_ep00agpgart lp0 ram8 tty16 tty44 usbdev1.1_ep81audio mapper ram9 tty17 tty45 usbdev2.1_ep00block mem random tty18 tty46 usbdev2.1_ep81bus midi rtc tty19 tty47 usbmon0cdrom1 mixer rtc0 tty2 tty48 usbmon1char net scd0 tty20 tty49 usbmon2console network_latency sda tty21 tty5 vcscore network_throughput sda1 tty22 tty50 vcs1cpu_dma_latency null sda2 tty23 tty51 vcs2disk oldmem sda5 tty24 tty52 vcs3dmmidi parport0 sequencer tty25 tty53 vcs4dsp pktcdvd sequencer2 tty26 tty54 vcs5ecryptfs port sg0 tty27 tty55 vcs6fd ppp sg1 tty28 tty56 vcs7fd0 psaux shm tty29 tty57 vcs8full ptmx snapshot tty3 tty58 vcsafuse pts snd tty30 tty59 vcsa1hpet ram0 sndstat tty31 tty6 vcsa2initctl ram1 sr0 tty32 tty60 vcsa3input ram10 stderr tty33 tty61 vcsa4kmem ram11 stdin tty34 tty62 vcsa5kmsg ram12 stdout tty35 tty63 vcsa6log ram13 tty tty36 tty7 vcsa7loop0 ram14 tty0 tty37 tty8 vcsa8loop1 ram15 tty1 tty38 tty9 vmciloop2 ram2 tty10 tty39 ttyS0 vsockloop3 ram3 tty11 tty4 ttyS1 xconsoleloop4 ram4 tty12 tty40 ttyS2 zeroloop5 ram5 tty13 tty41 ttyS3loop6 ram6 tty14 tty42 urandom区别:(二)基本操作1.用cp 将/usr/share 目录下的exercise 子目录连同目录下的文件拷贝到自己的主目录下,然后进入自己的exercise 目录:cp -r /usr/share ./.2.输入/输出重定向和cat,more 等显示命令的配合使用:a.输入cat 命令列出目录下longtext 文件中的内容;b.输入cat 命令列出目录下longtext 文件中的内容,是否发现一屏显示不完?c.使用more 命令列出longtext 的内容;d.输入cat hello.txt> hello2.txt,再输入cat hello.txt>>hello2.txt,再检查hello2.txt的内容有何变化;说明>与>>的区别。

西电最优化上机报告(大作业)

西电最优化上机报告(大作业)

上机报告一.最速下降法算法简述:1.在本例中,先将最速下降方向变量赋一个值,使其二范数满足大于ε的迭代条件,进入循环。

2.将函数的一阶导数化简,存在一个矩阵,将其hesse矩阵存在另一个矩阵。

依照公式求出α,进而求出下一任迭代的矩阵初值。

循环内设置一个计数功能的变量,统计迭代次数。

3.求其方向导数的二范数,进行判别,若小于ε,则跳出循环,否则将继续迭代。

4.显示最优解,终止条件,最小函数值。

心得体会:最速下降法的精髓,无疑是求梯度,然后利用梯度和hesse矩阵综合计算,求解下一个当前最优解。

但是,要求函数是严格的凸函数,结合严格凸函数的大致图像,这就给初值的选取提供了一点参考。

例如在本例中,由于含有两个变量的二次方之和,结合大致图像,想当然的,初值的选取应当在原点附近;又因为变量的二次方之和后面,还减去了变量的一次形式和一次混合积,所以初值的选取应该再向第一象限倾斜。

综合以上考量,第一次选取(1,1)作为初值,判别精度方面,取到千分位,暂定为0.001。

运行以后,结果显示迭代了25次,最优解为(3.9995,1.9996),终止条件为5.4592e-04,目标函数为-8.0000。

这个结果已经相当接近笔算结果。

整体的运行也比较流畅,运算速度也比较快。

第二次取值,决定保留判别精度不变,将初值再适当向第一象限倾斜,取(2,2)作为初值,运行后,显示只迭代了11次!最优结果显示(3.9996,1.9997),终止条件为3.6204e-04,最优解-8.0000。

可见,最优结果更接近理想值,终止条件也变小了,最关键的是,迭代次数减少至第一次的一半以下!这说明以上初选取的方向是对的!第三次再进行初值细化,判别精度仍然不变,初值取(3,3)。

结果令人兴奋,只迭代了四次!最优解已经显示为(4.0000,2.0000),终止条件为2.4952e-04,目标函数-8.0000。

第四次,判别精度不变,取初值(4,4)。

西电数字图像处理上机报告

西电数字图像处理上机报告

数字图像处理上机报告实验一一、实验目的1.熟悉有关数字图像处理的MATLAB基本操作和编写;2.掌握数字图像的基本读写、显示与保存;3.能够利用MATLAB工具箱完成图像处理的基本运算;二、实验内容1.(1)读取图像并显示真彩色图像house.tiff;(2)读取图像并显示索引色图像canoe.tif,并转换为灰度图像;(3)读取图像并显示灰度图像rice.png,并转换为二进制图像;(4)检测内存中的图像和保存图像;2.查看不同分辨率下图像lena.tiff的显示结果;3.对彩色图像Peppers.png观看GRB通道各单通道图像;4.实现马赫带效应并画出灰度直方图。

程序如下:clear allclose allclc%%%%%%%%Task1%%%%%%%%%%读取图像并显示真彩色图像%读入图像img_house=imread('house.tiff');figure('NumberTitle', 'off', 'Name', '真彩House');imshow(img_house)%%%%%%%%Task2%%%%%%%%%%读取图像并显示索引色图像,并转换为灰度图像;%读入图像[img_canoe,MAP_canoe]=imread('canoe.tif');figure('NumberTitle', 'off', 'Name', '索引Canoe');imshow(img_canoe,MAP_canoe)gray_canoe = ind2gray(img_canoe,MAP_canoe);figure('NumberTitle', 'off', 'Name', '灰度Canoe');imshow(gray_canoe);%%%%%%%%Task3%%%%%%%%%%读取图像并显示灰度图像,并转换为二进制图像%读入图像img_rice=imread('rice.png');figure('NumberTitle', 'off', 'Name', '灰度Rice');imshow(img_rice)bw_rice = im2bw(img_rice);figure('NumberTitle', 'off', 'Name', '二进制Rice');imshow(bw_rice);%%%%%%%%Task4%%%%%%%%%%读取图像-保存图像-重新读取保存的图像%读入图像img_rice=imread('rice.png');figure('NumberTitle', 'off', 'Name', 'Read Image Rice');imshow(img_rice)imwrite(img_rice,'RiceImg_Write','TIFF');img_rice_Rre=imread('RiceImg_Write','TIFF');figure('NumberTitle', 'off', 'Name', 'Reread Rice');imshow(img_rice_Rre);%%%%%%%%Task4%%%%%%%%%%读取图像并显示真彩色图像%读入图像img_lena=imread('lena.tiff');figure('NumberTitle', 'off', 'Name', 'Lena');imshow(img_lena)small_lena = imresize(img_lena, 0.1);%图像缩放figure('NumberTitle', 'off', 'Name', 'Small Lena');imshow(small_lena)big_lena = imresize(img_lena, 0.7);%图像缩放figure('NumberTitle', 'off', 'Name', 'Big Lena');imshow(big_lena)%%%%%%%%Task5%%%%%%%%%%对彩色图像Peppers.png观看GRB通道各单通道图像%读入图像I = imread('Peppers.png');R=I;R(:,:,[2 3])=0;G=I;G(:,:,[1 3])=0;B=I;B(:,:,[1 2])=0;figure,imshow(R);figure,imshow(G);figure,imshow(B);%%%%%%%%Task4%%%%%%%%%%实现马赫带效应并画出灰度直方图imsize_x=300;%图像大小(正方形)imsize_y=300;n=7;%马赫带个数img_machbands=zeros(imsize_x,imsize_y);for i=1:nimg_machbands(:,fix(imsize_y*(i-1)/n)+1:fix(imsize_y*i/n))=255*(i-1)/n; endimg_machbands=uint8(img_machbands);figure('NumberTitle', 'off', 'Name', 'Mach Bands');imshow(img_machbands);figure('NumberTitle', 'off', 'Name', 'Mach Bands Hist');imhist(img_machbands);结果如下:实验二一、实验目的1.熟悉有关MATLAB工具箱中提供的图像变换函数;2.掌握傅立叶变换和小波变换等常用的正交变换函数;二、实验内容1.对图像lena.png进行傅立叶变换和离散余弦变换,并分别求出其逆变换后重构图像的均方误差;2.实现图像lena.png的两层小波分解,观察分解系数并重构,求重构图像误差值;3.观察图像IM1.BMP经小波分解系数的方向性,实现三层小波分解,分别把HL,LH,HH子带置零和重构,观察重构图像跟原始图像的差异。

西电 自动控制 上机 实验 报告

西电 自动控制 上机 实验 报告

程序代码aa1.mft = 30;M=1;B=5;K=20; %系统参数tspan = [0,5]; %设置仿真开始和结束时间x0 = [0,0]; %系统初始值,零初始条件options = odeset('AbsTol',1e-6); %设置仿真计算精度[t,x] = ode113('xt4odefile',tspan,x0,options);%微分方程求解,计算位移x(:,1)和速度x(:,2)a = 1/M*(ft-B*x(:,2)-K*x(:,1)); %计算加速度i = 1;while (abs(a(i))>0.0001|(abs(x(i,2))>0.0001))i = i+1;enddisp('稳态时系统的位移、速度和加速度及对应的时间分别为:'); result = sprintf('位移d=%6.4f\n',x(i,1)); %显示计算结果disp(result);result = sprintf('速度v=%8.6f\n',x(i,2));disp(result);result = sprintf('加速度a=%9.6f\n',a(i));disp(result);result = sprintf('时间t=%4.2f\n',t(i));disp(result);d = x(:,1);subplot(311),plot(t,d); %绘制时间-位移曲线xlabel('时间(秒)');ylabel('位移(米)');title('时间-位移曲线');grid;v = x(:,2);subplot(312),plot(t,v); %绘制时间-速度曲线xlabel('时间(秒)');ylabel('速度(米/秒)');title('时间-速度曲线');grid;subplot(313),plot(d,v); %绘制位移-速度曲线xlabel('位移(米)');ylabel('速度(米/秒)');title('位移-速度曲线');grid;其中xt4odefile函数为:functionxt = xt4odefile(t,x)ft = 30;M=1;B=5;K=20;xt = [x(2);1/M*(ft-B*x(2)-K*x(1))]; 运行结果:程序代码aa2.mclear all; close all; num=[2,5,7]; den=[1,6,10,6]; sys=tf(num,den); [z,p,k]=tf2zp(num,den) [r,p,k]=residue(num,den)运行结果z ,p ,k 分别代表零点,极点和增益。

计算机图形学实验报告

计算机图形学实验报告

计算机图形学实验报告计算机图形学实验报告引言计算机图形学是研究计算机生成和处理图像的学科,它在现代科技和娱乐产业中扮演着重要的角色。

本实验报告旨在总结和分享我在计算机图形学实验中的经验和收获。

一、实验背景计算机图形学实验是计算机科学与技术专业的一门重要课程,通过实践操作和编程,学生可以深入了解图形学的基本原理和算法。

本次实验主要涉及三维图形的建模、渲染和动画。

二、实验内容1. 三维图形建模在实验中,我们学习了三维图形的表示和建模方法。

通过使用OpenGL或其他图形库,我们可以创建基本的几何体,如立方体、球体和圆柱体,并进行变换操作,如平移、旋转和缩放。

这些基本操作为后续的图形处理和渲染打下了基础。

2. 光照和着色光照和着色是图形学中重要的概念。

我们学习了不同的光照模型,如环境光、漫反射和镜面反射,并了解了如何在三维场景中模拟光照效果。

通过设置材质属性和光源参数,我们可以实现逼真的光照效果,使物体看起来更加真实。

3. 纹理映射纹理映射是一种将二维图像映射到三维物体表面的技术。

通过将纹理图像与物体的顶点坐标相对应,我们可以实现更加细致的渲染效果。

在实验中,我们学习了纹理坐标的计算和纹理映射的应用,使物体表面呈现出具有纹理和细节的效果。

4. 动画和交互动画和交互是计算机图形学的重要应用领域。

在实验中,我们学习了基本的动画原理和算法,如关键帧动画和插值技术。

通过设置动画参数和交互控制,我们可以实现物体的平滑移动和变形效果,提升用户体验。

三、实验过程在实验过程中,我们首先熟悉了图形库的使用和基本的编程技巧。

然后,我们按照实验指导书的要求,逐步完成了三维图形建模、光照和着色、纹理映射以及动画和交互等任务。

在实验过程中,我们遇到了许多挑战和问题,但通过不断的尝试和调试,最终成功实现了预期的效果。

四、实验结果通过实验,我们成功实现了三维图形的建模、渲染和动画效果。

我们可以通过键盘和鼠标控制物体的移动和变形,同时观察到真实的光照效果和纹理映射效果。

西安电子科技大学数字图像处理上机报告

西安电子科技大学数字图像处理上机报告

数字图像处理上机报告专业:电子信息工程班级:020915学号:02091478姓名:陈步华实验一1、实验要求产生右图所示图像 f1(m,n),其中图像大小为256×256,中间亮条128×32,暗处=0,亮处=100。

对其进行FFT:①同屏显示原图f1(m,n)和FFT(f1)的幅度谱图;②若令f2(m,n)=(-1)m+n f1(m,n),重复以上过程,比较二者幅度谱的异同,简述理由;③若将f2(m,n)顺时针旋转90 度得到f3(m,n),试显示FFT(f3)的幅度谱,并与FFT(f2)的幅度谱进行比较;④若将f1(m,n) 顺时针旋转90 度得到f4(m,n),令f5(m,n)=f1(m,n)+f4(m,n),试显示FFT(f5)的幅度谱,并指出其与 FFT(f1)和FFT(f4)的关系;⑤若令f6(m,n)=f2(m,n)+f3(m,n),试显示FFT(f6)的幅度谱,并指出其与 FFT(f2)和FFT(f3)的关系,比较FFT(f6)和FFT(f5)的幅度谱。

2.实验结果①显示的f1(m,n)和FFT(f1)的幅度谱图如下图所示:②FFT(f1)和FFT(f2)同屏显示如图:分析: f2(m,n)=(-1)n m +f1(m,n)⇔F (u-2N ,v-2N),即通过给图像f1(m,n)乘以(-1)n m +可使f1(m,n)从原点(0,0)移到中心(N/2,N/2),从而实现频谱的中心化。

③分析:f3(m,n)为f2(m,n)图像左转90°而得,f3(m,n)的FFT转换图像也是f2(m,n)的FFT转换图像左转90°所得。

④⑤分析:将f5与f6的幅度图像作比较得f6也是对f5实现了频谱中心化实验二1、实验要求产生教材104 页题图4.18(右图)所示的二值图像(白为1,黑为0),编程实现习题4.18 所要求的处理(3´3 的平均滤波和中值滤波)功能(图像四周边界不考虑,处理结果按四舍五入仍取0 或1),显示处理前后的图像,比较其异同。

西电微机原理上机报告上机报告

西电微机原理上机报告上机报告

2、利用移位、传送和相加指令实现AX的内容扩大10倍。

(1)流程图如下,是简单的顺序结构。

(2)设最初AX=0001H,则理论最终结果应为AX=000AH。

结果截图如下:由图可见,AX=000AH,结果正确。

(3)调试过程的全部单步操作如下:(4)程序代码:DATAS SEGMENT DATAS ENDSSTACKS SEGMENT DW100H DUP(?)TOP LABEL WORD STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSSTART:MOV AX,DATASMOV DS,AXMOV AX,0003HMOV BX,AXSHL AX,1SHL BX,1SHL BX,1SHL BX,1ADD AX,BXMOV AH,4CHINT21HCODES ENDSEND START3、在缓冲区VAR中连续存放着3个16位的无符号数,编写程序实现将其按递增关系排列;如果VAR中保存的为有符号数,再编写程序实现将其按递减关系排列。

(1)流程图如下。

第一个为无符号数的递增排列;第二个为有符号数的递减排列。

三个数字进行递增或者递减排列,最终结果仅有6种情况。

因此采用多重分支结构,对三个数字进行排列。

(2)将三个无符号数:2500、1000、4500进行递增排列,结果输出为:最终输出AX=03E8H=1000;BX=09C4H=2500;CX=1194H=4500。

结果正确。

将三个有符号数:-2500、-1000、-4500进行递减排列,结果输出为:最终输出AX=03E8H= -1000;BX=09C4H= -2500;CX=1194H= -4500。

结果正确。

(3)调试过程中的全部单步操作如下:(4)程序代码:<1>三个无符号数的递增排列:STACK SEGMENT STACKSTACK ENDSDATA SEGMENTVAR DW2500,1000,4500DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATAMOV DS,AXMOV AX,VARCMP AX,VAR+2JBE S1JMP T1S1:CMP AX,VAR+4JAE S2MOV BX,VAR+2CMP BX,VAR+4JAE S3JMP S4T1:MOV AX,VAR+2CMP AX,VAR+4JAE T2MOV BX,VARJAE T3 JMP T4S2:MOV AX,VAR+4 MOV BX,VAR MOV CX,VAR+2 JMP FINS3:MOV AX,VAR MOV BX,VAR+4 MOV CX,VAR+2 JMP FINS4:MOV AX,VAR MOV BX,VAR+2 MOV CX,VAR+4 JMP FINT2:MOV AX,VAR+4 MOV BX,VAR+2 MOV CX,VAR JMP FINT3:MOV AX,VAR+2 MOV BX,VAR+4 MOV CX,VAR JMP FINT4:MOV AX,VAR+2MOV CX,VAR+4JMP FINFIN:MOV AH,4CHINT21HCODE ENDSEND START<2>三个有符号数的递减排序:STACK SEGMENT STACKSTACK ENDSDATA SEGMENTVAR DW-2500,-1000,-4500DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATAMOV DS,AXMOV AX,VARCMP AX,VAR+2JGE S1JMP T1S1:CMP AX,VAR+4JLE S2MOV BX,VAR+2CMP BX,VAR+4JLE S3 JMP S4T1:MOV AX,VAR+2 CMP AX,VAR+4 JLE T2 MOV BX,VAR CMP BX,VAR+4 JLE T3 JMP T4S2:MOV AX,VAR+4 MOV BX,VAR MOV CX,VAR+2 JMP FINS3:MOV AX,VAR MOV BX,VAR+4 MOV CX,VAR+2 JMP FINS4:MOV AX,VAR MOV BX,VAR+2 MOV CX,VAR+4 JMP FINT2:MOV AX,VAR+4 MOV BX,VAR+2 MOV CX,VAR JMP FINT3:MOV AX,VAR+2MOV BX,VAR+4MOV CX,VARJMP FINT4:MOV AX,VAR+2MOV BX,VARMOV CX,VAR+4JMP FINFIN:MOV AH,4CHINT21HCODE ENDSEND START5、在变量VAR1和VAR2中分别保存有两个字节型的正整数,编写完整的汇编语言程序实现:(1)当两数中有一个奇数时,将奇数存入VAR1,偶数存入VAR2;(2)当两数均为奇数时,两个变量的内容不变;(3)当两数均为偶数时,两数缩小一半后存入原处。

西电数字信号处理上机实验报告

西电数字信号处理上机实验报告

数字信号处理上机实验报告14020710021 张吉凯第一次上机实验一:设给定模拟信号()1000t a x t e -=,t 的单位是ms 。

(1) 利用MATLAB 绘制出其时域波形和频谱图(傅里叶变换),估计其等效带宽(忽略谱分量降低到峰值的3%以下的频谱)。

(2) 用两个不同的采样频率对给定的()a x t 进行采样。

○1()()15000s a f x t x n =以样本秒采样得到。

()()11j x n X e ω画出及其频谱。

○2()()11000s a f x t x n =以样本秒采样得到。

()()11j x n X e ω画出及其频谱。

比较两种采样率下的信号频谱,并解释。

(1)MATLAB 程序:N=10; Fs=5; T s=1/Fs;n=[-N:T s:N];xn=exp(-abs(n)); w=-4*pi:0.01:4*pi; X=xn*exp(-j*(n'*w)); subplot(211) plot(n,xn);title('x_a(t)时域波形');xlabel('t/ms');ylabel('x_a(t)'); axis([-10, 10, 0, 1]); subplot(212);plot(w/pi,abs(X)); title('x_a(t)频谱图');xlabel('\omega/\pi');ylabel('X_a(e^(j\omega))');ind = find(X >=0.03*max(X))*0.01; eband = (max(ind) -min(ind)); fprintf('等效带宽为%fKHZ\n',eband); 运行结果:等效带宽为12.110000KHZ(2)MATLAB程序:N=10;omega=-3*pi:0.01:3*pi;%Fs=5000Fs=5;T s=1/Fs;n=-N:T s:N;xn=exp(-abs(n));X=xn*exp(-j*(n'*omega));subplot(2,2,1);stem(n,xn);grid on;axis([-10, 10, 0, 1.25]); title('时域波形(f_s=5000)');xlabel('n');ylabel('x_1(n)');subplot(2,2,2);plot(omega/pi,abs(X));title('频谱图(f_s=5000)');xlabel('\omega/\pi');ylabel('X_1(f)');grid on;%Fs=1000Fs=1;T s=1/Fs;n=-N:T s:N;xn=exp(-abs(n));X=xn*exp(-j*(n'*omega));subplot(2,2,3);stem(n,xn);grid on;axis([-10, 10, 0, 1.25]); title('时域波形(f_s=1000)');xlabel('n');ylabel('x_2(n)');grid on;subplot(2,2,4);plot(omega/pi,abs(X));title('频谱图(f_s=1000)');xlabel('\omega/\pi');ylabel('X_2(f)');grid on;运行结果:实验二:给定一指数型衰减信号()()0cos 2at x t e f t π-=,采样率1s f T=,T 为采样周期。

计算机图形学实验报告

计算机图形学实验报告

计算机图形学实验报告一、实验目的本次计算机图形学实验旨在深入了解和掌握计算机图形学的基本原理、算法和技术,通过实际操作和编程实现,提高对图形生成、处理和显示的能力,培养解决实际图形问题的思维和实践能力。

二、实验环境本次实验使用的编程语言为 Python,借助了相关的图形库如Pygame 或 matplotlib 等。

开发环境为 PyCharm 或 Jupyter Notebook。

三、实验内容(一)二维图形的绘制1、直线的绘制使用 DDA(Digital Differential Analyzer)算法或 Bresenham 算法实现直线的绘制。

通过给定直线的起点和终点坐标,在屏幕或图像上绘制出直线。

比较两种算法的效率和准确性,分析其优缺点。

2、圆的绘制采用中点画圆算法或 Bresenham 画圆算法绘制圆。

给定圆心坐标和半径,生成圆的图形。

研究不同半径大小对绘制效果和计算复杂度的影响。

(二)图形的填充1、多边形填充实现扫描线填充算法,对任意多边形进行填充。

处理多边形的顶点排序、交点计算和填充颜色的设置。

测试不同形状和复杂度的多边形填充效果。

2、图案填充设计自定义的填充图案,如纹理、条纹等,并将其应用于图形填充。

探索如何通过改变填充图案的参数来实现不同的视觉效果。

(三)图形的变换1、平移、旋转和缩放对已绘制的图形(如矩形、三角形等)进行平移、旋转和缩放操作。

通过矩阵运算实现这些变换。

观察变换前后图形的位置、形状和方向的变化。

2、组合变换将多个变换组合应用于图形,如先旋转再平移,或先缩放再旋转等。

分析组合变换的顺序对最终图形效果的影响。

(四)三维图形的表示与绘制1、三维坐标变换学习三维空间中的平移、旋转和缩放变换矩阵,并将其应用于三维点的坐标变换。

理解如何将三维坐标映射到二维屏幕上显示。

2、简单三维图形绘制尝试绘制简单的三维图形,如立方体、球体等,使用线框模型或表面模型。

探讨不同的绘制方法和视角对三维图形显示的影响。

上机报告表,计算机图形学

上机报告表,计算机图形学

计算机图形学上机报告上机项目:计算机图形学系别:班级:学号:姓名:上机报告上机项目计算机图形学上机日期指导教师实验地点一、上机目的熟练掌握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画圆法:二维坐标变换:直线段裁剪:七、心得体会通过几次实习我学到了很多计算机图形学的实践知识,也了解到编程的一些技巧,深刻的体会到计算机的深奥。

计算机图形学上机报告模板(10)

计算机图形学上机报告模板(10)

实验报告(第10周)
班级:姓名:学号:
实验名称:二维图形变换
报告内容:
1、任务描述
(1)绘制坐标体系,原点在绘图区正中,X轴向右,Y轴向上
(2)在第一象限绘制一个三角形
(3)编写二维图形变换类,完成平移、旋转、比例、错切的基本变换
(4)使用图形变换类完成三角形的基本变换
(5)绘制一个正方形,使用变换的方法,实现绕中心的45度旋转
(6)尝试与定时器结合,形成连续旋转的动画效果
2、试验环境
(1)Visual Studio 6.0 (或以上)标准版
3、试验目标
(1)掌握二维图形变换的基本方法
(2)掌握简单动画的生成方法
4、实验步骤
(运行结果抓图,有用的程序代码,并辅助文字说明)。

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

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

计算机图形学上机实验报告实验名称:线画图元生成中国石油大学(北京)信息学院计算机科学与技术系班级:计算机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)画刷为圆形四、实验讨论与体会体会:通过本次实验,让我了解到了上文提到的几种算法实现的具体过程,并且通过动态画线,对几种算法生成线的过程和特点也有个更进一步的学习和掌握。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机图形学上机作业潘曦03120112 第一题:题目:已知4点P1(0,0,0)、P2(1,1,1)、P3(2,-1,-1)、P4(3,0,0),用其作为控制点分别绘制一条Bezier曲线、一条B样条曲线,并分别计算参数为0、1/3、2/3、1时它们各自的位置矢量。

算法部分:算法部分依旧扩充在pancy_CGbasic.h中,由于之前的曲线均是z = 0的二维三次曲线,这次添加了一些处理三维点的成员函数,并且定义了3维顶点格式。

首先编写标准三次曲线绘制函数,该函数接受四个参数向量(t3参数,t2参数,t参数,1参数),然后枚举t = 0-1(分割为500份),然后根据参数矩阵算出x,y,z的值,最终获得一组待渲染的顶点组。

然后编写bezier曲线绘制函数,该函数接受四个控制点(p1,p2,p3,p4)根据控制点还原控制矩阵,然后乘以bezier基矩阵,获得标准的参数矩阵,送往之前写好的三次曲线绘制函数中获得待渲染的顶点组。

最后编写b样条线绘制函数,该函数接受一个控制点数组(*Pinput)和控制点数量,每次选四个点还原控制矩阵,然后乘以b样条基矩阵,获得标准的参数矩阵,送往之前写好的三次曲线绘制函数中获得待渲染的顶点组。

各个函数实现如下:标准三次曲线绘制函数void pancy_CGbasic::draw_3Dline(pancy_d3Dpoint a_t3,pancy_d3Dpoint b_t2,pancy_d3Dpointc_t,pancy_d3Dpoint d_1,pancy_d3Dpoint *Plist,int &all_num){all_num = 500;float rec_t;for(int i = 0; i < 500; ++i){rec_t = (i*1.0)/(500*1.0);Plist[i].x = d_1.x + (c_t.x * rec_t) + (b_t2.x * rec_t * rec_t) + (a_t3.x * rec_t * rec_t * rec_t);Plist[i].y = d_1.y + (c_t.y * rec_t) + (b_t2.y * rec_t * rec_t) + (a_t3.y * rec_t * rec_t * rec_t);Plist[i].z = d_1.z + (c_t.z * rec_t) + (b_t2.z * rec_t * rec_t) + (a_t3.z * rec_t * rec_t * rec_t);}}bezier曲线绘制函数void pancy_CGbasic::draw_Bezier(pancy_d3Dpoint p1,pancy_d3Dpoint p2,pancy_d3Dpointp3,pancy_d3Dpoint p4,pancy_d3Dpoint *plist,int &all_num){float matrix_basic[4][4] = {-1,3,-3,1, 3,-6,3,0, -3,3,0,0, 1,0,0,0};float matrix_control[3][4],matrix_answer[3][4];//乘并基矩阵和控制点矩阵matrix_control[0][0] = p1.x;matrix_control[0][1] = p2.x;matrix_control[0][2] = p3.x;matrix_control[0][3] = p4.x;matrix_control[1][0] = p1.y;matrix_control[1][1] = p2.y;matrix_control[1][2] = p3.y;matrix_control[1][3] = p4.y;matrix_control[2][0] = p1.z;matrix_control[2][1] = p2.z;matrix_control[2][2] = p3.z;matrix_control[2][3] = p4.z;matrix_multi34(matrix_control,matrix_basic,matrix_answer);//还原三次曲线方程pancy_d3Dpoint need_a,need_b,need_c,need_d;need_a.x = matrix_answer[0][0];need_b.x = matrix_answer[0][1];need_c.x = matrix_answer[0][2];need_d.x = matrix_answer[0][3];need_a.y = matrix_answer[1][0];need_b.y = matrix_answer[1][1];need_c.y = matrix_answer[1][2];need_d.y = matrix_answer[1][3];need_a.z = matrix_answer[2][0];need_b.z = matrix_answer[2][1];need_c.z = matrix_answer[2][2];need_d.z = matrix_answer[2][3];draw_3Dline(need_a,need_b,need_c,need_d,plist,all_num);}b样条线绘制函数void pancy_CGbasic::draw_Bbasic(pancy_d3Dpoint *Pinput,int all_input,pancy_d3Dpoint *Plist,int &all_num){//临时顶点存储pancy_d3Dpoint pancy_rec[1000];int all_need;//调和基矩阵float matrix_basic[4][4] = {-1,3,-3,1, 3,-6,3,0, -3,0,3,0, 1,4,1,0};for(int i = 0; i < 4; ++i){for(int j = 0; j < 4; ++j){matrix_basic[i][j] = matrix_basic[i][j] / 6;}}//控制点遍历pancy_d3Dpoint p1,p2,p3,p4;float matrix_control[3][4],matrix_answer[3][4];all_num = 0;for(int i = 0; i < all_input-3; ++i){p1 = Pinput[i];p2 = Pinput[i+1];p3 = Pinput[i+2];p4 = Pinput[i+3];//乘并基矩阵和控制点矩阵matrix_control[0][0] = p1.x;matrix_control[0][1] = p2.x;matrix_control[0][2] = p3.x;matrix_control[0][3] = p4.x;matrix_control[1][0] = p1.y;matrix_control[1][1] = p2.y;matrix_control[1][2] = p3.y;matrix_control[1][3] = p4.y;matrix_control[2][0] = p1.z;matrix_control[2][1] = p2.z;matrix_control[2][2] = p3.z;matrix_control[2][3] = p4.z;matrix_multi34(matrix_control,matrix_basic,matrix_answer);//还原三次曲线方程pancy_d3Dpoint need_a,need_b,need_c,need_d;need_a.x = matrix_answer[0][0];need_b.x = matrix_answer[0][1];need_c.x = matrix_answer[0][2];need_d.x = matrix_answer[0][3];need_a.y = matrix_answer[1][0];need_b.y = matrix_answer[1][1];need_c.y = matrix_answer[1][2];need_d.y = matrix_answer[1][3];need_a.z = matrix_answer[2][0];need_b.z = matrix_answer[2][1];need_c.z = matrix_answer[2][2];need_d.z = matrix_answer[2][3];draw_3Dline(need_a,need_b,need_c,need_d,pancy_rec,all_need);for(int j = 0; j < all_need; ++j){Plist[all_num++] = pancy_rec[j];}}}渲染部分:basic_need[0].x = 0;basic_need[1].x = 1;basic_need[2].x = 2;basic_need[3].x = 3;basic_need[0].y = 0;basic_need[1].y = 1;basic_need[2].y = -1;basic_need[3].y = 0;basic_need[0].z = 0;basic_need[1].z = 1;basic_need[2].z = -1;basic_need[3].z = 0;// test_need.draw_Bbasic(basic_need,4,list_3dneed1,all_numneed);test_need.draw_Bezier(basic_need[0],basic_need[1],basic_need[2],basic_need[3],list_ 3dneed1,all_numneed);//填充顶点缓存for(int i = mid_num1; i < mid_num1+all_numneed; ++i){rec[i].x = list_3dneed1[i-mid_num1].x*100+400;rec[i].y = list_3dneed1[i-mid_num1].y*100+200;rec[i].z = list_3dneed1[i-mid_num1].z*100+200;rec[i].rhw = 1.0f;rec[i].color = D3DCOLOR_XRGB(255,0,0);}//填充索引数组。

相关文档
最新文档