计算机图形学实验报告 (2)分解

合集下载

计算机图形学报告

计算机图形学报告

计算机图形学总结报告学院:计算机与通信工程学院班级:计算机12-01学号:姓名:指导教师:计算机图形学总结报告一:课程总结通过一个学期的学习,了解了什么是计算机图形学、什么是图形API、为什么需要计算机图形学以及计算机图形学在各个领域的应用。

在学习过程中我们也通过实验课真正的了解和尝试的制作某些比较简单的图形学案例,比如一些基本的画笔与画刷、用鼠标交互式画图的算法、菜单编辑、一些基本的图形算法等等,其中我还以金刚石图案算法作为了我的特色程序设计。

计算机图形学是一种使用数学算法将二维或三维图形转化为计算机显示器的栅格形式的科学,研究的是应用计算机产生图像的所有工作,不管图像是静态的还是动态的,可交互的还是固定的,等等。

图形API是允许程序员开发包含交互式计算机图形操作的应用而不需要关注图形操作细节或任务系统细节的工具集。

计算机图形学有着广泛的应用领域,包括物理、航天、电影、电视、游戏、艺术、广告、通信、天气预报等几乎所有领域都用到了计算机图形学的知识,这些领域通过计算机图形学将几何模型生成图像,将问题可视化从而为各领域更好的服务。

计算机图形学利用计算机产生让人赏心悦目的视觉效果,必须建立描述图形的几何模型还有光照模型,再加上视角、颜色、纹理等属性,再经过模型变换、视图变换、投影操作等,通过这些步骤从而实现一个完整的OpenGL程序效果。

OpenGL是一个开放的三维图形软件包,它独立于窗口系统和操作系统,以它为基础开发的应用程序可以十分方便地在各种平台间移植。

计算机图形学通过应用OpenGL的功能,使得生成的图形效果具有高度真实感。

学习计算机图形学的重点是掌握OpenGL在图形学程序中的使用方法。

21世纪是信息的时代,在日新月异的科技更新中相信计算机会发挥越来越重要的作用,计算机图形学也会在更多的领域所应用,虽然我国在这方面还比较薄弱,但相信会有越来越好的时候的。

二:特色程序设计——金刚石图案算法(一):知识要点●在Visual C++ 6.0环境下创建MFC AppWizard(exe)。

计算机图形学实验报告_2

计算机图形学实验报告_2

计算机图形学实验报告学号:********姓名:班级:计算机 2班指导老师:***2010.6.19实验一、Windows 图形程序设计基础1、实验目的1)学习理解Win32 应用程序设计的基本知识(SDK 编程);2)掌握Win32 应用程序的基本结构(消息循环与消息处理等); 3)学习使用VC++编写Win32 Application 的方法。

4)学习MFC 类库的概念与结构;5)学习使用VC++编写Win32 应用的方法(单文档、多文档、对话框);6)学习使用MFC 的图形编程。

2、实验内容1)使用WindowsAPI 编写一个简单的Win32 程序,调用绘图API 函数绘制若干图形。

(可选任务)2 )使用MFC AppWizard 建立一个SDI 程序,窗口内显示"Hello,Thisis my first SDI Application"。

(必选任务)3)利用MFC AppWizard(exe)建立一个SDI 程序,在文档视口内绘制基本图形(直线、圆、椭圆、矩形、多边形、曲线、圆弧、椭圆弧、填充、文字等),练习图形属性的编程(修改线型、线宽、颜色、填充样式、文字样式等)。

定义图形数据结构Point\Line\Circle 等保存一些简单图形数据(在文档类中),并在视图类OnDraw 中绘制。

3、实验过程1)使用MFC AppWizard(exe)建立一个SDI 程序,选择单文档;2)在View类的OnDraw()函数中添加图形绘制代码,说出字符串“Hello,Thisis my first SDI Application”,另外实现各种颜色、各种边框的线、圆、方形、多边形以及圆弧的绘制;3)在类视图中添加图形数据point_pp,pp_circle的类,保存简单图形数据,通过在OnDraw()函数中调用,实现线、圆的绘制。

4、实验结果正确地在指定位置显示了"Hello,This is my first SDI Application"字符串,成功绘制了圆,椭圆,方形,多边形以及曲线圆弧、椭圆弧,同时按指定属性改绘了圆、方形和直线。

计算机图形学第二次实验报告

计算机图形学第二次实验报告

一、绘制FERGUSON 曲线1,改变各点处的一阶导 数数值,绘制 FERGUSON 曲线进行对比分析A=[100,300;120,200;220,200;270,100;370,100;420, 200;420,300;220,280;100,300];B=[10,-10;30,-30;30,-30;30,-10;20,20;20,20;-20, 20;-20,10;20,-20];Q=[2,-2,1,1;-3,3,-2,-1;0,0,1,0;1,0,0,0]; plot(A(:,1),A(:,2)); [m, n]=size(A); hold on for i=1:m-1for t=0:0.001:1 T=[tA3F2,t,1];Px=[A(i,1),A(i+1,1),B(i,1),B(i+1,1)]; Py=[A (i, 2),A(i+1,2),B (i, 2),B(i+1,2)]; x=T*Q*Px :y=T*Q*Py' plot(x,y, 'r');end end2,FERGUSON 曲线丰满度实验姓名学号所使用的语言 完成日期MATLAB 2016/5/9截图部分B=[10,-10;30,-30;30,-30;30,-10;20,20;2 0,20;-20,20;-20,10;20,-20];B=[210,-210;230,-230;230,-230;230,-210;220,240;250,250;-210,230;-220,210;220,-200];A=[100,300;120,200;220,200;270,100;370,100;420, 200;420,300;220,280;100,300]; B=[10,-10;30,-30;30,-30;30,-10;20,20;20,20;-20,20;-20,10;20,-20];C=[20,-20;60,-60;60,-60;60,-20;40,40;40,40;-40,40;-40,40;40,-40];D=[40,-40;120,-120;120,-120;120,-40;80,80;80,80 ;-80,80;-80,80;80,-80];Q=[2,-2,1,1;-3,3,-2,-1;0,0,1,0;1,0,0,0];plot(A(:,1),A(:,2));[m, n]=size(A);hold onfor i=1:m-1for t=0:0.001:1T=[tA3F2,t,1];Px=[A(i,1),A(i+1,1),B(i,1),B(i+1,1)];Py=[A (i, 2),A(i+1,2),B (i, 2),B(i+1,2)];x=T*Q*Px :y=T*Q*Py :Px 1= [A(i,1),A(i+1,1),C(i,1),C(i+1,1)];Py 1=[A (i, 2),A(i+1,2),C(i,2),C(i+1,2)];x1= T*Q*Px1';y1=T*Q*Py1';Px2=[A(i,1),A(i+1,1),D(i,1),D(i+1,1)];Py2=[A (i, 2),A(i+1,2),D(i,2),D(i+1,2)];x2=T*Q*Px2';y2=T*Q*Py2';plot(x,y, 'r');plot(x1,y1, 'r');plot(x2,y2, 'r');endend2、绘制任意二次三点Bezier曲线x=[100 150 200 ];y=[100 50 100 ];plot(x,y, 'k' , ‘n eWidth' ,1); k=le ngth(x);for i=1:k-2for t=0:0.005:1Bx=(t A2-2*t+1)*x(1)+(-2*t A2+2*t)*x (2)+ (t A2)*x(3);By=(t A2-2*t+1)*y(1)+(-2*t A2+2*t)* y(2)+(t A2)* y(3);hold onplot(Bx,By, 'r' , 'Li neWidth' ,2);endend3、绘制三次七点Bezier曲线clear all hold onB1=[100,300;120,200;220,200;270,100];B2=[270,100;370,100;420,200;420,300]plot(B1(:,1),B1(:,2), '-b');plot(B2(:,1),B2(:,2), '-b');for t=0:0.001:1P=[t*t*t t*t t 1];Q=[-1,3,-3,1;3,-6,3,0;-3,3,0,0;1,0,0,0];P仁P*Q*B1;plot(P1(:,1),P1(:,2), '.b' , 'markersize' ,10);P仁P*Q*B2;plot(P1(:,1),P1(:,2), '.b' , 'markersize' ,10); end三、绘制B样条曲线1、绘制均匀二次三点B样条曲线x=[100 150 200 250 300 350 400 450 500];y=[100 50 100 50 150 50 100 50 100];plot(x,y, 'k' , ‘n eWidth' ,1);k=le ngth(x);B=1/2;for i=1:k-2for t=0:0.005:1Bx=B*(tA2-2*t+1)*x(i)+B*(-2*L2+2*t+1)*x(i+1)+B*(t A2)*x(i+2);By=B*(t A2-2*t+1)*y(i)+B*(-2*t A2+2*t+1)*y(i+1)+B*(t A2)*y(i+2);hold onplot(Bx,By, 'r' , 'Li neWidth' ,2);endend2、绘制三次B样条曲线x=[100 120 220 270 370 420 420 ];y=[300 200 200 100 100 200 300 ];plot(x,y, 'k' , 'Li neWidth' ,1);k=le ngth(x);B=1/6;for i=1:k-3for t=0:0.005:1Bx=B*(-t A 3+3*t A2-3*t+1)*x(i)+B*(3*t A3-6*t A2-0*t +4)*x(i+1)+ B*(-3*t A3+3*t A2+3*t+1)*x(i+2)+B*(1*t A3-0*t A2-0* t+0)*x(i+3); By=B*(-t A 3+3*t A2-3*t+1)*y(i)+B*(3*t A3-6*t A2-0*t +4)*y(i+1)+B*(-3*t A3+3*t A2+3*t+1)*y(i+2)+B*(1*t A3-0*t A2-0* t+0)*y(i+3);plot(Bx,By,'r' , 'LineWidth' ,2);endend3、在同一控制顶点下(四个控制定点)绘制三次Bezier曲线和三次B样条曲线hold onx=[220 270 300 320 340 360 370 420 ];y=[200 100 150 150 150 150 100 200 ]; plot(x,y, '-b' , 'Li neWidth' ,2);plot(x,y, '*r' , 'Lin eWidth' ,3);k=length(x); B=1/6;for i=1:k-3for t=0:0.001:1Bx=B*(-t A 3+3*t A2-3*t+1)*x(i)+B*(3*t A3-6*t A2-0*t+4)*x(i+1)+ ...B*(-3*t A3+3*t A2+3*t+1)*x(i+2)+B*(1*t A3-0*t A2-0* t+0)*x(i+3);By=B*(-t A3+3*t A2-3*t+1)*y(i)+B*(3*t A3-6*t A2-0*t +4)*y(i+1)+ ...B*(-3*t A3+3*t A2+3*t+1)*y(i+2)+B*(1*t A3-0*t A2-0* t+0)*y(i+3);plot(Bx,By, 'r' , 'Li neWidth' ,2);endend四、有理曲线绘制绘制有理二次Bezier曲线x=[100 150 200 250 300 350 400 450 500];y=[100 50 100 50 150 50 100 50 100];plot(x,y, 'k' , 'Li neWidth' ,1);k=le ngth(x);B=1/2;for t=0:0.005:1Bx=(B*(tA2-2*t+1)*x(i)+B*(-2*L2+2*t+1)*x(i+1)+B*(tA2)*x(i+2))/(B*(tA2-2*t+1)+B*(-2*L2+2*t+1)+…B*(t A2));By=(B*(t A2-2*t+1)*y(i)+B*(-2*t A2+2*t+1)*y(i+1)+B*(t A2)*y(i+2))/(B*(t A2-2*t+1)+B*(-2*t A2+2*t+1)+…B*(t A2));hold onplot(Bx,By, 'r' , 'Li neWidth' ,2);endend均匀有理B样条曲线绘制有理三次B样条曲线hold on各种参数图形x=[220 270 300 320 340 370 420 ];y=[200 100 140 150 130 100 200 ]; plot(x,y, '-b' , 'Lin eWidth' ,2);k=length(x); B=1/6;for i=1:k-3for t=0:0.001:1Bx=(B*(-t A3+3*t A2-3*t+1)*x(i)+B*(3*t A3-6*t A2-0* t+4)*x(i+1)+ ...B*(-3*t A3+3*t A2+3*t+1)*x(i+2)+B*(1*t A3-0*t A2-0* t+0)*x(i+3))/(B*(-t A3+3*t A2-3*t+1)+B*(3*t A3-6*t A2-0*t+4)+ ...B*(-3*t A3+3*t A2+3*t+1)+B*(1*t A3-0*t A2-0*t+0));By=(B*(-t A3+3*t A2-3*t+1)*y(i)+B*(3*t A3-6*t A2-0* t+4)*y(i+1)+ ...B*(-3*t A3+3*t A2+3*t+1)*y(i+2)+B*(1*t A3-0*t A2-0*。

华中科技大学计算机图形学实验报告解析

华中科技大学计算机图形学实验报告解析

课程实验报告课程名称:计算机图形学专业班级:学号:姓名:指导教师:报告日期:2015-11-11计算机科学与技术学院实验一:分形图形绘制一、实验目的(标题四号黑体)(1)理解OpenGL 中glut 程序框架;(2)掌握二维基本图形绘制算法;(3)利用二维基本图形绘制算法,扩展对其他复杂图形的绘制理解。

二、实验内容1、实验算法(a)中点Bresenham算法画线a)输入直线的两个端点:端点、端点。

必要时交换A、B两点的坐标,使A点不在B点的右边。

令,,,b)讨论直线的斜率的大小及正负,分四种情况分别逐点画线:i.当最大位移方向为x轴。

构建判别公式:其中,初值。

当时,,。

当时,。

ii.当最大位移方向为x轴。

构建判别公式:其中,初值。

当时,,。

当时,。

iii.当最大位移方向为x轴。

构建判别公式:其中,初值。

当时,,。

当时,。

iv.当最大位移方向为x轴。

构建判别公式:其中,初值。

当时,,。

当时,。

c)当直线没有画完时重复b)步骤(b)绘制分形三角形a)输入三角形的三个端点:端点、端点、端点、递归层数n。

b)连接A、B、C三点。

c)当时,连接输入三角形三边的中点,将分割得到的四个三角形中包含顶点的三个、作为输入参数,递归调用本步骤。

2、源程序#include <iostream>#include <math.h>#include <GL/glut.h>#define ROUND(a) ((int )(a+0.5)) //求某个数的四舍五入值using namespace std;//全局变量声明:三角形三顶点及递归层数GLint Global_xa, Global_ya, Global_xb, Global_yb, Global_xc, Global_yc;int Global_n;void init(void){glClearColor(1.0, 1.0, 1.0, 0.0);//指定窗口的背景色为白色glMatrixMode(GL_PROJECTION);//对投影矩阵进行操作gluOrtho2D(0.0, 600.0, 0.0, 600.0);//使用正投影}//绘制直线的函数void lineDDA(GLint xa, GLint ya, GLint xb, GLint yb){GLint dx = xb - xa, dy = yb - ya; //计算x,y方向的跨距int steps, k; //定义绘制直线像素点的步数float xIcre, yIcre, x = xa, y = ya; //定义步长的增量//取X,Y方向跨距较大的值为步数if (abs(dx) > abs(dy)) steps = abs(dx);else steps = abs(dy);//根据步数来求步长增量xIcre = dx / (float)steps;yIcre = dy / (float)steps;//从起点开始绘制像素点for (k = 0; k <= steps; k++){glBegin(GL_POINTS);glVertex2f(x, y);glEnd();x += xIcre;y += yIcre;}}//绘制直线的函数(中点Bresenham算法)void lineBre(GLint xa, GLint ya, GLint xb, GLint yb){GLint dx, dy, d, UpIncre, DownIncre, x, y; //统一规定UpIncre为能使非最大位移方向坐标改变时的Di增量//统一规定DownIncre为不能使非最大位移方向坐标改变时的Di增量if (xa > xb) {/* 确保a点不在b点的右方*/x = xb; xb = xa; xa = x;y = yb; yb = ya; ya = y;}x = xa; y = ya; //计算画线起点dx = xb - xa; dy = yb - ya; //计算dx和dyif (abs(dx) >= abs(dy)){/* 考虑|k|<=1的情况*/if (dy >= 0) {/* 考虑k>=0的情况*/d = dx - 2 * dy; //计算D0UpIncre = 2 * dx - 2 * dy; DownIncre = -2 * dy; //计算UpIncre和DownIncrewhile (x <= xb) {/* 从线起点画到线终点*/glBegin(GL_POINTS);glVertex2i(x, y); // 在(x,y)位置画点glEnd();x++; //移动下一画点位置的x轴坐标if (d < 0) {/* 考虑Di<0的情况*/y++; //移动下一画点位置的y轴坐标d += UpIncre; //迭代d}else {/* 考虑Di>=0的情况*/d += DownIncre; //迭代d}}}else {/* 考虑k<0的情况*/d = -dx - 2 * dy; //计算D0UpIncre = -2 * dx - 2 * dy; DownIncre = -2 * dy; //计算UpIncre和DownIncrewhile (x <= xb) {/* 从线起点画到线终点*/glBegin(GL_POINTS);glVertex2i(x, y); // 在(x,y)位置画点glEnd();x++; //移动下一画点位置的x轴坐标if (d > 0) {/* 考虑Di>0的情况*/y--; //移动下一画点位置的y轴坐标d += UpIncre; //迭代d}else {/* 考虑Di>=0的情况*/d += DownIncre; //迭代d}}}}else {/* 考虑|k|>1的情况*/if (dy > 0) {/* 考虑k>0的情况*/d = 2 * dx - dy; //计算D0UpIncre = 2 * dx - 2 * dy; DownIncre = 2 * dx; //计算UpIncre和DownIncrewhile (y <= yb) {/* 从线起点画到线终点*/glBegin(GL_POINTS);glVertex2i(x, y); // 在(x,y)位置画点glEnd();y++; //移动下一画点位置的y轴坐标if (d > 0) {/* 考虑Di>0的情况*/x++; //移动下一画点位置的x轴坐标d += UpIncre; //迭代d}else {/* 考虑Di>=0的情况*/d += DownIncre; //迭代d}}}else {/* 考虑k<0的情况*/d = -2 * dx - dy; //计算D0UpIncre = -2 * dx - 2 * dy; DownIncre = -2 * dx; //计算UpIncre和DownIncrewhile (y >= yb) {/* 从线起点画到线终点*/glBegin(GL_POINTS);glVertex2i(x, y); // 在(x,y)位置画点glEnd();y--; //移动下一画点位置的y轴坐标if (d < 0) {/* 考虑Di>0的情况*/x++; //移动下一画点位置的x轴坐标d += UpIncre; //迭代d}else {/* 考虑Di>=0的情况*/d += DownIncre; //迭代d}}}}}void Triangle(GLint xa, GLint ya, GLint xb, GLint yb, GLint xc, GLint yc){// 绘制三角形// xa,ya;xb,yb;xc,yc;是三角形的三个顶点lineBre(xa, ya, xb, yb);lineBre(xb, yb, xc, yc);lineBre(xa, ya, xc, yc);}void Fractal(GLint xa, GLint ya, GLint xb, GLint yb, GLint xc, GLint yc, int n){GLint xaa, yaa, xbb, ybb, xcc, ycc; //获取三边中点的坐标xaa = (xb + xc) / 2;yaa = (yb + yc) / 2;xbb = (xa + xc) / 2;ybb = (ya + yc) / 2;xcc = (xa + xb) / 2;ycc = (ya + yb) / 2;if (n >= 1) {//递归Fractal(xa, ya, xbb, ybb, xcc, ycc, n - 1);Fractal(xb, yb, xaa, yaa, xcc, ycc, n - 1);Fractal(xc, yc, xaa, yaa, xbb, ybb, n - 1);Triangle(xaa, yaa, xbb, ybb, xcc, ycc); //连接三边中点}}void Fractal_Call(){// 绘制分形三角形// xa,ya;xb,yb;xc,yc;是三角形的初始顶点// n 是三角形的递归层数glClear(GL_COLOR_BUFFER_BIT);//设定颜色缓存中的值glColor3f(1.0, 0.0, 0.0); //设置直线颜色为红色Triangle(Global_xa, Global_ya, Global_xb, Global_yb, Global_xc, Global_yc);//连接三角形顶点Fractal(Global_xa, Global_ya, Global_xb, Global_yb, Global_xc, Global_yc, Global_n);//递归生成分形图形glFlush(); //立即执行}int main(int argc, char ** argv){glutInit(&argc, argv);//初始化GLUT库OpenGL窗口的显示模式glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //初始化窗口的显示模式glutInitWindowSize(600, 600); //设置窗口的尺寸glutInitWindowPosition(100, 100); //设置窗口的位置glutCreateWindow("分形图形绘制");cout << "分形图形绘制" << endl;//输入直线的起点坐标cout << "please input the first point(xa,ya) of the Triangle(Integer that range from 0 to 600): " << endl;cin >> Global_xa;cin >> Global_ya;//输入直线的终点坐标cout << "please input the second point(xb,yb) of the Triangle(Integer range from 0 to 600): " << endl;cin >> Global_xb;cin >> Global_yb;//输入直线的终点坐标cout << "please input the last point(xc,yc) of the Triangle(Integer range from 0 to 600): " << endl;cin >> Global_xc;cin >> Global_yc;//输入直线的终点坐标cout << "please input the recursion layer(n) of the Triangle(Integer range greater than -1): " << endl;cin >> Global_n;init(); //初始化glutDisplayFunc(Fractal_Call); //执行画图程序glutMainLoop(); //启动主GLUT事件处理循环}3、实验结果图3-1 DDA算法绘制直线结果(k=1)图3-2 DDA算法绘制直线结果(k>1)图3-3 DDA算法绘制直线结果(k<-1)图3-4 DDA算法绘制直线结果(0>k>-1)图3-5 四层分形斜三角形图3-6 六层分形正三角形三、实验心得这次实验真的算是一次比较特殊的体验,因为这是我第一次在程序中完全地依赖数学编写程序。

《计算机图形学》实验报告

《计算机图形学》实验报告

实验报告模板《计算机图形学》实验报告一、实验目的及要求1.实习三维图形的坐标系之间的变换;2.三维图形几何变换;3.掌握三维图形的坐标系之间的变换算法及三维图形几何变换的原理和实现;4.实现二维图形的基本变换(平移、旋转、缩放、错切、对称、复合等);5.实现三维图形的基本变换(平移、旋转、缩放、复合等);二、理论基础在齐次坐标理论下,二维图形几何变换矩阵可用下式表示:⎪⎪⎪⎭⎫⎝⎛===ifchebgdaTnkxx kk2,1,0,)(ϕ平移变换:[x* y* 1] =[x y 1] *0000001ts⎛⎫⎪⎪⎪⎝⎭=[t*x s*y 1]比例变换:[x* y* 1]=[x y 1] *1000101m n⎛⎫⎪⎪⎪⎝⎭=[m+x n+y 1]旋转变换:在平面上的二维图形饶原点逆时针旋转Ө角,变换矩阵为[x* y* 1]=[x y 1] *cos sin0sin cos0001θθθθ⎛⎫⎪- ⎪⎪⎝⎭= [x*cosө-y*sinө]复合变换:以上各种变换矩阵都是以原点为参照点,当以任意参照点进行变换的时候,我们就要用到复合变换矩阵。

三维变换类似于二维,在画图时,把三维坐标转换为二维即可。

三、算法设计与分析二维变换:#define dx 50#define dy 100void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+dx;a[1]=m[i][1]+dy;b[0]=m[i+1][0]+dx;b[1]=m[i+1][1]+dy;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define h 0.1745#include<math.h>void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*cos(h)-m[i][1]*sin(h);a[1]=m[i][1]*cos(h)+m[i][0]*sin(h);b[0]=m[i+1][0]*cos(h)-m[i+1][1]*sin(h);b[1]=m[i+1][1]*cos(h)+m[i+1][0]*sin(h);DDALine(a,b, RGB(0, 200, 255), pDC);}}#define k 2;#define f 2.5void CCGWithVCView::OnTransMove() //缩放{// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Scale Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*k;a[1]=m[i][1]*f;b[0]=m[i+1][0]*k;b[1]=m[i+1][1]*f;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define n 2#define d 0void CCGWithVCView::OnTransOther(){// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Other Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+n*m[i][1];a[1]=m[i][1]+d*m[i][0];b[0]=m[i+1][0]+n*m[i+1][1];b[1]=m[i+1][1]+d*m[i+1][0];DDALine(a,b, RGB(0, 200, 255), pDC);}}三维变换:#include<math.h>#define dx 100#define dy 100#define dz 0void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]+dy-p3d[i][0]+dx/sqrt(2);p2d[i][1]=p3d[i][2]+dz+p3d[i][0]+dx/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}#define k 0.1745void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]*cos(k)-p3d[i][2]*sin(k)-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]*cos(k)+p3d[i][1]*sin(k)+p3d[i][0]/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}四、程序调试及结果的分析二维:三维:五、实验心得及建议在实验过程中,尽管过程中任由许多不会的地方,而且有待于今后的提高和改进,但我加深了对书本上知识的理解与掌握,同时也学到了很多书本上没有东西,并积累了一些宝贵的经验,这对我以后的学习与工作是不无裨益的。

计算机图形学实习报告

计算机图形学实习报告

计算机图形学实习报告计算机图形学课程设计实验报告姓名:学号:专业:地理信息系统⼀、课程设计⽬的在掌握图形学的基本原理、算法和实现技术基础上,通过编程实践学会基本的图形软件开发技术。

⼆、课程设计内容仿照Windows的附件程序“画图”, ⽤C++语⾔编制⼀个具有交互式绘制和编辑多种图元功能的程序“Mini-Painter”,实现以下功能对应的设计内容:(1) 能够以交互⽅式在图形绘制区绘制点、直线(折线)、圆(椭圆)、圆弧、多边形、Beizer曲线、封闭区域填充、⽂字等基本图元;(2) 设置线条的颜⾊、线型和线条宽度,对绘制的图元进⾏线条和填充属性的修改;(3) ⽀持图元的点选和基于橡⽪筋技术的圈选;(4) 对选中的图元进⾏平移、缩放、旋转和对称等变换;三、实验步骤1.新建MFC应⽤程序1.1新建⼯程。

运⾏VC++6.0,新建⼀个MFC AppWizard[exe]⼯程,并命名为“0710070118”,选择保存路径,确定。

1.2选择应⽤程序的类型,选择“单⽂档”,则可以通过菜单打开对话框2.建⽴单⽂档应⽤程序,在其中调⽤对话框2.1 查看⼯程资源在单击完成之后,即建⽴了⼀个⼯程,在⼯程的左侧资源视图可以看到MFC向导为该程序提供的⼀些资源。

分别如下所⽰:2.2插⼊对话框资源想在⽂档应⽤程序中,通过单击菜单来打开⼀个对话框,⾸先要建⽴该对话框的资源。

右击“resources ”中的“dialog ”项,在弹出的菜单中选择“插⼊”,打开插⼊菜单对话框,如图所⽰:对话框资源插⼊后,可修改⼀些属性,⽐如标题、字体等等。

在对话框空⽩处右击,选择属性就可打开资源的属性对话框,按照要求设置对话框的属性。

2.3布置对话框界⾯对话框资源插⼊后,即可在该对话框上布置各种需要的控件,并可通过编排菜单的各种命令或“对话”⼯具条调整各控件的⼤⼩,位置,对齐⽅式等,还可以单击对话⼯具条上第⼀个按钮“测试”按钮,看到对话框运⾏时的界⾯。

山东大学计算机图形学实验报告实验二

山东大学计算机图形学实验报告实验二
山东大学计算机科学与技术学院 计算机图形学课程实验报告
学号:2420430689 姓名: QQ
班级: 2014 级
实Байду номын сангаас题目:实现二维平面的基本变换
实验学时:4
实验日期: 2017 年 3 月 28 日
实验目的: 1. 掌握配置 OpenGL 环境的方法; 2. 熟悉 OpenGL 应用程序基本架构; 3. 学习 OpenGL 中的 gl、glu、glut 等库函数进行图形学算法编程和实现。
//填充右部 while (!judgeIfBoundary(x, y)) {
glBegin(GL_POINTS); glVertex2i(x, y); glEnd(); glFlush(); x = x + 1; } int xright = x - 1;
//填充左部 x = savex - 1; while (!judgeIfBoundary(x, y)) {
#include <cmath> #include <stack> #include <glut.h>
using namespace std;
struct mypoint {
GLint x; GLint y;
mypoint(GLint _x, GLint _y) :x(_x), y(_y) {}; mypoint() {}; };
x = x + 1; } } } } } 最后效果
结论分析与体会: 这次实验总的来讲比较繁琐,尤其是在计算校徽坐标的时候,当时是从学校官网 上找了一个比较正规的校徽,用 Windows 的画图工具打开,找出点的坐标然后用 数学方法变换的。
return true; else

西安交大计算机图形学实验报告材料

西安交大计算机图形学实验报告材料

《计算机图形学课内实验》实验报告班级:姓名:学号:日期:一:实验目的及要求(1)理解和掌握计算机中的基本图形绘画算法,包括直线DDA算法,直线Bresenham算法,圆Bresenham算法,椭圆Bresenham算法。

(2)学习MFC类程序编程,巩固提高编程能力。

(3)提高调试纠错能力,提高自学能力。

二:实验环境Windows 8.1系统,Visual Studio 2015 社区版,MFC类库。

三:实验内容直线的DDA算法实现。

四:数据结构与算法描述(1)问题分析设直线方程y=kx+b,该算法从直线端点(x1,y1)开始画点,画到(x2,y2)为止,分|k|<=1和|k|>1两种情况。

|k|<=1时,以横坐标为步进,x每次加1或-1(取决于x1小于x2还是大于x2),y每次加k(k为正数或负数),y以浮点数计算,画点时取整形数,画到另一端点为止。

|k|>1时,方程改为x=y/k-b/k,以纵坐标为步进,y每次加1(取决于y1小于y2还是大于y2),x每次加1/k(1/k为正数或负数),x以浮点数计算,画点时取整形数,画到另一端点为止。

(2)C++代码表示的算法概述:该程序在对话框中输入(x1,y1)(x2,y2)坐标,点击确定后在用户区画线(使用消息处理程序)。

画线算法为程序核心,如下:CDialog::OnOK();UpdateData(TRUE); //将输入对话框的数据送入变量,该对话框类包含四个成员变量://m_x1,m_y1为第一个点坐标,m_x2,m_y2为第二个点坐标CDC* p = k; //创建CDC对象指针,用于调用画点函数p->SetViewportOrg(683, 300); //坐标轴提前画好,原点在(683,300)int i, x = m_x1, y = m_y1;float xi, yi, st, dx = m_x2 - m_x1, dy = m_y2 - m_y1, xf = (float)x, yf = (float)y; st = abs(dx); //设定步进,以下三行代码确定横坐标差和纵坐标差中较大的,abs()为绝对值函数if (abs(dx) < abs(dy))st = abs(dy);xi = dx / st;yi = dy / st; //xi和yi中必有一个为1,用于在下方循环内统一操作p->SetPixel(CPoint(x, -y), RGB(255, 0, 0)); //画初始点,mfc坐标系y轴正方向朝下for (i = 1; i <= st; i++){xf += xi;yf += yi; //用浮点数计算,否则带入画点时小数部分始终被舍去,使得整数无法增加 x = xf;y = yf;p->SetPixel(CPoint(x, -y), RGB(255, 0, 0)); //循环画点Sleep(10);}(3)执行结果事例输入:绘制结果:(4)遇到的问题和解决手段①在编写界面时不知道如何实现在菜单点击后出现上图所示对话框,查询得知需设置消息处理程序打开对话框。

《计算机图形学》实验报告

《计算机图形学》实验报告

《计算机图形学》实验报告一、实验目的计算机图形学是一门研究如何利用计算机生成、处理和显示图形的学科。

通过本次实验,旨在深入理解计算机图形学的基本原理和算法,掌握图形的生成、变换、渲染等技术,并能够运用所学知识解决实际问题,提高对图形学的应用能力和编程实践能力。

二、实验环境本次实验使用的编程语言为 Python,使用的图形库为 Pygame。

开发环境为 PyCharm。

三、实验内容1、直线的生成算法DDA 算法(Digital Differential Analyzer)Bresenham 算法DDA 算法是通过计算直线的斜率来确定每个像素点的位置。

它的基本思想是根据直线的斜率和起始点的坐标,逐步计算出直线上的每个像素点的坐标。

Bresenham 算法则是一种基于误差的直线生成算法。

它通过比较误差值来决定下一个像素点的位置,从而减少了计算量,提高了效率。

在实验中,我们分别实现了这两种算法,并比较了它们的性能和效果。

2、圆的生成算法中点画圆算法中点画圆算法的核心思想是通过判断中点的位置来确定圆上的像素点。

通过不断迭代计算中点的位置,逐步生成整个圆。

在实现过程中,需要注意边界条件的处理和误差的计算。

3、图形的变换平移变换旋转变换缩放变换平移变换是将图形在平面上沿着指定的方向移动一定的距离。

旋转变换是围绕一个中心点将图形旋转一定的角度。

缩放变换则是改变图形的大小。

通过矩阵运算来实现这些变换,可以方便地对图形进行各种操作。

4、图形的填充种子填充算法扫描线填充算法种子填充算法是从指定的种子点开始,将相邻的具有相同颜色或属性的像素点填充为指定的颜色。

扫描线填充算法则是通过扫描图形的每一行,确定需要填充的区间,然后进行填充。

在实验中,我们对不同形状的图形进行了填充,并比较了两种算法的适用情况。

四、实验步骤1、直线生成算法的实现定义直线的起点和终点坐标。

根据所选的算法(DDA 或Bresenham)计算直线上的像素点坐标。

计算机图形学实验报告2

计算机图形学实验报告2

计算机图形学实验报告2计算机图形学实验报告实验⼆、三维⽹格模型光顺⼀、实验⽬的与基本要求:(1)掌握Obj⽂件的读⼊;(2)利⽤给定的数据结构类,建⽴读⼊⽹格模型数据结构;(3)利⽤OpenGL类库,对三维模型进⾏绘制;(4)利⽤OpenGL类库,增加采⽤⿏标交互⽅式对三维模型进⾏旋转、放缩、平移等操作;(5)实现Laplacian⽅法的三维模型光顺操作,并观察三维模型光顺过程;⼆、实验设备(环境)及要求1. 操作系统:Windows XP 或Windows 72. 编程环境:Microsoft Visual Studio 2010,OpenGL 库函数3. 界⾯框架:Win32,MFC,QT选择其中⼀种三、实验内容与步骤实验分为以下⼏个步骤:(1)掌握Obj⽂件的读⼊顶点和⾯的个数;(2)建⽴数组存储点的坐标及⾯上的点数;(3)存储顶点的邻接⾯数,并记录每个顶点周围的邻接点(4)计算每个⾯的法向利⽤OpenGL类库,增加采⽤⿏标交互⽅式对三维模型进⾏旋转、放缩、平移等操作;(5)利⽤⾯法向及顶点坐标进⾏绘制⼏何体(6)实现⿏标对物体旋转、平移、缩放的算法(7)实现Laplacian⽅法的三维模型光顺操作,并观察三维模型光顺过程;四、实现过程说明及成果展⽰:(1)掌握Obj⽂件的读⼊顶点和⾯的个数;由于obj⽂件的存储形式是v x1 x2 x3;…f v1 v2 v3;…这种形式,所以在记录点和⾯的数量时,只需按⾏读取,然后再判断⾸字母是v/f即可实现代码如下:(2)建⽴数组存储点的坐标及⾯上的点数;数组的⼤⼩由点数和⾯数决定,点数组和⾯数组均由0开始记录,故后⾯再⽤⾯对应点的时候,由于⾯上点是从1开始记录,故需要减1然后使⽤,代码如下:(3)存储顶点的邻接⾯数,并记录每个顶点周围的邻接点记录点邻接⾯的是新建⼀个数组,在读⾯的时候,将该⾯的序号存⼊对应点的数组中,然后再在每个⾯上取⼀点,记录到点的邻接点数组中,在每个⾯上取得的点为向外右⼿⽅向的下⼀个点,实现代码如下:(4)计算每个⾯的法向计算⾯的法向⽅式为⾯上右⼿⽅向上的两向量的叉乘得到,即所⽤代码为:(8)利⽤⾯法向及顶点坐标进⾏绘制⼏何体⽤法向绘制的⽅式是先⽤glNormal3fv(v)指出⾯的法向;再⽤glVertex3f传⼊⾯上点的坐标;由于我将glNormal3fv(v)中写在算法向所以我直接对此直接调⽤即可,代码如下:(9)实现⿏标对物体旋转、平移、缩放的算法平移:利⽤Transform函数和键盘事件来改变参数,w,s,a,d分别控制绘制的kitty猫的上下左右的移动:实现代码如下:旋转:利⽤gllookat();函数设定了观察⾓度,并⽤⿏标事件改变参数,⽤实现观察视⾓的变化实现物体的旋转,代码如下:缩放:运⽤glScalef⽅法和键盘事件改变参数,实现物体的放⼤和缩⼩,代码如下:(10)实现Laplacian⽅法的三维模型光顺操作,并观察三维模型光顺过程;Laplacian⽅法的原理是利⽤⽬标点与其所有邻接点平均后的点的差向量,对⽬标点的坐标进⾏变换的过程,具体⽅法是:①建⽴每个点的邻接顶点数组,存储每个点的邻接点②对每个顶点的邻接点进⾏求平均,即将邻接点的坐标求和后除以邻接点个数,从⽽得到邻接平均点③得到优化向量优化向量= 邻接平均点-⽬标点④设定优化度参数λ,得到优化后的新坐标新坐标= ⽬标点+ λ*优化向量在程序中,对于第num个顶点,我设定的变量为邻接平均点v0优化向量l新坐标数组vNewArr具体代码如下:五、结果展⽰及说明计算⾯法向后直接绘制(未光顺):光顺进⾏⼀次后光顺多次后利⽤点绘制结果为旋转后缩放后平移后六、⼼得体会(1)计算⾯法向时法向量的⽅向没有运⽤右⼿⽅向,导致有的⾯法向向⾥,从⽽出现雪花(2)在运⽤Laplacian算法进⾏求邻接平均点时未初始化邻接平均点数组,导致平均点的累加从⽽出现越光顺越粗糙的现象(3)在obj⽂件中⾯对应顶点数和顶点数组的标号相差1.在运⽤的时候需减1,⾯从1开始记顶点,顶点数组从0开始记顶点七、实验代码#define GLUT_DISABLE_ATEXIT_HACK#include#include#include#include#include#include#include#includeusing namespace std;int v_num = 0; //记录点的数量int f_num = 0; //记录⾯的数量int vn_num = 0;//记录法向量的数量int vt_num = 0;GLfloat **vArr; //存放点的⼆维数组GLfloat **vNewArr;//存放点的⼆维数组int **fvArr; //存放⾯顶点的⼆维数组GLfloat **fnArr;//存放⾯法向量的⼆维数组int **ftArr;int **vfArr;//存放顶点临接的⾯数的数组int **nextVArr;//存放下⼀个临界顶点的数组GLfloat **vnArr;//存放点法向量的⼆维数组string s1, s2, s3, s4;GLfloat f2, f3, f4;int num1, num2, num3;typedef GLfloat point3[3];point3 x, y,l;//平⾯上的两个向量x,y和拉普拉斯向量lstatic GLfloat theta[] = { 0.0,0.0,0.0 };static GLint axis = 2;static GLdouble viewer[] = { 0.0, 0.0, 5.0 }; /* initial viewer location */ static GLdouble Tran[] = { 0.0,0.0,0.0 }; static GLdouble sca = 1.0;void getLineNum(string addrstr) //获取点和⾯的数量{ifstream infile(addrstr.c_str()); //打开指定⽂件if (!infile) {cout <<"open error!"<< endl;}string sline;//每⼀⾏int i = 0, j = 0;while (getline(infile, sline)) //从指定⽂件逐⾏读取{if (sline[0] == 'v'){v_num++;}if (sline[0] == 'f'){f_num++;}}}int readfile(string addrstr) //将⽂件内容读到数组中去{//getLineNum(addrstr);//new⼆维数组vArr = new GLfloat*[v_num];for (int i = 0; i < v_num; i++) {vArr[i] = new GLfloat[3];}vNewArr = new GLfloat*[v_num];for (int i = 0; i < v_num; i++) {vNewArr[i] = new GLfloat[3]; }vnArr = new GLfloat*[vn_num];for (int i = 0; i < vn_num; i++) {vnArr[i] = new GLfloat[3];}vfArr = new int*[v_num];for (int i = 0; i < v_num; i++) {vfArr[i] = new int[10];for (int j = 0; j < 10; j++) { vfArr[i][j] = -1;}}nextVArr = new int*[v_num];for (int i = 0; i < v_num; i++) {nextVArr[i] = new int[10];for (int j = 0; j < 10; j++) { nextVArr[i][j] = -1; }}fvArr = new int*[f_num];fnArr = new GLfloat*[f_num];ftArr = new int*[f_num];for (int i = 0; i < f_num; i++) {fvArr[i] = new int[3];fnArr[i] = new GLfloat[3];ftArr[i] = new int[10];}ifstream infile(addrstr.c_str()); if (!infile) { cout <<"open error!"<< endl;exit(1);}string sline;//每⼀⾏int ii = 0, jj = 0, kk = 0, mm = 0;while (getline(infile, sline)){if (sline[0] == 'v')//存储点{istringstream sin(sline);sin >> s1 >> f2 >> f3 >> f4;vArr[ii][0] = f2;vArr[ii][1] = f3;vArr[ii][2] = f4;ii++;}if (sline[0] == 'f') //存储⾯{istringstream in(sline);GLfloat a;in >> s1>>num1>>num2>>num3;//去掉f fvArr[kk][0] = num1;fvArr[kk][1] = num2;fvArr[kk][2] = num3;for (int i = 0; i < 10; i++) {if (vfArr[num1-1][i] == -1) {vfArr[num1-1][i] = kk;nextVArr[num1-1][i] = num2;break;}}for (int j = 0; j < 10; j++) {if (vfArr[num2-1][j] == -1) {vfArr[num2-1][j] = kk;nextVArr[num2-1][j] = num3;break;}}for (int i = 0; i < 10; i++) {if (vfArr[num3-1][i] == -1) {vfArr[num3-1][i] = kk;nextVArr[num3-1][i] = num1;break;}}kk++;}}return 0;}//计算⾯法向void nomal(point3p) {/*⽮量的归⼀化*///double sqrt();float d = 0.0;int i;for (i = 0; i < 3; i++)d += p[i] * p[i];d = sqrt(d);if (d > 0.0)for (i = 0; i < 3; i++)p[i] /= d;}void getFaceNormal(point3A, point3B, point3C) { x[0] = C[0] - A[0]; x[1] = C[1] - A[1];x[2] = C[2] - A[2];y[0] = A[0] - B[0];y[1] = A[1] - B[1];y[2] = A[2] - B[2];point3 v;v[0] = x[1] * y[2] - x[2] * y[1];v[1] = x[2] * y[0] - x[0] * y[2];v[2] = x[0] * y[1] - x[1] * y[0];nomal(v);glNormal3fv(v);}void Laplacian() {for (int num = 0; num < v_num; num++) {int m = 0;//求得点的邻接⾯数for (int i = 0; i < 10; i++) {if (nextVArr[num][i] != -1) {m++;}else {break;}}point3 v0;for (int i = 0; i < 3; i++) {v0[i] = 0;}for (int i = 0; i < m; i++) {v0[0] += vArr[nextVArr[num][i] - 1][0];v0[1] += vArr[nextVArr[num][i] - 1][1];v0[2] += vArr[nextVArr[num][i] - 1][2];}if (m != 0) {for (int i = 0; i < 3; i++)v0[i] /= m;}l[0] = v0[0] - vArr[num][0];l[1] = v0[1] - vArr[num][1];l[2] = v0[2] - vArr[num][2];vNewArr[num][0] = vArr[num][0] + l[0] * 0.3;vNewArr[num][1] = vArr[num][1] + l[1] * 0.3;vNewArr[num][2] = vArr[num][2] + l[2] * 0.3;}for (int i = 0; i < v_num; i++) {vArr[i][0] = vNewArr[i][0];vArr[i][1] = vNewArr[i][1];vArr[i][2] = vNewArr[i][2];}}void init(void){getLineNum("H:\\kitten_noisy.obj");readfile("H:\\kitten_noisy.obj");double viewer[] = { 0.0, 0.0, 8.0 }; /* initial viewer location */GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };GLfloat mat_shininess[] = { 50.0 };//材料的镜⾯指数,其值越⼤越精细GLfloat light_position[] = { 1.0, 1.0f, 1.0, 0.0 };GLfloat white_light[] = { 1.0, 1.0, 1.0, 1.0 };GLfloat lmodel_ambient[] = { 0.1, 0.1, 0.1, 1.0 };glClearColor(0.0, 0.0, 0.0, 0.0);glShadeModel(GL_SMOOTH);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);glLightfv(GL_LIGHT0, GL_POSITION, light_position);//光源位置glLightfv(GL_LIGHT0, GL_DIFFUSE, white_light);//漫反射光源glLightfv(GL_LIGHT0, GL_SPECULAR, white_light);//镜⾯反射光源glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);//环境光源// glEnable(glMaterialf);glEnable(GL_LIGHTING);//启动光照glEnable(GL_LIGHT0);//启⽤0度光源glEnable(GL_DEPTH_TEST);//启动深度测试/*glShadeModel(GL_SMOOTH); // Enable Smooth ShadingglClearColor(0.0f, 0.0f, 0.0f, 0.5f); // ⿊⾊背景glClearDepth(1.0f);// 深度缓冲区设置glEnable(GL_DEPTH_TEST); // 允许深度测试glDepthFunc(GL_LEQUAL);// 定义深度测试类型glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculation */}。

图形学实验报告2分解

图形学实验报告2分解
#endif
/////////////////////////////////////////////////////////////////////////////
// CTransformView
IMPLEMENT_DYNCREATE(CTransformView, CView)
BEGIN_MESSAGE_MAP(CTransformView, CView)
}
/////////////////////////////////////////////////////////////////////////////
// CTransformView printing
BOOL CTransformView::OnPreparePrinting(CPrintInfo* pInfo)
//{{AFX_MSG_MAP(CTransformView)
ON_COMMAND(ID_MENU_TRANSFORM_TRANSLATE, OnMenuTransformTranslate)
ON_COMMAND(ID_MENU_TRANSFORM_SCALE, OnMenuTransformScale)
#include "TransformDoc.h"
#include "TransformView.h"
#include <math.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
{
// default preparation
return DoPreparePrinting(pInfo);

计算机图形学实验报告

计算机图形学实验报告

计算机图形学实验报告引言计算机图形学是计算机科学中一个重要的研究领域,它涉及了计算机图像的生成、处理和显示等方面的技术。

本次实验旨在通过实际操作学习计算机图形学的相关知识,并利用图形学算法实现一些有趣的效果。

实验目的1. 了解计算机图形学的基本概念和发展历程;2. 掌握图形学中的基本几何变换,如平移、旋转和缩放等;3. 实现一些常见的图形学算法,如光照模型、三角形剪裁和绘制等。

实验准备在开始实验之前,我们需要准备一些实验所需的工具和环境。

首先,确保计算机上安装了图形学相关的软件,如OpenGL或DirectX等。

其次,为了编写和运行图形学程序,我们需要掌握基本的编程技巧,如C++或Python语言,并了解相关的图形库和API。

实验过程1. 实现平移、旋转和缩放首先,我们需要掌握图形学中的基本几何变换,如平移、旋转和缩放。

通过矩阵运算,我们可以很方便地实现这些变换。

例如,对于一个二维点P(x, y),我们可以通过以下公式实现平移:P' = T * P其中,P'是平移后的点,T是平移矩阵。

类似地,我们可以用旋转矩阵和缩放矩阵来实现旋转和缩放效果。

2. 实现光照模型光照模型是指在计算机图形学中模拟现实光照效果的一种方法。

它可以提供更真实的视觉效果,让计算机生成的图像更加逼真。

其中,常用的光照模型有环境光照、漫反射光照和镜面光照等。

通过计算每个像素的光照强度,我们可以实现阴影效果和光源反射等功能。

3. 实现三角形剪裁三角形剪裁是计算机图形学中一种常用的几何算法,用于确定哪些像素需要绘制,哪些像素需要剔除。

通过对三角形的边界和视口进行比较,我们可以快速计算出剪裁后的三角形顶点,以提高图形渲染的效率。

4. 实现图形绘制图形绘制是计算机图形学中的核心内容,它包括了点、线和面的绘制等。

通过设定顶点坐标和属性(如颜色、纹理等),我们可以使用算法绘制出各种形状的图像。

其中,常用的绘制算法有Bresenham算法和扫描线算法等。

计算机图形学实验报告

计算机图形学实验报告

报告内容概述●概述:计算机图形学的概念/发展历史/中国计算机图形学的发展/著名公司●技术章节:计算机图形学的一般框架/研究内容/相关技术算法●人才文章:领导人物/骨干力量/年轻学者●会议文章:在各地举行的会议●应用:计算机图形学在各个领域的应用●趋势:计算机图形学的发展趋势1.概述1.1计算机图形学的概念(1)什么是计算机图形学?关于计算机图形的定义有不同的意见。

IEEE将计算机图形学定义为:计算机图形学是借助计算机生成图形图像的艺术或科学。

国际标准化组织(ISO)将计算机图形定义为:计算机图形学是一门研究计算机,将数据通过计算机转换为图形并将其显示在特殊显示设备上的原理,方法和技术的学科。

它是基于传统图形理论,应用数学和计算机科学的边缘学科。

综上所述,计算机图形学是研究如何通过计算机显示,生成和处理图形的原理,方法和技术的学科。

图形在这里是指3D图形的处理。

(2)相关概念的区别计算机图形学的基本含义是使用计算机通过算法和程序在显示设备上构造图形。

图形是由人们通过计算机设计和构造的,而不是由照相机,扫描仪和其他设备输入的图像。

这里的图形可以是现实存在的图形,也可以是完全以虚拟方式构建的图形。

它以矢量图的形式呈现,强调了场景的几何表示并记录了图形的形状参数和属性参数。

例如,工程图的最基本图形单位是点,线,圆/弧等,其信息包括图元的几何信息和属性信息(显性属性,例如颜色,线型和线宽以及隐式属性例如层次结构)。

图像处理是分析和处理图像的过程。

图像处理研究图像添加,模式识别,场景分析等。

研究对象通常是二维图像。

图像以位图的形式显示,并记录每个点的灰度或颜色。

例如,照片,扫描的图片,逼真的和非逼真的图像以及计算机生成的形状等。

最基本的像素(象素)是点像素,它们的信息实际上是点及其属性信息(颜色,灰度),亮度等)。

计算机视觉包括更一般意义上的获取,处理,分析和理解图像或真实世界的高维数据的方法。

其目的是生成决策形式的数字或符号信息。

工作报告之计算机图形学实验报告

工作报告之计算机图形学实验报告

工作报告之计算机图形学实验报告计算机图形学实验报告【篇一:计算机图形学实验报告及代码】第1 章概述一、教学目标通过本章的学习,使学生能够了解计算机图形学的基本概念、研究内容;当前的发展概况;本门课程的特点和应用。

二、教学要求1. 了解计算机图形学的概念和研究内容;2. 了解本门课程的发展概况。

三、教学内容提要1. 计算机图形学的研究内容2. 计算机图形学发展概况3. 计算机图形学特点和应用4. 计算机图形学当前研究的课题5. 计算机图形生成和输出的流水线四、教学重点、难点及解决方法本章将主要围绕计算机图形学的基本概念进行介绍,介绍研究内容;当前的发展概况;本门课程的特点和应用等等。

五、课时安排2学时六、教学设备多媒体七、检测教学目标实现程度的具体措施和要求通过课堂提问的方式来检测学生对基本概念的掌握程度。

八、教学内容1.1 计算机图形学的研究内容计算机图形学(computer graphics): 研究通过计算机将数据转换为图形,并在专用显示设备上显示的原理、方法和技术的学科。

计算机图形表现形式(1).线条式(线框架图)用线段来表现图形,容易反映客观实体的内部结构,如各类工程技术中结构图的表示,机械设计中零件结构图及电路设计中的电路原理图等。

具有面模型、色彩、浓淡和明暗层次效应,适合表现客观实体的外形或外貌,如汽车、飞机、轮船等的外形设计以及各种艺术品造型设计等。

(2).真实感面模型图形跑车靓照计算机图形分类(空间)(1).二维图形(2d):在平面坐标系中定义的图形(2).三维图形(3d):在三维坐标系中定义的图形计算机图形产生方法(1).矢量法(短折线法)任何形状的曲线都用许多首尾相连的短直线(矢量)逼近。

(2).描点法(像素点串接法)每一曲线都是由一定大小的像素点组成计算机绘图方式:(1)交互式绘图允许操作者以某种方式(对话方式或命令方式)来控制和操纵图形生成过程,使得图形可以边生成、边显示、边修改,直至符合要求为止。

计算机图形学实验报告

计算机图形学实验报告
等领域。
实验内容:通 过实验掌握光 照模型的原理 和实现方法, 了解不同光照 模型对物体表 面光照效果的
影响。
纹理映射
定义:将纹理图像映射到三维物 体表面的过程
方法:根据物体表面的几何形状, 将纹理图像按照一定的规则和算 法进行拉伸、扭曲和拼接等操作, 最终覆盖在物体表面
添加标题
添加标题
添加标题
添加标题
提高编程能力
熟练使用相关编程语言和工 具
掌握计算机图形学的基本原 理和算法
学会分析和解决图形学中的 问题
提高编程技巧和解决问题的 能力
02
实验内容
图形渲染流程
加载场景和模型 设置相机和光源 几何着色器处理顶点数据 光栅化着色器生成像素数据
OpenGL基本操作
创建窗口:使用OpenGL创建 窗口,设置渲染上下文
熟悉图形渲染流程
了解图形渲染的 基本原理和流程
掌握图形渲染的 关键技术和技巧
熟悉图形渲染的 应用场景和优势
Hale Waihona Puke 掌握图形渲染的 未来发展方向和 趋势
掌握OpenGL的使用
学习OpenGL的基本概念和原理 掌握OpenGL的编程接口和开发流程 理解OpenGL在计算机图形学中的应用和优势 学会使用OpenGL进行基本的图形渲染和交互操作
目的:增加物体的表面细节和真 实感
应用:游戏开发、电影制作、虚 拟现实等领域
03
实验过程
实验环境搭建
安装操作系统: 选择适合的操
作系统,如 Windows或
Linux
安装开发工具: 安装所需的集
成开发环境 (IDE)和编
译器
安装图形库: 安装OpenGL、
DirectX或其 他的图形库

《计算机图形学》实验2实验报告

《计算机图形学》实验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) 使用当前颜色画圆角矩形。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
void CRectangleDlg::OnLButtonUp(UINT nFlags, CPoint point)
{
lButtonDownNotUp=FALSE;
CDialog::OnLButtonUp(nFlags, point);
}
实验
一、
二、
1、掌握DDA、Bresenham直线生成算法;
2、画圆:
void CMyCG::LineDDA2(int xa, int ya, int xb, int yb, CDC *pDC)
{
int dx = xb - xa;
int dy = yb - ya;
int Steps, k;
float xIncrement,yIncrement;
float x = xa,y= ya;
{
regionLeftTopTemp = point;
}
CDialog::OnLButtonDown(nFlags, point);
}
void CRectangleDlg::OnMouseMove(UINT nFlags, CPoint point)
{
RECT rect;
m_showRectangle. GetClientRect( &rect );
2、掌握Bresenham或中点圆生成算法;
3、掌握Bresenham或中点椭圆生成算法;
三、
1、实现DDA、Bresenham直线生成算法;
2、实现Bresenham画圆法或中点画圆法;
3、实现Bresenham或中点法椭圆生成算法;
4、利用1、2、3实现的直线、圆、椭圆图形生成函数进行图形绘制;
{
double dx,dy,e,x,y;
if(abs(dx)>abs(dy))
Steps = abs(dx);
else
Steps = abs(dy);
xIncrement = dx/(float)Steps;
yIncrement = dy/(float)Steps;
pDC->SetPixel(ROUND(x),ROUND(y),RGB(0,0,0));
4、学会使用基本绘图函数和Window GDI对象;
三、
创建基于MFC的Single Document应用程序(Win32应用程序也可,同学们可根据自己的喜好决定),程序可以实现以下要求:
1、用户可以通过菜单选择绘图颜色;
2、用户点击菜单选择绘图形状时,能在视图中绘制指定形状的图形;
四、
1、建立名为“颜色”的菜单,该菜单下有四个菜单项:红、绿、蓝、黄。
3、所有图形的绘制算法都必须封装在CMyGL类中,如下图。
4、在View类中实例化一个CMyGL类的对象,比如m_gl,进行绘图操作。如下图所示:
5、用户通过点击“图形绘制”中不同的菜单项,在指定位置进行绘图。
五、
六、
1、画直线:
void CDraw::DDALine(CDC* pDC, int x1, int y1, int x2, int y2, COLORREF color)
CDC * pDC = m_showRectangle. GetWindowDC ();
pDC -> Rectangle( CRect( regionLeftTopTemp, regionRightBottomTemp ) ) ;
}
}
CDialog::OnMouseMove(nFlags, point);
四、
1、按照实验指导书1.6节创建一个基于MFC的Single Document应用程序。建立名为“图形绘制”的菜单,该菜单的子菜单项可根据下图进行设定,用户通过点击不同的子菜单项,可以选择不同的算法进行绘图。
2、建立一个专门用于进行图形绘制的类,比如下图所示的CMyGL类。如无特殊说明,今后都以该类作为演示。
if( ( point.x<rect.right ) && ( point.x>rect.left ) && ( point.y<rect.bottom ) && ( point.y>rect.top ) )
{
if( ( lButtonDownNotUp == TRUE )
{
regionRightBottomTemp = point;
for(k=0;k<Steps;k++)
{Байду номын сангаас
x +=xIncrement;
y +=yIncrement;
sleep(10);
pDC->SetPixel(ROUND(x),ROUND(y),RGB(0,0,0));
}
3、画矩形
void CRectangleDlg::OnLButtonDown(UINT nFlags, CPoint point)
m_pDC=new CClientDC(this);
在OnDraw函数中添加:
m_pDC=new CClientDC(this);
m_pDC->MoveTo(10,10);
m_pDC->LineTo(100,100);
m_pDC->SetPixel(100,200,RGB(0,0,0));
m_pDC->TextOut(100,100);
中南大学信息科学与工程学院
实验报告
实验名称
实验地点科技楼四楼
实验日期2014年6月
指导教师
学生班级
学生姓名
学生学号
提交日期2014年6月
实验一
一、
二、
1、熟练使用实验主要开发平台VC6.0;
2、掌握如何在编译平台下编辑、编译、连接和运行一个简单的Windows图形应用程序;
3、掌握Window图形编程的基本方法;
用户通过点击不同的菜单项,可以选择不同的颜色进行绘图。
2、建立名为“绘图”的菜单,该菜单下有三个菜单项:直线、曲线、矩形
其中“曲线”项有级联菜单,包括:圆、椭圆。
3、用户通过点击“绘图”中不同的菜单项,弹出对话框,让用户输入绘图位置,在指定位置进行绘图。
五、
六、
1、画直线:CClientDC *m_pDC;再在OnDraw函数里给变量初始化
{
lButtonDownNotUp = TRUE;
RECT rect;
m_showRectangle. GetClientRect( &rect ) ;
if( (point. x<rect. right) && (point. x>rect. left) && (point. y<rect. bottom) && (point. y>rect. top) )
相关文档
最新文档