计算机图形学实验_透视茶壶源代码
计算机图形学实验_透视茶壶源代码
glScalef(sx,sy,sz);
Draw_Scene();
if(bAnim)
fRotate+=0.3f;
//todo hint:when you want to rotate the teepot you may like to add another line here =
case 'c':{center[1]=center[1]-1;break;}
case 'r':{center[0]=0;center[1]=0;center[2]=0;};//恢复原状
//茶壶相关操作
case 'j':{tx++;break;}
case 'l':{tx--;break;}
case 'i':{ty++;break;}
glMatrixMode(GL_PROJECTION);//select the projection matrix
glLoadIdentity();//reset the projection matrix
float whRatio=(GLfloat)width/(GLfloat)height;
if(bPersp)
float center[]={0,0,0};
//todo:hint:you may need another array when you operate the teapot
void key(unsigned char k,int x,int y)
{
switch(k)
{
case 27:
《计算机图形学》实验指导书
计算机图形学实验指导书袁科计算机技术实验中心目录实验一实现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 曲线的绘制与显示。
计算机图形学 实验一:生成彩色立方体(含源代码)
实验一实验目的:生成彩色立方体实验代码://ColorCube1.javaimport java.applet.Applet; //可以插入htmlimport java.awt.BorderLayout; //窗口采用BorderLayout方式布局import com.sun.j3d.utils.applet.MainFrame; //applicationimport com.sun.j3d.utils.geometry.ColorCube;//调用生成ColorCube的Utility import com.sun.j3d.utils.geometry.Primitive;import com.sun.j3d.utils.universe.*; //观测位置的设置import javax.media.j3d.*; //核心类import javax.vecmath.*; //矢量计算import com.sun.j3d.utils.behaviors.mouse.*;public class ColorCube1 extends Applet {public BranchGroup createSceneGraph() {BranchGroup objRoot=new BranchGroup();//BranchGroup的一个对象objRoot(放置背景、灯光)BoundingSphere bounds=new BoundingSphere(newPoint3d(0.0,0.0,0.0),100.0);//有效范围TransformGroup objTrans=new TransformGroup();objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);objTrans.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);objRoot.addChild(objTrans);MouseRotate behavior = new MouseRotate();behavior.setTransformGroup(objTrans);objRoot.addChild(behavior);behavior.setSchedulingBounds(bounds);MouseZoom behavior2 = new MouseZoom();behavior2.setTransformGroup(objTrans);objRoot.addChild(behavior2);behavior2.setSchedulingBounds(bounds);MouseTranslate behavior3 = new MouseTranslate();behavior3.setTransformGroup(objTrans);objRoot.addChild(behavior3);behavior3.setSchedulingBounds(bounds);Color3f bgColor=new Color3f(0.0f,0.0f,0.0f);//背景颜色Background bg=new Background(bgColor);bg.setApplicationBounds(bounds);objRoot.addChild(bg);Color3f directionalColor=new Color3f(1.f,1.f,1.f);Vector3f vec=new Vector3f(1.f,1.f,-1.0f);DirectionalLight directionalLight=new DirectionalLight(directionalColor,vec);directionalLight.setInfluencingBounds(bounds);objRoot.addChild(directionalLight);Appearance app=new Appearance();//外观材质Material material=new Material();//圆锥颜色//material.setEmissiveColor(new Color3f(1.0f,1.0f,0.0f));material.setDiffuseColor(new Color3f(1.0f,1.0f,0.0f));//辐射光效果app.setMaterial(material);ColorCube cone=new ColorCube(0.2);objTrans.addChild(cone);//pile();return objRoot;}public ColorCube1() {setLayout(new BorderLayout());Canvas3D c=new Canvas3D(null);add("Center",c);BranchGroup scene=createSceneGraph();SimpleUniverse u=new SimpleUniverse(c);u.getViewingPlatform().setNominalViewingTransform();u.addBranchGraph(scene);}public static void main(String[] args) {new MainFrame(new ColorCube1(),400,300);}}运行截图:。
计算机图形学实验报告及代码
九、作业
课后习题
十、本章小结
在本章中,对计算机图形学的基本概念和研究内容进行了概述,对发展概况和应用领域进行了说明。
第2章计算机图形系统
一、教学目标
通过对本章的学习,要求熟悉计算机图形系统的组成/各种图形显示器、图形输入/输出设备。
二、教学要求
1、了解计算机图形系统的组成;
(5).计算机网络
计算机网络是指将上述四类计算机平台,或者其中某一类通过某种互联技术彼此连接,按照某种通信协议进行数据传输、数据共享、数据处理的多机工作环境。
它的特点是多种计算机相连,可以充分发挥各个机器的性能和特点,以达到很高的性能价格比。
网络图形系统要考虑的关键问题是网络服务器的性能,图形数据的通信、传输、共享以及图形资源的利用问题。
(3).中、小型计算机
一般在特定的部门、单位和应用领域中采用此类环境。它是大型信息系统建立的重要环境,这种环境中信息和数据的处理量是很大的,要求机器有极高的处理速度和极大的存储容量。
(4).大型机
以大型计算机为基础,具有容量庞大的存储器和极强的计算功能,大量的显示终端及
高精度、大幅面的硬拷贝设备。还往往拥有自行开发的、功能齐全的应用软件系统。例如,美国第三大汽车公司(CHRYSLER汽车公司)就拥有庞大的计算机系统来进行计算机辅助设计、实体造型、结构分析、运动模拟、工程和科学计算、项目管理、生产过程控制等。
1.1计算机图形学的研究内容
计算机图形表现形式
(1).线条式(线框架图)
用线段来表现图形,容易反映客观实体的内部结构,如各类工程技术中结构图的表示,机械设计中零件结构图及电路设计中的电路原理图等。具有面模型、色彩、浓淡和明暗层次效应,适合表现客观实体的外形或外貌,如汽车、飞机、轮船等的外形设计以及各种艺术品造型设计等。
09008406_实验二
计算机图形学实验报告二09008406陈怡东2010年11月23日星期二一、使用手册程序功能:生成了一个三维茶壶,并且设置了光照,和表面材质。
可以通过键盘上的按键来改变光源的位置,或者右击菜单中也有直接设置光源的位置的功能。
可以通过对茶壶的拾取和鼠标移动对视点进行变换,看到茶壶的不同表面。
可以通过右击菜单中的选项来改变茶壶的材质,或者直接用户自定义茶壶材质参数使用手册:打开程序后,1.通过键盘上的'w''s''a''d''q''e'键来改变光源的位置。
2.鼠标右键菜单, 可以改变材质属性, 或者手动输入材质属性3.右击菜单中的添加纹理贴图可以对球体进行贴图. (默认图片为该文件夹下的output.bmp)4.可以通过对茶壶的拾取和鼠标移动对视点进行变换,看到茶壶的不同表面。
5.右击菜单中可以直接指定用户需要的光源位置。
6.q键退出二、设计思路:a)光源.本实验没有做Init()函数来初始化,而是直接封装在myDisplay()函数中。
先开始对于光源的位置用GlLookAt初始化,而后在对'w''s'的响应中对y坐标改变0.1,在对'a''d'的响应中对x坐标改变0.1,在对'q''e'的响应中对z的坐标改变0.1。
还可以通过右击菜单中的“设置光源位置”直接对数组Light_PosType 赋值,从而能够设定光源位于任何位置的效果b)材质在myDisplay()中对材质附初始值。
对鼠标右键加入菜单, 对相应条目设置固定的材质属性以方便调用加入手动设置条目, 让用户可以从键盘输入材质属性.c)贴图先写 loadTexture() 函数, 把默认图片载入为默认贴图, 再响应右击菜单中的“增加纹理贴图”选项开启贴图功能 (2d), 并在要贴图时先调用loadTexture载入贴图后,再绘制要贴图的对象.注意:默认图片为 output.bmp问题:不太理解 OpenGL用什么方式在茶壶等曲面上完成贴图的。
计算机图形学opengl动画的实现源代码
实验目的:
在VC6.0的opengl的环境下,实现固定物体的连续变化,从而使简单动画得以实现。
实验思想:
由于是简单图形的变化过程,所以问题关键在于:
1、物体的位置变化如何实现,而位置变化在opengl中体现在坐标的变化中,因而设置坐标的每一步物体的位置变化情况是该问题的关键,此关键代码如下:
wAngleX += 1.0f;
wAngleY += 10.0f;
wAngleZ += 5.0f;
2、再有就是如何使得连续的变化得以实现,这就实现了手动变化相自动变化的转变,为了实现这一问题,我们想到设置一个变化时间,使得物体在每个时间段变换一次位置,当这个时间适当小时,就实现了物体的连续变化;这就需要引进一个计时器,通过设置间隔时间实现物体的连续变化,此关键代码如下:
SetTimer(1, 150, NULL);
实验步骤:
1、初始化OpenGL。
2、设置菜单与关联函数初始化,设置视口与窗口匹配,重新设置坐标系统。
3、建立正交变换下的剪切体(即变换物体)。
4、编写变换幅度函数,设置没不变换情况。
5、编写连续变换计时器,使得在一定间隔下连续变换。
实验关键代码:
实验结果:。
计算机图形学实验内容
计算机图形学实验内容计算机图形学实验肖加清实验一图形学实验基础一、实验目的(1)掌握VC++绘图的一般步骤;(2)掌握OpenGL软件包的安装方法;(3)掌握OpenGL绘图的一般步骤;(4)掌握OpenGL的主要功能与基本语法。
二、实验内容1、VC++绘图实验(1)实验内容:以下是绘制金刚石图案。
已给出VC++参考程序,但里面有部分错误,请改正,实现以下图案。
N=3N=4N=5N=10CP2();virtual ~CP2();CP2(double,double);double x;double y;};CP2::CP2(){this->x=0.0;this->y=0.0;}CP2::~CP2(){}CP2::CP2(double x0,double y0) {this->x=x0;this->y=y0;}//视图类的一个成员函数,这个成员函数可以放在OnDraw函数里调用。
//在视图类的头文件(.h)里定义此函数void Diamond();//在视图类的实现文件(.cpp)里实现此函数void CTestView::Diamond(){CP2 *P;int N;double R;R=300;N=10;P=new CP2[N];CClientDC dc(this);CRect Rect;GetClientRect(&Rect);double theta;theta=2*PI/N;for(int i=0;i<N;i++){P[i].x=R*cos(i*theta);P[i].y=R*sin(i*theta);}for(i=0;i<=N-2;i++){for(int j=i+1;j<=N-1;j++){//其中ROUND函数需要自己实现,实现四舍五入的功能。
dc.MoveTo(ROUND(P[i].x+Rect.right/2),RO UND(P[i].y+Rect.bottom/2));dc.LineTo(ROUND(P[j].x+Rect.right/2),RO UND(P[j].y+Rect.bottom/2));}}delete []P;}2、OpenGL绘图(1)以下是用OpenGL绘制茶壶的代码,请在OpenGL环境下运行,分析OpenGL程序的结构#include <windows.h>#include <GL/gl.h>#include <GL/glu.h>#include <GL/glaux.h>//定义输出窗口的大小#define WINDOW_HEIGHT 300#define WINDOW_WIDTH 500//用户初始化函数void myninit(void);//窗口大小变化时的回调函数void CALLBACK myReshape(GLsizei w,GLsizei h);//每帧OpenGL都会调用这个函数,应该把显示代码放在这个函数中void CALLBACK display(void);int window_width=WINDOW_WIDTH;int window_height=WINDOW_HEIGHT;//视点离物体的距离float distance=3.6f;//初始化,此时为空,可以在这里进行初始化操作void myinit(void){}void CALLBACK display(void){//设置清屏的颜色,并清屏和深度缓冲glClearColor(0.0f,0.0f,0.0f,0.0f);glClear(GL_COLOR_BUFFER_BIT|GL_ DEPTH_BUFFER_BIT);//设置成模型矩阵模式glMatrixMode(GL_MODELVIEW);//载入单位化矩阵glLoadIdentity();//坐标中心向Z轴平移-distance,这样使坐标中心位于视点前方glTranslatef(0.0,0.0,-distance);//在坐标中心显示一个茶壶auxWireTeapot(1.0);//等待现有的OpenGL命令执行完成glFlush();//交换前后缓冲区auxSwapBuffers();}void CALLBACK myReshape(GLsizei w,GLsizei h){if(!h) return ;//这定视区glViewport(0,0,w,h);//设定透视方式glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60.0,1.0*(GLfloat)w/(GLflo at)h,1.0,30.0);window_width=w;window_height=h;}//移近移远的回调函数void CALLBACK MoveNear(void){distance-=0.3f;}void CALLBACK MoveFar(void){distance +=0.3f;}//主函数int main(int argc,char **argv){//初始化OpenGL的显示方式auxInitDisplayMode(AUX_DOUBLE|AUX _RGB|AUX_DEPTH16);//设定OpenGL窗口位置和大小auxInitPosition(0,0,WINDOW_WIDTH,W INDOW_HEIGHT);//打开窗口auxInitWindow("OpenGL的一个简单的例子!");//调用初始化函数myinit();//设定窗口大小变化的回调函数auxReshapeFunc(myReshape);//设定移动视点的回调函数auxKeyFunc('A',MoveNear); //按A键变大auxKeyFunc('a',MoveFar); //按a键变小//使display函数一直被调用auxIdleFunc(display);//开始OpenGL的循环auxMainLoop(display);//结束程序return (0);}其运行结果如图所示:(2)OPENGL绘制矩形的简单例子参考程序:#include <gl/glut.h>void Initial(void){glClearColor(1.0f, 1.0f, 1.0f, 1.0f); //设置窗口背景颜色为白色glMatrixMode(GL_PROJECTION);//设置投影参数gluOrtho2D(0.0,200.0,0.0,150.0);}void Display(void){glClear(GL_COLOR_BUFFER_BIT); //用当前背景色填充窗口glColor3f(1.0f, 0.0f, 0.0f); //设置当前的绘图颜色为红色glRectf(50.0f, 100.0f, 150.0f, 50.0f); //绘制一个矩形glFlush(); //处理所有的OpenGL程序}int main(int argc, char* argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(400,300);//设置窗口的尺寸glutInitWindowPosition(100,120);//设置窗口的位置glutCreateWindow("矩形"); //创建一个名为矩形的窗口glutDisplayFunc(Display);//设置当前窗口的显示回调函数Initial();//完成窗口初始化glutMainLoop();//启动主GLUT事件处理循环return 0;}三、实验结果分析实验二直线生成算法与用户接口与交互式技术一、实验目的1、掌握直线生成算法(1)DDA算法(2)Bresenham算法2、掌握交互式技术(1)鼠标(2)键盘数字键、字母键、功能键和特殊键3、实现拾取操作二、实验内容1、以下给出了DDA算法的C++代码,请参考用Visual C++实现Bresenham算法。
《计算机图形学》课内实验报告(实验一)
PFNGLUNIFORM1FARBPROC glUniform1fARB;
PFNGLGETUNIFORMLOCATIONARBPROC glGetUniformLocationARB;
#ifndef __APPLE__
PFNGLSECONDARYCOLOR3FPROC glSecondaryColor3f;
{
GLbyte infoLog[MAX_INFO_LOG_SIZE];
glGetInfoLogARB(progObj, MAX_INFO_LOG_SIZE, NULL, infoLog);
fprintf(stderr, "Error in program linkage!\n");
fprintf(stderr, "Info log: %s\n", infoLog);
// Demonstrates high-level shaders
// Program by Benjamin Lipchak
#include "../../Common/OpenGLSB.h" // System and OpenGL Stuff
#include "../../Common/GLTools.h" // System and OpenGL Stuff
// Initially set the blink parameter to 1 (no flicker)
if (flickerLocation != -1)
glUniform1fARB(flickerLocation,1.0f);
// Program object has changed, so we should revalidate
课程代码04644考试大纲
广东省高等教育自学考试计算机图形学课程(课程代码:04644)考试大纲目录一、课程性质与设置目的二、课程内容与考核目标第一章计算机图形学概述第一节计算机图形学的发展概况第二节计算机图形学的主要应用领域第三节计算机图形学与计算机辅助设计(CAD)第四节计算机图形系统第二章绘图基础第一节GDI+概述第二节绘图基础第三节绘图方法第三章基本图形、图案设计第一节基本图形设计第二节圆弧连接程序设计第四章图形变换及图形设计第一节二维图形变换第二节三维图形变换第四节轴测投影变换第五节透视投影变换第六节凸平面立体隐藏线的消除第五章曲线的程序设计第一节平面曲线第二节三次样条曲线第三节Bezier曲线第四节B样条曲线第六章曲面程序设计第一节常见曲面第七章图像处理第一节位图图像文件及操作第二节位图图像的处理技术第八章动画技术第一节动画技术基础第二节动画技术的实现方法第三节动画综合实例第四节综合实例源代码第九章用交开发互式CAD系统第一节交互式CAD系统的总体设计第二节图元的选择与删除第四节添加绘图辅助工具三、关于大纲的说明与考核实施要求【附录】题型举例一、课程性质与设置目的(一)课程性质与特点本课程是广东省高等教育自学考试数字媒体艺术专业(独立本科段)的必考课程之一,本课程是数字媒体艺术专业的应用型专业课。
目的通过学习本课程,培养学生掌握图形学基本概念、原理和方法,掌握用绘制图形程序的能力,通过图形学理论和程序编写实践,提高学生对图形学的理解,使学生能使用的编制图形软件。
(二)本课程的基本要求通过本课程学习,要求学生认识编制绘图程序的特点,了解图形学基本原理和方法,掌握编写图形程序的方法和流程。
1、了解绘图基础;2、掌握基本图形设计和常用图形算法;3、了解曲线、曲面的表达方法和绘图技术;4、掌握图形的二/三维几何变换;5、掌握绘制动画的方法;(三)本课程与相关课程的联系本课程是一门与《Visual Basic程序设计》、《多媒体应用技术》、《计算机三维绘图》、《计算机辅助工业设计》等多种课程相关的课程。
计算机图形学实验报告代码
计算机图形学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。
计算机图形学实验C++代码
一、bresenham算法画直线#include<glut.h>#include<math.h>#include<stdio.h>void draw_pixel(int ix,int iy){glBegin(GL_POINTS);glVertex2i(ix,iy);glEnd();}void Bresenham(int x1,int y1,int xEnd,int yEnd) {int dx=abs(xEnd-x1),dy=abs(yEnd-y1);int p=2*dy-dx;int twoDy=2*dy,twoDyMinusDx=2*dy-2*dx;int x,y;if (x1>xEnd){x=xEnd;y=yEnd;xEnd=x1;}else{x=x1;y=y1;}draw_pixel(x,y);while(x<xEnd){x++;if(p<0)p+=twoDy;else{y++;p+=twoDyMinusDx;draw_pixel(x,y);}}}void display(){glClear(GL_COLOR_BUFFER_BIT);Bresenham(0,0,400,400);glFlush();}void myinit(){glClearColor(0.8,1.0,1.0,1.0);glColor3f(0.0,0.0,1.0);glPointSize(1.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,500.0,0.0,500.0);}void main(int argc,char **argv ){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(500,500);glutInitWindowPosition(200.0,200.0);glutCreateWindow("CG_test_Bresenham_Line example");glutDisplayFunc(display);myinit();glutMainLoop();}二、中点法绘制椭圆#include<glut.h>#include<math.h>#include<stdio.h>inline int round(const float a){return int (a+0.5);}void setPixel(GLint xCoord,GLint yCoord){glBegin(GL_POINTS);glVertex2i(xCoord,yCoord);glEnd();}void ellipseMidpoint(int xCenter,int yCenter,int Rx,int Ry) {int Rx2=Rx*Rx;int Ry2=Ry*Ry;int twoRx2=2*Rx2;int twoRy2=2*Ry2;int p;int x=0;int y=Ry;int px=0;int py=twoRx2*y;void ellipsePlotPoints(int,int,int,int);ellipsePlotPoints(xCenter,yCenter,x,y);p=round(Ry2-(Rx2*Ry)+(0.25*Rx2));while(px<py){x++;px+=twoRy2;if(p<0)p+=Ry2+px;else{y--;py-=twoRx2;p+=Ry2+px-py;}ellipsePlotPoints(xCenter,yCenter,x,y);}p=round(Ry2*(x+0.5)*(x+0.5)+Rx2*(y-1)*(y-1)-Rx2*Ry2);while(y>0){y--;py-=twoRx2;if(p>0)p+=Rx2-py;else{x++;px+=twoRy2;p+=Rx2-py+px;}ellipsePlotPoints(xCenter,yCenter,x,y);}}void ellipsePlotPoints(int xCenter,int yCenter,int x,int y) {setPixel(xCenter+x,yCenter+y);setPixel(xCenter-x,yCenter+y);setPixel(xCenter+x,yCenter-y);setPixel(xCenter-x,yCenter-y);}void display(){glClear(GL_COLOR_BUFFER_BIT);ellipseMidpoint(200,200,50,30);glFlush();}void myinit(){glClearColor(0.8,1.0,1.0,1.0);glColor3f(0.0,0.0,1.0);glPointSize(1.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,300.0,0.0,300.0);}void main(int argc,char **argv ){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(300,300);glutInitWindowPosition(200.0,200.0);glutCreateWindow("circleMId example");glutDisplayFunc(display);myinit();glutMainLoop();}三、抛物线#include<glut.h>#include<math.h>#include<stdio.h>inline int round(const float a){return int (a+0.5);}void setPixel(GLint xCoord,GLint yCoord){glBegin(GL_POINTS);glVertex2i(xCoord,yCoord);glEnd();}void ellipseMidpoint(int xCenter,int yCenter,int a,int b){int p;int x=xCenter;int y=yCenter;int px=0,py=0;void ellipsePlotPoints(int,int,int,int);ellipsePlotPoints(xCenter,yCenter,px,py);p=yCenter+a*(x+1-xCenter)*(x+1-xCenter)+b*(x+1-xCenter)-y-0.5;do{if(p<0){x=x+1;y=y;p=yCenter+a*(x+1-xCenter)*(x+1-xCenter)+b*(x+1-xCenter)-y-0.5;}else{x=x+1;y=y-1;p=yCenter+a*(x+1-xCenter)*(x+1-xCenter)+b*(x+1-xCenter)-y-0.5;}px=x-xCenter;py=y-yCenter;ellipsePlotPoints(xCenter,yCenter,px,py);}while(px<py);for(;;){if(p<0){x=x-1;y=y+1;p=yCenter+a*(x+0.5-xCenter)*(x+0.5-xCenter)+b*(x+0.5-xCenter)-y-1;}else{x=x;y=y+1;p=yCenter+a*(x+0.5-xCenter)*(x+0.5-xCenter)+b*(x+0.5-xCenter)-y-1;}px=x-xCenter;py=y-yCenter;ellipsePlotPoints(xCenter,yCenter,px,py);};}void ellipsePlotPoints(int xCenter,int yCenter,int x,int y){setPixel(xCenter+x,yCenter+y);setPixel(xCenter-x,yCenter+y);}void display(){glClear(GL_COLOR_BUFFER_BIT);ellipseMidpoint(150,150,1,0);glFlush();}void myinit(){glClearColor(0.8,1.0,1.0,1.0);glColor3f(0.0,0.0,1.0);glPointSize(1.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,300.0,0.0,300.0);}void main(int argc,char **argv ){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(500,500);glutInitWindowPosition(200.0,200.0);glutCreateWindow("circleMId example");glutDisplayFunc(display);myinit();glutMainLoop();}四、基本图元输出#include<glut.h>#include<math.h>#include<stdio.h>void Polygon(int*p1,int*p2,int*p3,int*p4,int*p5,int*p6) {glBegin(GL_POLYGON);glVertex2iv(p1);glVertex2iv(p2);glVertex2iv(p3);glVertex2iv(p4);glVertex2iv(p5);glVertex2iv(p6);glEnd();}void Triangles(int*p1,int*p2,int*p3,int*p4,int*p5,int*p6) {glBegin(GL_TRIANGLES);glVertex2iv(p1);glVertex2iv(p2);glVertex2iv(p6);glVertex2iv(p3);glVertex2iv(p4);glVertex2iv(p5);glEnd();}void Trianglefan(int*p1,int*p2,int*p3,int*p4,int*p5,int*p6) {glBegin(GL_TRIANGLE_FAN);glVertex2iv(p1);glVertex2iv(p2);glVertex2iv(p3);glVertex2iv(p4);glVertex2iv(p5);glVertex2iv(p6);glEnd();}void Trianglestrip(int*p1,int*p2,int*p3,int*p4,int*p5,int*p6) {glBegin(GL_TRIANGLE_STRIP);glVertex2iv(p1);glVertex2iv(p2);glVertex2iv(p6);glVertex2iv(p3);glVertex2iv(p5);glVertex2iv(p4);glEnd();}void glRect_s(GLint a,GLint b,GLint c,GLint d){glRecti(a,b,c,d);}void display(){int p1[]={60,170};int p2[]={100,100};int p3[]={180,100};int p4[]={220,170};int p5[]={180,240};int p6[]={100,240};int p7[]={60,100};glClear(GL_COLOR_BUFFER_BIT);//Triangles(p1,p2,p3,p4,p5,p6);//Polygon(p1,p2,p3,p4,p5,p6);//glRect_s(160,30,10,100);Trianglestrip(p1,p2,p3,p4,p5,p6);//Trianglefan(p1,p2,p3,p4,p5,p6);glFlush();}void myinit(){glClearColor(0.8,1.0,1.0,1.0);glColor3f(0.0,0.0,1.0);glPointSize(1.0);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,300.0,0.0,300.0);}void main(int argc,char **argv ){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowSize(500,500);glutInitWindowPosition(300.0,300.0);glutCreateWindow("circleMId example");glutDisplayFunc(display);myinit();glutMainLoop();}五、区域填充#include"glut.h"#include"windows.h"const int POINTNUM=7; //多边形点数.//定义结构体用于活性边表AET和新边表NETtypedef struct XET{float x;float dx,ymax;XET* next;}AET,NET;//定义点结构体pointstruct point{float x;float y;}polypoint[POINTNUM]={250,50,350,150,50,40,250,20,200,30,100,100,10,300};//多边形顶点void PolyScan(){//计算最高点的y坐标(扫描到此结束)int MaxY=0;int i;for(i=0;i<POINTNUM;i++)if(polypoint[i].y>MaxY)MaxY=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;}glClear(GL_COLOR_BUFFER_BIT); //赋值的窗口显示.glColor3f(0.9,1.0,0.0); //设置直线的颜色红色glBegin(GL_POINTS);//扫描并建立NET表,注:构建一个图形for(i=0;i<=MaxY;i++){for(int j=0;j<POINTNUM;j++)if(polypoint[j].y==i){ //一个点跟前面的一个点形成一条线段,跟后面的点也形成线段if(polypoint[(j-1+POINTNUM)%POINTNUM].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;}if(polypoint[(j+1+POINTNUM)%POINTNUM].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;}}}for(i=0;i<=MaxY;i++){//计算新的交点x,更新AETNET *p=pAET->next;while(p){p->x=p->x + p->dx;p=p->next;}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(float j=p->x;j<=p->next->x;j++)glVertex2i(static_cast<int>(j),i);p=p->next->next;//考虑端点情况}}glEnd();glFlush();}void init(void){glClearColor(1.0,1.0,1.0,0.0);//窗口的背景颜色设置为白色glMatrixMode(GL_PROJECTION);gluOrtho2D(0.0,600.0,0.0,450.0);}void lineSegment(void){glClear(GL_COLOR_BUFFER_BIT); //赋值的窗口显示.glColor3f(0.0,1.0,0.0); //设置直线的颜色红色glBegin(GL_LINES);glVertex2i(180,15); //Specify line-segment geometry.glVertex2i(10,145);glEnd();glFlush(); //Process all OpenGL routines as quickly as possible.}void main(int argc,char* argv){glutInit(&argc,&argv); //I初始化GLUT.glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //设置显示模式:单个缓存和使用RGB模型glutInitWindowPosition(50,100); //设置窗口的顶部和左边位置glutInitWindowSize(400,300); //设置窗口的高度和宽度glutCreateWindow("扫描线填充算法"); //创建显示窗口init(); //调用初始化过程glutDisplayFunc(PolyScan); //图形的定义传递glutMainLoop(); //显示所有的图形并等待}11。
计算机图形学实验报告
ON_WM_CREATE()
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
static UINT indicators[] =
{
ID_SEPARATOR, // status line indicator
pView->m_ClearColorRed = (float)GetRValue(pApp->m_OptionColorGlBack) /255.0f;
pView->m_ClearColorGreen = (float)GetGValue(pApp->m_OptionColorGlBack) /255.0f;
ID_INDICATOR_CAPS,
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
};
// CMainFrame construction/destruction
CMainFrame::CMainFrame()
{
}
CMainFrame::~CMainFrame()
{
}
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CFormCommandView, CFormView)
//{{AFX_MSG_MAP(CFormCommandView)
ON_WM_PAINT()
ON_WM_LBUTTONUP()
ON_BN_CLICKED(IDC_RADIO_MODEL_1, OnRadioModel1)
(完整word版)计算机图形学实验报告一(word文档良心出品)
《计算机图形学》实验报告//圆pDC->SelectObject(&pen2);pDC->Ellipse(50,120,150,220);pDC->SelectObject(&pOldBrush);//椭圆pDC->SelectObject(&pen2);pDC->Ellipse(600, 100, 1025, 325);pDC->SelectObject(&pOldBrush);//多边形pDC->SelectObject(&pen2);pDC->SelectObject(&pen2);CPoint lpPoint[5];lpPoint[0] = CPoint(200,200);lpPoint[1] = CPoint(100, 300);lpPoint[2] = CPoint(150, 400);lpPoint[3] = CPoint(250, 400);lpPoint[4] = CPoint(300, 300);pDC->Polygon(lpPoint,5);//圆弧pDC->SelectObject(&pen2);pDC->SelectObject(&pen2);pDC->Arc(450,200,650,550,50,50,600,900);2、练习使用GDI函数显示图像glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);glutInitWindowSize(1000, 1000);glutInitWindowPosition(0, 0);glutCreateWindow("实验一");glutDisplayFunc(&display);glutMainLoop();}茶壶void display(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glColor3f(0.0, 1.0, 0.0);//绿色绘制glEnable(GL_DEPTH_TEST);//深度缓冲区glutWireTeapot(2);//绘制茶壶glFlush();glutSwapBuffers();}void reshape(int w, int h){glViewport(0, 0, w, h); //设置视口glMatrixMode(GL_PROJECTION); //将当前矩阵指定为投影模式glLoadIdentity();gluPerspective(60, (GLfloat)w / (GLfloat)h, 1.0, 20); //创建透视投影矩阵glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0, 5, 5, 0, 0, 0, 0, 1, 0);//观测点}球void display(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glColor3f(0.0, 1.0, 0.0);//绿色绘制glEnable(GL_DEPTH_TEST);//深度缓冲区glutWireSphere(1, 20, 16);//绘制球体glFlush();glutSwapBuffers();}void reshape(int w, int h){glViewport(0, 0, w, h); //设置视口glMatrixMode(GL_PROJECTION); //将当前矩阵指定为投影模式glLoadIdentity();gluPerspective(60, (GLfloat)w / (GLfloat)h, 1.0, 20); //创建透视投影矩阵glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt(0, 3, 3, 0, 0, 0, 1, 1, 0);//观测点}六面体void display(void)。
计算机图形学实验报告三
《计算机图形学》实验报告glClear(GL_COLOR_BUFFER_BIT);//glEnable(GL_SCISSOR_TEST);//glScissor(0.0f,0.0f,500,300);glutWireTeapot(0.4);glFlush();}//窗口调整子程序void myReshape(int w, int h){glViewport(500, -300, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if (w <= h)glOrtho(-1, 1, -(float)h / w, (float)h / w, -1, 1);elseglOrtho(-(float)w / h, (float)w / h, -1, 1, -1, 0.5);}2,使用opengl函数写一个图形程序,要求分别使用三个光源从一个茶壶的前右上方(偏红色),正左侧(偏绿色)和前左下方(偏蓝色)对于其进行照射,完成程序并观察效果。
}//绘图子程序void display(void){glColor3f(1.0, 1.0, 0.0);glClear(GL_COLOR_BUFFER_BIT);//glMatrixMode(GL_MODELVIEW);//glLoadIdentity();//设置光源的属性1GLfloat LightAmbient1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; //环境光参数 ( 新增 )GLfloat LightDiffuse1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 漫射光参数 ( 新增 )GLfloat Lightspecular1[] = { 1.0f, 0.0f, 0.0f, 1.0f }; // 镜面反射GLfloat LightPosition1[] = { 500.0f, 500.0f, 500.0f, 1.0f }; // 光源位置 ( 新增 ) glLightfv(GL_LIGHT0, GL_POSITION, LightPosition1);glViewport(0, 0, (GLsizei)w, (GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();3,使用opengl函数完成一个图形动画程序,显示一个球沿正弦曲线运动的过程,同时显示一个立方体沿抛物线运动过程。
《计算机图形学》实验2实验报告
《计算机图形学》实验2实验报告《计算机图形学》实验2实验报告实验题目:多视图绘图程序实验内容:掌握多视图绘图的概念,掌握二维统计图的绘制方法。
调用实验1中自己编写的基本包,绘制自己所设计的统计图形(饼图、直方图以及折线)。
编写程序调用验证之。
基本概念:(详细叙述自己对实验内容的理解)多视图:就是将多个绘制好的图形按照一定的规则组成一个具有特定意义的图形,在同一个视图中显示出来,如下面绘制的几种统计图形(饼图、直方图以及折线)。
饼图:可以清楚的表示出各个部分所占的比例;直方图:可以清楚地的显示各部分的数量的多少;折线:可以清楚地反应各个部分的变化趋势。
算法设计:(详细叙述自己设计的多视图统计图以及程序的功能、算法及实现)public abstract void drawLine(int x1, int y1, int x2, int y2)使用当前颜色,在点(x1, y1) 和(x2, y2) 之间画线。
public abstract void drawOval(int x, int y, int width, int height) 画椭圆。
public abstract void fillOval(int x, int y, int width, int height)画实心椭圆。
public abstract void drawPolygon(int[] xPoints, int[] yPoints, int nPoints)画x和y坐标定义的多边形。
public void drawRect(int x, int y, int width, int height)画矩形。
public void drawRect(int x, int y, int width, int height)画实心矩形。
public abstract void drawRoundRect(int x, int y, int width, intheight, int arcWidth, int arcHeight) 使用当前颜色画圆角矩形。
实验一简单图形绘制cpp
实验一简单图形绘制一.实现绘制茶壶的程序二.绘制六角星图形坐标:(-0.4,0.3)(-0.4,-0.3)(0,-0.5)(0.4,-0.3)(0.4,0.3)(0,0.5)要求不同点用不同颜色,尝试不同线宽,尝试多种绘制方法#include <stdlib.h>#include "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.9, 0.95, 0.5, 1.0};GLfloat specular[] = {1.0, 1.0, 1.0, 1.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.75f, 0.75f, 0.75f, 1.0f);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//glPointSize(6.0); //设置点大小,默认值为1.0/* //绘点glBegin(GL_POINTS);glVertex3f(-0.7f, 0.7f, 0.0f);glVertex3f(-0.5f, 0.5f, 0.0f);glVertex3f(-0.7f, 0.5f, 0.0f);glEnd();//绘线段(两顶点构成)glBegin(GL_LINES);glVertex3f(-0.3f, 0.9f, 0.0f);glVertex3f(0.0f, 0.8f, 0.0f);glVertex3f(-0.7f, 0.5f, 0.0f);glEnd();glLineWidth(4.0); //设置线宽,默认值为1.0 //绘折线(每个顶点都。
关于OPenGL一个茶壶的实现
关于OPenGL⼀个茶壶的实现实验过程现读取⼀个外部⽂件数据,根据读取⽚⾯,每个⽚⾯16*16的,⼀共是32个平⾯⼀次循环接受,数据的前32个是⽚⾯好:#include"windows.h"#include#include#include#include"glut.h"#include#include///////////////////////////////#pragma comment(lib, "openGL32.lib")#pragma comment(lib, "glu32.lib")#pragma comment(lib, "glaux.lib")#pragma comment(lib, "glut32.lib")//////////////////////////*****************************float m_Eye[3] = {1000.0, 1000.0, 1000.0};float m_scale = 100.0;int m_width, m_height;int plantnum[500][16];int Number;float pointnum[500][3];int count;unsigned int texture[4];void myDisplay(void){//清除缓冲区glClearColor(0.0, 0.0, 0.0, 0.0);glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);glEnable(GL_DEPTH_TEST);//设置视⼝glViewport(0,0,m_width,m_height); // Reset The Current Viewport//设置观察体glMatrixMode(GL_PROJECTION); // Select The Projection MatrixglLoadIdentity(); // Reset The Projection Matrix//gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);glOrtho(-m_width/m_scale, m_width/m_scale, -m_height/m_scale, m_height/m_scale, 0, 10000);//设置视点glMatrixMode(GL_MODELVIEW); // Select The Modelview MatrixglLoadIdentity(); // Reset The Modelview MatrixgluLookAt(m_Eye[0], m_Eye[1], m_Eye[2], 0.0, 0.0, 0.0, -m_Eye[0]*m_Eye[2], -m_Eye[1]*m_Eye[2],m_Eye[0]*m_Eye[0]+m_Eye[1]*m_Eye[1]);//设置光源glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);//GLfloat light_ambient[] = {0.2f, 0.2f, 0.2f, 0.0f};GLfloat light_diffuse[] = {0.5f, 0.5f, 0.5f, 1.0f};//GLfloat light_specular[] = {0.2f, 0.2f, 0.2f, 1.0f};//glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);//glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);//glLightf(GL_LIGHT0, GL_SHININESS, 50.0);GLfloat light_position[] = {1.0, 0.0, 0.0, 0.0};glLightfv(GL_LIGHT0, GL_POSITION, light_position);GLfloat light_global[] = {0.5f, 0.5f, 0.5f, 0.0f};glLightModelfv(GL_LIGHT_MODEL_AMBIENT, light_global);GLfloat light_ambient[] = {1, 0, 0, 0};glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);//设置景物的⼀些基本属性glFrontFace(GL_CW);//glCullFace(GL_BACK);//glEnable(GL_CULL_FACE);glPolygonMode(GL_FRONT, GL_FILL);glShadeModel(GL_SMOOTH);glEnable(GL_NORMALIZE);glEnable(GL_AUTO_NORMAL);glEnable(GL_MAP2_VERTEX_3);//glShadeModel(GL_GOURAUD);// glDisable(GL_TEXTURE_2D);GLfloat mat_ambient_0[] = {0.0, 1.0, 0.0, 1.0};glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient_0); //墙壁的材料颜⾊glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, texture[0]);float ctrlp[16][3];int a=0,c;// printf("\n");do{for (int i=0;i<16;i++){c=plantnum[a][i];ctrlp[i][0]=pointnum[c][0];ctrlp[i][1]=pointnum[c][1];ctrlp[i][2]=pointnum[c][2];}glMap2f(GL_MAP2_VERTEX_3,0.0,1.0,3,4,0.0,1.0,12,4,&ctrlp[0][0]); glMapGrid2f(20,0.0,1.0,20,0.0,1.0);glEvalMesh2(GL_FILL,0,20,0,20);a++;} while (aglutSwapBuffers();}void myinit(void){FILE *fp=fopen("teapot","r");if(!fp) printf("file open error");int j=0,i=0;fscanf(fp,"%d",&Number);do{ for (int j=0;j<16;j++){fscanf(fp,"%d",&plantnum[i][j]);printf("%d\n",plantnum[i][j]);}i++;} while (i!=Number);printf("\n");printf("以下数据是point number:\n");i=1;fscanf(fp,"%d",&count);printf("%d\n",count);do{ for (int j=0;j<3;j++){fscanf(fp,"%f",&pointnum[i][j]);}printf("%f %f %f\n", pointnum[i][0], pointnum[i][1], pointnum[i][2]);i++;} while (i<=count);AUX_RGBImageRec *TextureImage[4]; // Create Storage Space For The Texturememset(TextureImage,0,sizeof(void *)*4);TextureImage[0]=auxDIBImageLoad("wall.bmp");glGenTextures(1, &texture[0]);glBindTexture(GL_TEXTURE_2D, texture[0]);glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);if (TextureImage[0]) // If Texture Exists{if (TextureImage[0]->data) // If Texture Image Exists{free(TextureImage[0]->data); // Free The Texture Image Memory}free(TextureImage[0]); // Free The Image Structure}}void myReshape(int w,int h){m_width = w;m_height = h;}void SpecialKey(int key, int x, int y){if(key == GLUT_KEY_UP){m_Eye[0] *= 0.9f;m_Eye[1] *= 0.9f;}if(key == GLUT_KEY_DOWN){m_Eye[0] /= 0.9f;m_Eye[1] /= 0.9f;}if(key == GLUT_KEY_LEFT){float ss = (float)sin(0.15);float cc = (float)cos(0.15);float a1 = m_Eye[0]*cc - m_Eye[1]*ss;float b1 = m_Eye[0]*ss + m_Eye[1]*cc;m_Eye[0] = a1;m_Eye[1] = b1;}if(key == GLUT_KEY_RIGHT){float ss = (float)sin(0.15);float cc = (float)cos(0.15);float a1 = m_Eye[0]*cc + m_Eye[1]*ss;float b1 = -m_Eye[0]*ss + m_Eye[1]*cc;m_Eye[0] = a1;m_Eye[1] = b1;}glutPostRedisplay();}void myMouseFunc(int button, int state, int x, int y){}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE); glutInitWindowPosition(100, 100);glutInitWindowSize(640, 480);glutCreateWindow("My GLUT Example");myinit();glutSpecialFunc(SpecialKey);glutMouseFunc(myMouseFunc);glutDisplayFunc(myDisplay);glutReshapeFunc(myReshape);glutMainLoop();return 0;}。
图形学茶壶设计代码
茶壶的生成1.配置环境:在编程之前需要加头文件.步骤:1.ylut.h复制到C:\program Files\Microsoft\visual studio\VC98\include\GL2.glut32.lib复制C: \program Files\Microsoft\visual studio\VC98\lib3.glut32.dlb复制C: \windows\system324.如何把lib库文件添加到项目中在原来的VC6开发环境中,点击菜单的project->setting,弹出项目属性对话框,然后点选link 选项卡,在里面的Object/Library Modules输入要加入的lib文件名即可。
2.程序代码:// chahu.cpp : author wangnina//studentnumber:201396052043 赵燕#include "stdafx.h"#include <stdlib.h>#include <GL/glut.h>static double speed= 18.0;void init() //初始化背景颜色,光照,材质等{glClearColor(0.9,0.9,1,1.0); //初始背景色/********* 光照处理 **********/GLfloat light_ambient[] = { 0.0, 0.0, 0.0, 1.0 };GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 };GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 };GLfloat light_position0[] = { 3.0, 1.0, 1.0 ,1.0 }; //定义光位置得齐次坐标(x,y,z,w),如果w=1.0,为定位光源(也叫点光源),//如果w=0,为定向光源(无限光源),定向光源为无穷远点,因而产生光为//平行光。
计算机图形_茶壶
《计算机图形学》作业报告题目:茶壶的旋转平移学院(部)信息学院专业班级:姓名:学号:程序功能绘制一个茶壶,并实现以下两种平移旋转操作1.X方向平移0.5个单位,再绕z轴旋转45度2.绕z轴旋转45度,再X方向平移0.5个单位程序运行截图1.先平移后旋转2.先旋转后平移核心代码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);//glTranslatef(0.5, 0.0, 0.0);//x平移0.5个单位glRotatef(45.0f, 0.0, 0.0, 1.0);//绕z轴旋转45度glTranslatef(0.5, 0.0, 0.0);glMatrixMode(GL_MODELVIEW);//double mat[16];//glMultMatrix(mat);}实际矩阵运算过程一:先平移后旋转(1).平移变换矩阵1 0 0 0.5T= 0 1 0 00 0 1 00 0 0 1(2).旋转变换矩阵cosn -sinn 0 0R= sinncosn 0 00 0 1 00 0 0 1则坐标关系式(n=45)X 1 0 0 0 1 -1 0 0.5Y (4阶矩阵) =T*R* 0 1 0 0 = 1 1 0 0 Z0 0 1 0 0 0 1 01 0 0 0 1 0 0 0 1二:先旋转后平移(1).旋转变换矩阵cosn -sinn 0 0R= sinncosn 0 00 0 1 00 0 0 1(2).平移变换矩阵1 0 0 0.5T= 0 1 0 00 0 1 00 0 0 1则坐标关系式X 1 0 0 0 1 -1 0 0.5Y =T*R* 0 1 0 0 = 1 1 0 0.5Z 0 0 1 0 0 0 1 01 0 0 0 1 0 0 0 1全局坐标系与局部坐标系理解全局坐标系是三维空间物体所在的坐标系,模型的顶点坐标就是基于这个坐标系来表达的。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//todo when 'p'operation ,hint:use function glupersPective
}
else
glOrtho(-3,3,-3,3,-100,100);
glMatrixMode(GL_MODELVIEW);//select the modelview matrix
}
void reshape(int width,int height)
case 'k':{ty--;break;}
case 'n':{tz++;break;}
case 'm':{tz--;ty--;break;}
case 'g':{sx=sy=sz=sx+0.05;break;}//放大
case 'f':{sx=sy=sz=sx-0.05;break;}//缩小
}
}
void redraw()
if(bWire)
{
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
}
else
{
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
}
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
GLfloat white[]={1.0,1.0,1.0,1.0};
float sy=0.3f;
float sz=0.3f;
void Draw_Scene()
{
glPushMatrix();
glTranslatef(0,0,5);
glRotatef(tangle,tx,ty,tz);
// glutSolidTeapot(1);
glutSolidSphere(1.0f,10,10);
bool bPersp=false;
bool bAnim=false;
bool bWire=false;
int wHeight=0;
int wWidth=0;
//todo
//hint:some additional parameters may needed here when you operate the teapot
case 'p':{bPersp=!bPersp;updateView(wHeight,wWidth);break;}
case ' ':{bAnim=!bAnim;break;}
case 'o':{bWire=!bWire;break;}
case 'a':{center[0]=center[0]+1;break;}//todo ,hint:eye[]and center[]are the keys to solve the problems
GLfloat light_pos[]={5,5,5,1};
glLightfv(GL_LIGHT0,GL_POSITION,light_pos);
glLightfv(GL_LIGHT0,GL_AMBIENT,white);
glEnable(GL_LIGHT0);
glRotatef(fRotate,0,0,1.0f);//ratate around y axis
case 'd':{center[0]=center[0]-1;break;}
case 'w':{center[2]=center[2]+1;break;}
case 's':{center[2]=center[2]-1;break;}
case 'z':{center[1]=center[1]+1;break;}
//leg4
glPushMatrix();
glTranslatef(-1.5,-1,1.5);
Draw_Leg();
glPopMatrix();
}
void updateView(int width,int height)
{
glViewport(0,0,width,height);//reset the current viewport
glRotatef(-90,1,0,0);
glScalef(sx,sy,sz);
Draw_Scene();
if(bAnim)
fRotate+=0.3f;
//todo hint:when you want to rotate the teepot you may like to add another line here =
{
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
gluLookAt(eye[0],eye[1],eye[2],center[0],center[1],center[2],0,1,0);//场景(0,0,0)扥视点中心(0,5,50)Y轴向上
glutSwapBuffers();
}
int main(int argc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_RGBA|GLUT_DEPTH|GLUT_DOUBLE);
glutInitWindowSize(480,480);
void Draw_Leg()
{
glScalef(1,1,3);
glutSolidCube(1.0f);
//glutWireCone(1.0f);
}
//定义操作茶壶的操作参数
int tx=1;
int ty=0;
int tz=0;
int tangle=90;
//定义设置scale的参数
float sx=0.3f;
{
if(height==0)//prevent a divide by zero by
{
height=1;
}
wHeight=height;
wWidth=width;
updateView(wHeight,wWidth);
}
void idle()
{
glutPostRedisplay();
}
float eye[]={0,0,8};
#include<windows.h>
#include<gl/glut.h>
#include<gl/gl.h>
using namespace std;
float fTranslate;
float fRotate;
float fScale=1.0f;//set inital scale value to 1.0f
int windowHandle=glutCreateWindow("Simple GLUT App");
glutDisplaunc(reshape);
glutKeyboardFunc(key);
glutIdleFunc(idle);
glutMainLoop();
return 0;
}
glMatrixMode(GL_PROJECTION);//select the projection matrix
glLoadIdentity();//reset the projection matrix
float whRatio=(GLfloat)width/(GLfloat)height;
if(bPersp)
glPopMatrix();
//leg2
glPushMatrix();
glTranslatef(-1.5,1,1.5);
Draw_Leg();
glPopMatrix();
//leg3
glPushMatrix();
glTranslatef(1.5,-1,1.5);
Draw_Leg();
glPopMatrix();
glPopMatrix();
glPushMatrix();
glTranslatef(0,0,3.5);
glScalef(5,4,1);
glutSolidCube(1.0);
glPopMatrix();
//leg1
glPushMatrix();
glTranslatef(1.5,1,1.5);
Draw_Leg();
float center[]={0,0,0};
//todo:hint:you may need another array when you operate the teapot
void key(unsigned char k,int x,int y)
{
switch(k)
{
case 27:
case 'q':{exit(0);break;}
case 'c':{center[1]=center[1]-1;break;}
case 'r':{center[0]=0;center[1]=0;center[2]=0;};//恢复原状
//茶壶相关操作
case 'j':{tx++;break;}
case 'l':{tx--;break;}
case 'i':{ty++;break;}