计算机图形学实验指导 源代码
《计算机图形学》实验报告

《计算机图形学》实验报告《实验名称》姓名=学号6010203165专业软件外包班级三班任课教师刘世光天津大学仁爱学院计算机系2012年3 月20 日一、实验目的初步熟悉OpenGL这一图形系统的用法,利用Visual C++编程平台。
学习并掌握常用的三维绘制函数。
二、实验内容准备glut库,并联系使用Visual C++进行最简单的图形处理。
调试并学习Teapot绘制程序。
总结三维绘制和二维绘制的异同点。
三、实验结果程序1程序2程序3四、实验分析和总结五、源代码程序1#include <GL/glut.h>//初始化OpenGLvoid init(void){glClearColor(0.0f, 0.0f, 0.0f, 0.0f);//设置背景颜色glShadeModel(GL_FLAT);//设置明暗处理}//主要的绘制过程void display(void){glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓存glColor3f(0.0f,0.0f,1.0f);glRectf(250.0f,250.0f,400.0f,400.0f);glBegin(GL_LINES);//开始画直线glColor3f(1.0f, 1.0f, 1.0f);//设置颜色为白色glVertex2f(30.0f, 30.0f);//第一根线的两个端点glVertex2f(200.0f, 400.0f);glColor3f(1.0f, 0.0f, 0.0f);//设置第二根线的颜色为红色glVertex2f(25.0f, 350.0f);//第二根线的两个端点glVertex2f(250.0f, 50.0f);glEnd();//画线结束glBegin(GL_TRIANGLES);//开始画三角形,注意,没有设颜色,所以还是红色glVertex2f(400.0f, 100.0f);//三角形的三个顶点glVertex2f(600.0f, 100.0f);glVertex2f(500.0f, 300.0f);glEnd();//结束画三角形glFlush();//开始绘制}//在窗口改变大小时调用void reshape(int width, int height)glViewport(0, 0, width, height);//设置视口glMatrixMode(GL_PROJECTION);//设置当前为投影变换模式glLoadIdentity();//用单位矩阵替换当前变换矩阵gluOrtho2D(0.0, width, 0.0, height);//设置正交投影视图体}//处理键盘void keyboard(unsigned char key, int x, int y){switch (key){case 27://esc键退出exit(0);break;default:break;}}int main(int argc, char** argv){glutInit(&argc, argv);//初始化glutglutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//设置为单缓存,RGB模式glutInitWindowSize(640, 480); //设置窗口大小glutInitWindowPosition(0, 0);//设置窗口起始位置glutCreateWindow("Basic");//设置窗口标题init();//初始化OpenGLglutDisplayFunc(display);//设置显示回调函数glutReshapeFunc(reshape);//设置reshape回调函数glutKeyboardFunc(keyboard);//设置键盘回调函数glutMainLoop();//进入主循环return 0;}//代码要有详细的注释程序2#include "StdAfx.h"#include <stdlib.h>#include <GL/glut.h>void init(void){glEnable(GL_DEPTH_TEST);GLfloat position[] = {1.0, 1.0, 1.0, 0.0};glLightfv(GL_LIGHT0, GL_POSITION, position);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);GLfloat ambient[] = {0.0, 0.0, 0.0, 1.0};GLfloat diffuse[] = {0.8, 0.4, 0.3, 0.7};GLfloat specular[] = {0.5, 0.3, 0.3, 0.0};glMaterialfv(GL_FRONT, GL_AMBIENT, ambient);glMaterialfv(GL_FRONT, GL_DIFFUSE, diffuse);glMaterialfv(GL_FRONT, GL_SPECULAR, specular);glMaterialf(GL_FRONT, GL_SHININESS, 50.0);}void display(void){glClearColor(0.65f, 0.3f, 0.05f, 1.0f);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glNewList(1, GL_COMPILE);glutSolidTeapot(0.5);glEndList();glCallList(1);glFlush();}void reshape(GLsizei w, GLsizei h){glViewport(0, 0, w, h);glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(-1.0, 1.0, -1.0, 1.0, -1.0, 1.0);glMatrixMode(GL_MODELVIEW);}int main(int argc, char** argv){glutInit(&argc, argv);glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowPosition(260, 100);glutInitWindowSize(500, 500);glutCreateWindow(argv[0]);init();glutReshapeFunc(reshape);glutDisplayFunc(display);glutMainLoop();return 0;}程序3#include <GL/glut.h>//初始化OpenGLvoid init(void){glClearColor(0.0f, 0.0f, 0.0f, 0.0f);//设置背景颜色glShadeModel(GL_FLAT);//设置明暗处理}//主要的绘制过程void display(void){glClear(GL_COLOR_BUFFER_BIT);//清除颜色缓存glColor3f(0.0f,0.0f,1.0f);glRectf(250.0f,250.0f,400.0f,400.0f);glBegin(GL_LINES);//开始画直线glColor3f(1.0f, 1.0f, 1.0f);//设置颜色为白色glVertex2f(30.0f, 30.0f);//第一根线的两个端点glVertex2f(200.0f, 400.0f);glColor3f(1.0f, 0.0f, 0.0f);//设置第二根线的颜色为红色glVertex2f(25.0f, 350.0f);//第二根线的两个端点glVertex2f(250.0f, 50.0f);glEnd();//画线结束glBegin(GL_TRIANGLES);//开始画三角形,注意,没有设颜色,所以还是红色glVertex2f(400.0f, 100.0f);//三角形的三个顶点glVertex2f(600.0f, 100.0f);glVertex2f(500.0f, 300.0f);glEnd();//结束画三角形glFlush();//开始绘制}//在窗口改变大小时调用void reshape(int width, int height){glViewport(0, 0, width, height);//设置视口glMatrixMode(GL_PROJECTION);//设置当前为投影变换模式glLoadIdentity();//用单位矩阵替换当前变换矩阵gluOrtho2D(0.0, width, 0.0, height);//设置正交投影视图体}//处理键盘void keyboard(unsigned char key, int x, int y){switch (key){case 27://esc键退出exit(0);break;default:break;}}int main(int argc, char** argv){glutInit(&argc, argv);//初始化glutglutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);//设置为单缓存,RGB模式glutInitWindowSize(640, 480); //设置窗口大小glutInitWindowPosition(0, 0);//设置窗口起始位置glutCreateWindow("Basic");//设置窗口标题init();//初始化OpenGLglutDisplayFunc(display);//设置显示回调函数glutReshapeFunc(reshape);//设置reshape回调函数glutKeyboardFunc(keyboard);//设置键盘回调函数glutMainLoop();//进入主循环return 0;}//代码要有详细的注释。
计算机图形学实习全部代码 View调用

// GraphicsView.cpp : CGraphicsView 类的实现//#include "stdafx.h"// SHARED_HANDLERS 可以在实现预览、缩略图和搜索筛选器句柄的// ATL 项目中进行定义,并允许与该项目共享文档代码。
#ifndef SHARED_HANDLERS#include "Graphics.h"#endif#include "GraphicsDoc.h"#include "GraphicsView.h"#include <cmath>#ifdef _DEBUG#define new DEBUG_NEW#endif// CGraphicsViewIMPLEMENT_DYNCREATE(CGraphicsView, CView)BEGIN_MESSAGE_MAP(CGraphicsView, CView)// 标准打印命令ON_COMMAND(ID_FILE_PRINT, &CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CGraphicsView::OnFilePrintPreview) ON_WM_CONTEXTMENU()ON_WM_RBUTTONUP()ON_COMMAND(ID_32771, &CGraphicsView::OnDDA)ON_COMMAND(ID_32772, &CGraphicsView::OnMidline)ON_COMMAND(ID_32773, &CGraphicsView::On32773)ON_COMMAND(ID_32774, &CGraphicsView::OncircleMid)ON_COMMAND(ID_32775, &CGraphicsView::ONddacircle)ON_COMMAND(ID_32776, &CGraphicsView::OnBresenhamcircle)ON_COMMAND(ID_32777, &CGraphicsView::OnMidEllipse)ON_COMMAND(ID_32778, &CGraphicsView::Onlugrange)ON_COMMAND(ID_32779, &CGraphicsView::OnScanLineseed)ON_COMMAND(ID_32780, &CGraphicsView::Ontranslation)ON_COMMAND(ID_32781, &CGraphicsView::Onrotation)ON_COMMAND(ID_32782, &CGraphicsView::Onscaling)ON_COMMAND(ID_32783, &CGraphicsView::OnBezier)ON_COMMAND(ID_32784, &CGraphicsView::OnSeedfilledALg) END_MESSAGE_MAP()// CGraphicsView 构造/析构CGraphicsView::CGraphicsView(){// TODO: 在此处添加构造代码}CGraphicsView::~CGraphicsView(){}BOOL CGraphicsView::PreCreateWindow(CREATESTRUCT& cs){// TODO: 在此处通过修改// CREATESTRUCT cs 来修改窗口类或样式return CView::PreCreateWindow(cs);}// CGraphicsView 绘制//Bezier曲线的混合函数////////////double b03(double t)//{return(pow(1-t,3)); }//double b13(double t)//{return(3*t*pow(1-t,2));}////double b23(double t)//{return(3*(1-t)*t*t);}////double b33(double t)//{return(t*t*t);}#include "SeqStack.h"void CGraphicsView::OnDraw(CDC*pDC){CGraphicsDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;//pDC->MoveTo(100,100);//pDC->LineTo(300,300);// pDC->MoveTo(300,300);//pDC->LineTo(200,300);// pDC->MoveTo(200,300);//pDC->LineTo(100,100);//// TODO: 在此处为本机数据添加绘制代码// SeqStack<POINT> sta;// POINT s[100000];//int i=0;// s[i].x=150;//s[i].y=160;//int m,n;//sta.Push(s[i]);//起始点入栈//// while(!sta.IsEmpty())// {// sta.Pop(s[i]);// m=s[i].x;// n=s[i].y;// if(pDC->GetPixel(m,n)!=RGB(0,0,0) )// {// pDC->SetPixel(m,n,RGB(0,0,0));// i++;// }// if(pDC->GetPixel(m+1,n)!=RGB(0,0,0) ) // {// s[i].x=m+1;// s[i].y=n;// sta.Push(s[i]);// i++;// }// if(pDC->GetPixel(m-1,n)!=RGB(0,0,0))// {// s[i].x=m-1;// s[i].y=n;// sta.Push(s[i]);// i++;// }// if(pDC->GetPixel(m,n+1)!=RGB(0,0,0) )// {// s[i].x=m;// s[i].y=n+1;// sta.Push(s[i]);// i++;// }// if(pDC->GetPixel(m,n-1)!=RGB(0,0,0))// {// s[i].x=m;// s[i].y=n-1;// sta.Push(s[i]);// }//}}// CGraphicsView 打印void CGraphicsView::OnFilePrintPreview(){#ifndef SHARED_HANDLERSAFXPrintPreview(this);#endif}BOOL CGraphicsView::OnPreparePrinting(CPrintInfo* pInfo){// 默认准备return DoPreparePrinting(pInfo);}void CGraphicsView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {// TODO: 添加额外的打印前进行的初始化过程}void CGraphicsView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {// TODO: 添加打印后进行的清理过程}void CGraphicsView::OnRButtonUp(UINT /* nFlags */, CPoint point){ClientToScreen(&point);OnContextMenu(this, point);}void CGraphicsView::OnContextMenu(CWnd* /* pWnd */, CPoint point){#ifndef SHARED_HANDLERStheApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);#endif}// CGraphicsView 诊断#ifdef _DEBUGvoid CGraphicsView::AssertValid() const{CView::AssertValid();}void CGraphicsView::Dump(CDumpContext& dc) const{CView::Dump(dc);}CGraphicsDoc* CGraphicsView::GetDocument() const // 非调试版本是内联的{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGraphicsDoc)));return (CGraphicsDoc*)m_pDocument;}#endif //_DEBUG// CGraphicsView 消息处理程序void CGraphicsView::OnDDA(){CDC* pDC = GetDC();Geo obj(pDC);pDC-> SetMapMode(MM_LOMETRIC); //设置坐标系pDC-> SetViewportOrg(100,100);obj.DDA(100,100,200,200,pDC);ReleaseDC(pDC);// TODO: 在此添加命令处理程序代码}void CGraphicsView::OnMidline(){CDC* pDC = GetDC();Geo obj(pDC);pDC-> SetMapMode(MM_LOMETRIC); //设置坐标系pDC-> SetViewportOrg(0,100);obj.mpline(100,100,200,200,pDC);ReleaseDC(pDC);// TODO: 在此添加命令处理程序代码}void CGraphicsView::On32773(){CDC* pDC = GetDC();Geo obj(pDC);pDC-> SetMapMode(MM_LOMETRIC);//该函数设置指定设备环境的映射方式,映射方式定义了将逻辑单位转换为设备单位的度量单位,并定义了设备的X、Y轴的方向pDC-> SetViewportOrg(500,200);//pDC->SetWindowOrg(100,100);obj.Bresenham(100,100,200,200,pDC);ReleaseDC(pDC);// TODO: 在此添加命令处理程序代码}void CGraphicsView::OncircleMid(){CDC* pDC = GetDC();Geo obj(pDC);pDC-> SetMapMode(MM_LOMETRIC);pDC-> SetViewportOrg(500,200);obj.circleMidpoint(10,100,300,pDC);ReleaseDC(pDC);// TODO: 在此添加命令处理程序代码}////////////////dda画圆算法//////////////////////// void CGraphicsView::ONddacircle(){// TODO: 在此添加命令处理程序代码CDC* pDC = GetDC();Geo obj(pDC);pDC-> SetMapMode(MM_LOMETRIC);pDC-> SetViewportOrg(500,200);obj.ddacircle(10,100,500,pDC);ReleaseDC(pDC);}void CGraphicsView::OnBresenhamcircle(){// TODO: 在此添加命令处理程序代码CDC* pDC = GetDC();Geo obj(pDC);pDC-> SetMapMode(MM_LOMETRIC);pDC-> SetViewportOrg(500,200);obj.Bresenham_Circle(100,pDC);ReleaseDC(pDC);}void CGraphicsView::OnMidEllipse(){// TODO: 在此添加命令处理程序代码CDC* pDC = GetDC();Geo obj(pDC);pDC-> SetMapMode(MM_LOMETRIC);pDC-> SetViewportOrg(500,200);obj.ellipseMidpoint( 20,100,100, 200,pDC);ReleaseDC(pDC);}void CGraphicsView::Onlugrange(){// TODO: 在此添加命令处理程序代码CDC* pDC = GetDC();Geo obj(pDC);pDC-> SetMapMode(MM_LOMETRIC);pDC-> SetViewportOrg(500,200);int xa[4]={100,50,280,400};int ya[4]={100,150,280,400};int za[4]={100,150,280,400};int k=4,l_section=40;obj.Lugrange( xa, ya,za, k, l_section,pDC);ReleaseDC(pDC);}void CGraphicsView::OnScanLineseed(){// TODO: 在此添加命令处理程序代码CDC*pDC=GetDC();Geo obj(pDC);/*pDC-> SetMapMode(MM_LOMETRIC);pDC-> SetViewportOrg(500,400);*///obj.ScanLineSeedFill(150,160,pDC);//obj.ScanLineSeedFill(400,600-200,pDC);obj.ScanLineSeedFill(101,200,pDC);ReleaseDC(pDC);}void CGraphicsView::Ontranslation(){// TODO: 在此添加命令处理程序代码CDC* pDC = GetDC();Geo obj(pDC);obj.Algorithm1(100,100,200,200,RGB(255,0,0),pDC);obj.Algorithm2(100,100,200,200,RGB(255,0,0),pDC);ReleaseDC(pDC);}void CGraphicsView::Onrotation(){// TODO: 在此添加命令处理程序代码CDC* pDC = GetDC();Geo obj(pDC);obj.Algorithm3(100,100,200,200,RGB(255,0,0),pDC);ReleaseDC(pDC);}void CGraphicsView::Onscaling(){// TODO: 在此添加命令处理程序代码CDC* pDC = GetDC();Geo obj(pDC);obj.Algorithm4(100,100,200,200,RGB(255,0,0),pDC);ReleaseDC(pDC);}void CGraphicsView::OnBezier(){// TODO: 在此添加命令处理程序代码CDC *pDC=GetDC();pDC-> SetMapMode(MM_LOMETRIC);pDC-> SetViewportOrg(150,600);Geo obj(pDC);obj.Bezier(pDC);ReleaseDC(pDC);}void CGraphicsView::OnSeedfilledALg(){// TODO: 在此添加命令处理程序代码CDC *pDC=GetDC();//pDC-> SetMapMode(MM_LOMETRIC);//pDC-> SetViewportOrg(150,600);Geo obj(pDC);obj.SeedFiled(pDC);ReleaseDC(pDC);}。
计算机图形学实验报告,DOC

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

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 曲线的绘制与显示。
计算机图形学-3D机器人实验代码和截图

学院名称 课程名称
年级、专 业、班 实验项目 计算机图形学 名称
学 号3D ຫໍສະໝຸດ 器人姓 同组姓名名 指导 教师
实验类型
验证 √
综合 □
设计 □
创新 □ 成绩
教师 评语
教师签名:
年月日
实验报告内容一般包括以下几个内容:1、目的要求 2、仪器用具及材料(仪器名称及主要规格、用具名称) 3、实验内容及原理(简 单但要抓住要点,写出依据原理) 4、操作方法与实验步骤 5、数据图表格(照片) 6、实验过程原始记录 7 数据处理及结果(按 实验要求处理数据、结论) 8、作业题 9、讨论(对实验中存在的问题、进一步的想法等进行讨论)
}
int main(int argc, char** argv) {
//初始化 glutInit(&argc, argv); //设置显示模式 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //初始化窗口大小 glutInitWindowSize(500, 500); //定义左上角窗口位置 glutInitWindowPosition(100, 100); //创建窗口 glutCreateWindow(argv[0]); //初始化 init(); //显示函数 glutDisplayFunc(display); //窗口大小改变时的响应 glutReshapeFunc(reshape); //鼠标点击事件,鼠标点击或者松开时调用 glutMouseFunc(mouseClick); //鼠标移动事件,鼠标按下并移动时调用 glutMotionFunc(mouseMove); //键盘事件 glutKeyboardFunc(keyPressed); //循环 glutMainLoop(); return 0; } (2)实验截图:
计算机图形学代码

四、实验结果抓图与分析1、目标的平移的源程序2、绕任意点旋转的源程序实验一、直线的生成一、实验内容根据提供的程序框架,修改部分代码,完成画一条直线的功能(中点画线法或者Bresenham画线法任选一),只要求实现在第一象限内的直线。
二、算法原理介绍双击直线生成.dsw打开给定的程序,或者先启动VC++,文件(file)→打开工作空间(open workspace)。
打开直线生成view.cpp,按注释改写下列函数:1.void CMyView::OnDdaline() (此为DDA生成直线)2.void CMyView::OnBresenhamline()(此为Bresenham画直线)3.void CMYView::OnMidPointLine()(此为中点画线法)三、程序源代码1.DDA生成直线画法程序:float x,y,dx,dy,k;dx=(float)(xb-xa);dy=(float)(yb-ya);k=dy/dx;x=xa;y=ya;if(abs(k)<1){for (x=xa;x<=xb;x++){pdc->SetPixel(x, int(y+0.5),COLOR);y=y+k;}}if(abs(k)>=1){for(y=ya;y<=yb;y++){pdc->SetPixel(int(x+0.5),y,COLOR);x=x+1/k;}}//DDA画直线结束}2.Bresenham画直线源程序:float b,d,xi,yi;int i;float k;k=(yb-ya)/(xb-xa);b=(ya*xb-yb*xa)/(xb-xa);if(k>0&&k<=1)for(i=0;i<abs(xb-xa);i++){ d=ya+0.5-k*(xa+1)-b;if(d>=0){ xi=xa+1;yi=ya;xa++;ya=ya+0.5;}if(d<0){ xi=xa+1;yi=ya+1;xa++;ya=ya+1.5;}pdc->SetPixel(xi,yi,COLOR); }//BresenHam画直线结束}3.中点画线法源程序:float b,d,xi,yi;int i;float k;k=(yb-ya)/(xb-xa);b=(ya*xb-yb*xa)/(xb-xa);if(k>0&&k<=1)for(i=0;i<abs(xb-xa);i++){ d=ya+0.5-k*(xa+1)-b;if(d>=0){ xi=xa+1;yi=ya;xa++;ya=ya+0.5;}if(d<0){ xi=xa+1;yi=ya+1;xa++;ya=ya+1.5;}pdc->SetPixel(xi,yi,COLOR); }//BresenHam画直线结束}四、实验结果抓图与分析1、DDA生成直线2、Bresenham画直线3、中点画线法实验二、bresenham画圆一、实验内容根据提供的程序框架,修改部分代码,用Bresenham画法画一段圆弧或者画圆。
计算机图形学 实验一:生成彩色立方体(含源代码)

实验一实验目的:生成彩色立方体实验代码://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);}}运行截图:。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机图形学实验指导一、实验目的1、培养学生动手编程解决实际问题的能力。
2、训练学生分析问题和调试程序的能力。
3、锻炼学生撰写科技实验论文的能力。
二、实验要求1、问题分析充分地分析和理解问题本身,弄清要求做什么,用什么算法。
2、程序设计(1)根据所采用的算法,设计数据结构,画出流程图并编程。
(2)最后准备调试程序的数据及测试方案。
3、上机调试(1)对程序进行编译,纠正程序中可能出现的语法错误。
(2)调试前,先运行一遍程序看看究竟将会发生什么。
(3)如果情况很糟,根据事先设计的测试方案并结合现场情况进行错误跟踪,包括单步调试、设置观察窗输出中间变量值等手段。
4、整理实习报告三、实验报告1、实习内容:采用的算法名称2、问题描述:包括目标、任务、条件约束描述等。
3、设计:数据结构设计和核心算法设计。
主要功能模块的输入,处理(算法框架)和输出。
4、测试范例:测试结果的分析讨论,测试过程中遇到的主要问题及所采用的解决措施。
5、心得:包括程序的改进设想,经验和体会。
6、程序清单:源程序,其中包括变量说明及详细的注释。
实验一 OpenGL程序设计一、实验学时2学时二、实验类型学习型实验三、实验目的和要求初步了解OpenGL程序设计结构;了解OpenGL的基本数据类型、核心函数及辅助函数的使用。
四、实验内容1、综述这次试验的目的主要是使大家初步熟悉OpenGL这一图形系统的用法,编程平台是Visual C++,它对OpenGL提供了完备的支持。
OpenGL提供了一系列的辅助函数,用于简化Windows操作系统的窗口操作,使我们能把注意力集中到图形编程上,这次试验的程序就采用这些辅助函数。
2、试验步骤1)在VC中新建项目2).OpenGL基础库设置•更改头文件(在视图类的头文件中引用gl\gl.h gl\glu.h)•连接OpenGL库(工程——设置——General/Use MFC in a Library, Link/OpenGL32.lib glu32.lib)3).添加变量和函数•添加变量并初始化•CClientDC * MyDC;•视图类的构造函数中 MyDC=NULL;•添加消息映射函数•OnCreate()•OnSize()•OnDestroy()4).在PreCreateWindow函数中将窗口的客户区设置为OpenGL能够支持的风格cs.style=WS_CHILD|WS_VISIBLE|WS_CLIPCHILDREN|WS_CLIPSIBLINGS;5).在OnCreate函数中•定义像素存储格式• PIXELFORMATDESCRIPTOR结构•创建绘图上下文RC(Rendering Context)并使之当前化•wglCreateContext()函数创建绘图上下文RC。
PIXELFORMATDESCRIPTOR pfd={ sizeof(PIXELFORMATDESCRIPTOR), // pfd的大小1, //结构的版本号PFD_DRAW_TO_WINDOW| //支持windowPFD_SUPPORT_OPENGL| //支持OpenGLPFD_DOUBLEBUFFER, //双缓存PFD_TYPE_RGBA, //RGBA颜色模式24, //24位颜色深度缓存0,0,0,0,0,0, //color bits ignored0, //no alpha buffer0, //shift bit ignored0, //不使用累积缓存0,0,0,0, //accum bits ignored32, //32位z缓冲0, //不使用模板缓存0, //no auxiliary bufferPFD_MAIN_PLANE, //选择主层面0, //保留0,0,0 //layer masks ignored};MyDC=new CClientDC(this);//设置像素格式int pixelFormat=ChoosePixelFormat(MyDC->GetSafeHdc(),&pfd); SetPixelFormat(MyDC->GetSafeDC(),pixelFormat,&pfd);m_hRC=wglCreateContext(MyDC->m_hDC);wglMakeCurrent(MyDC->GetSafeHdc(),m_hRC);6).在OnSize函数中设置视场和视口If(cy>0){glMatrixMode(GL_PROJECTION);glLoadIdentity();glFrustum(-1.0,1.0,-1.0*cy/cx,1.0*cy/cx,5.0,9.0);glViewport(0,0,cx,cy);}7).在OnDestroy函数:在OnDestroy成员中需要释放OnCreate成员中RC所占用的资源HGLRC m_hRC;m_hRC=wglGetCurrentContext();wglMakeCurrent(NULL,NULL);wglDeleteContext(m_hRC);MyDC->DeleteDC();8)在OnEraseBKgnd中将原来的返回语句换成返回TRUE;9).在OnDraw中根据当前的视点、视距、观看方向等参数,设置合适的OpenGL视景体属性,使用户能够看到预期的场景外观glClearColor(1.0f,1.0f,0.0f,1.0f);//背景为黄色glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT)glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslatef(0.0f,0.0f,-6.0f);glBegin(GL_LINES); //OpenGL绘制直线命令glColor3f(1.0,0.0,0.0); //设置当前颜色为红色glVertex2f(0,0);glVertex2f(1,1);glColor3f(0.0,1.0,0.0); //设置当前颜色为绿色glVertex2f(0.2f,0.0f);//glVertex2f(1.2f,1.0f);glEnd();glFinish();SwapBuffers(wglGetCurrentDC());3、程序说明每个函数的具体含义在程序注释中已作了叙述,不再多说。
OpenGL的函数在格式上很有特点,它以gl为前缀,并且函数名的最后一个字母指出所用的数据类型,如:glColor3f(),字母f指明要使用浮点数。
字母前的数字指明参数个数或指明二维还是三维,如:glVertex2f()是要设置二维的点。
OpenGL采用的是状态机的方式,用户设定一种状态,程序照此运行。
如:glBegin(GL_LINES)设定画线状态(GL_LINES是OpenGL已定义好的常量),glColor3f()设定绘图所用颜色。
main()函数中的几个aux前缀函数是OpenGL提供的辅助库,用以初始化窗口,大家不必深究,我们关注的是display()函数,它是我们真正绘图的地方。
函数glColor3f()以RGB方式设置颜色,格式为:glColor3f(red, green, blue),每种颜色值在(0.0, 1.0)之间。
为了能显示更多的颜色,最好把系统设置成16位真彩色模式。
函数glVertex2f(x, y)设置二维顶点。
函数glBegin(UINT State)、glEnd()是最基本的作图函数,下面对它作一介绍。
如上所述,OpenGL是一个状态机,glBegin(UINT State)可以设定如下状态:GL_POINTS 画点GL_LINES 画线,每两个顶点(Vertex)为一组GL_LINE_STRIP 画线,把若干个顶点顺次连成折线GL_LINE_LOOP 画线,把若干个顶点顺次连成封闭折线GL_TRIANGLES 画三角形,每三个顶点为一组GL_QUADS 画四边形,每四个顶点为一组GL_POLYGON 画多边形还有GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUADS_STRIP 等等。
大家可以把每一种状态都试一试。
程序可以有多组glBegin()、glEnd()并列的形式,如:... ...glBeing(GL_LINES);......glEnd();glBeing(GL_QUADS);... ...glEnd();... ...除了上述的基本图元外,函数glRectf(x1, y1, x2, y2)可以画一个矩形,但这个函数不能放在glBegin()和glEnd()之间,下面的两句程序是画一个蓝色的矩形。
glColor3f (0.0f, 0.0f, 1.0f);glRectf(10.0f, 10.0f, 50.0f,50.0f);实验二二维基本图元的生成一、实验学时2学时二、实验类型设计型实验三、实验目的和要求1、掌握二维基本图元直线段生成的DDA算法,Brehension算法;2、掌握二维基本图元圆弧生成的中点画圆算法;3、掌握对线型线宽的属性的控制。
四、实验内容1、编程实现DDA、Brehension算法生成直线2、中点扫描转换生成圆、椭圆五、实验步骤1)在VC中新建项目2)添加菜单及相应的菜单命令函数(画线、画圆)3)编码实现(参考书中相关代码);实验三二维图元的填充一、实验学时2学时二、实验类型设计型实验三、实验目的和要求1、掌握二维图元填充的递归算法;2、掌握二维图元填充的种子填充算法四、实验内容构造任意一个边界表示的多边形,假定该多边形内部是四连通的。
要求:1、用递归算法实现对多边形内部的填充,要求内部颜色和边界不一致。
2、用种子填充扫描线算法实现多边形内部的填充。
五、建立win32应用程序工程。
1、请在实验二中建立的项目基础上,添加填充的菜单项,建立相应的菜单命令寒暑,实现种子填充。
2. void BoundaryFill4(HDC,int,int,COLORREF,COLORREF);void BoundaryFill4(HDC hdc,int x,int y,COLORREF boundarycolor,COLORREF newcolor){COLORREF color;color=GetPixel(hdc,x,y);if((color != boundarycolor) && (color !=newcolor)){SetPixel(hdc,x,y,newcolor);BoundaryFill4(hdc,x,y+1,boundarycolor,newcolor);BoundaryFill4(hdc,x,y-1,boundarycolor,newcolor);BoundaryFill4(hdc,x-1,y,boundarycolor,newcolor);BoundaryFill4(hdc,x+1,y,boundarycolor,newcolor);}}实验四二维图形的几何变换一、实验学时2学时二、实验类型设计型实验三、实验目的和要求1、掌握二维图形的基本几何变换,如平移、旋转、缩放;2、掌握OpenGL中模型变换函数。