计算机图形学报告Word文档下载推荐.docx
- 文档编号:6403983
- 上传时间:2023-05-06
- 格式:DOCX
- 页数:35
- 大小:107.44KB
计算机图形学报告Word文档下载推荐.docx
《计算机图形学报告Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《计算机图形学报告Word文档下载推荐.docx(35页珍藏版)》请在冰点文库上搜索。
voidCALLBACKreshapae(GLsizeiw,GLsizeih);
voidCALLBACKdisplay();
GLfloats,h;
//回调函数,绘制窗口时调用
voidCALLBACKdisplay()
{
//清空窗口设置背景为白色
glClearColor(1,1,1,1);
glClear(GL_COLOR_BUFFER_BIT);
//取景变换
glLoadIdentity();
gluLookAt(5,5,h,s,0,0,0,1,0);
//glRotatef(30,1,1,0);
//设置前景色为黑色
glColor3f(0,0,0);
//绘图开始,两条水平平行线
GLfloatRAD=3.1415926/180;
GLfloatx,y,z,r;
inti,j;
for(i=0;
i<
180;
i+=5)
{
glBegin(GL_LINE_LOOP);
r=2*sin(i*RAD);
z=2*cos(i*RAD);
for(j=0;
j<
=360;
j+=10)
{
x=r*cos(j*RAD);
y=r*sin(j*RAD);
glVertex3f(x,y,z);
}
glEnd();
}
for(j=0;
360;
for(i=0;
i<
=180;
r=2*sin(i*RAD);
z=2*cos(i*RAD);
y=r*sin(j*RAD);
glVertex3f(x,y,z);
//清空帧缓存
glFlush();
}
//OpenGL初始化,设置颜色为单一着色模式
voidinit()
glShadeModel(GL_FLAT);
s=0;
h=5;
//回调函数,窗口初始化和大小改变时,调用此函数
voidCALLBACKreshape(GLsizeiw,GLsizeih)
//设置当前矩阵为投影变换矩阵
glMatrixMode(GL_PROJECTION);
//设置投影变换
gluPerspective(30,1,-3,3);
//设置当前矩阵为模式变换矩阵
glMatrixMode(GL_MODELVIEW);
//设置视区变换
glViewport(0,0,w,h);
voidCALLBACKLeft()
s+=0.1;
voidCALLBACKRight()
s-=0.1;
voidCALLBACKUp()
h-=0.1;
voidCALLBACKDown()
h+=0.1;
voidmain()
//设置OpenGL的显示模式:
单缓存、RGB模式
auxInitDisplayMode(AUX_SINGLE|AUX_RGB);
//设置窗口位置、大小和标题
auxInitPosition(0,0,300,300);
auxInitWindow("
OpenGLDemo"
);
init();
//设置回调函数
auxKeyFunc(AUX_LEFT,Left);
auxKeyFunc(AUX_RIGHT,Right);
auxKeyFunc(AUX_UP,Up);
auxKeyFunc(AUX_DOWN,Down);
auxReshapeFunc(reshape);
auxMainLoop(display);
5.实验心得:
对vc下opengl的配置还是花费了很多时间,通过本次试验,熟悉了OpenGL基本图元函数的使用,通过使用OpenGL及GLUT库在Visual
C++环境下编写图形绘制程序掌握图形绘制的一般框架,从而为进一步做综合性的图形绘制实验奠定基础。
实验二:
OpenGL绘制正方体
本实验要求对绘制的简单场景(可以自己拟定)综合利用几何变换或gluLookAt函数实现交互式三维观察程序,从而通过本实验加深理解计算机图形学中的三维图形绘制流程的工作原理。
根据“正四面体镂空线框图”的源代码发挥自己的想象力,可以改成:
立方体的镂空线框图(冻豆腐或奶酪)、菱形、空间围棋的棋盘、金字塔......;
同时,借鉴前两节课完成的球体线框图的代码,使得完成的图形视角可控,既可以旋转视角,也可以“拉近和推远”。
对于绘制的图形通过键盘移动视点,利用鼠标或键盘控制立方体的旋转方向,从不同角度观察正方体
再确定点坐标,在源代码基础上更改
通过VC++进行编译
程序运行后,弹出窗口,使用鼠标拖动可使正方体旋转
stdio.h>
gl/glut.h>
constdoublePI=3.1415926;
constfloatMIN_LEN=0.001;
constfloatLEN=0.6;
constfloatg_ax=0,g_ay=0,g_az=0;
constfloatg_bx=0,g_by=0,g_bz=LEN;
constfloatg_cx=LEN,g_cy=0,g_cz=0;
constfloatg_dx=LEN,g_dy=0,g_dz=LEN;
constfloatg_ex=0,g_ey=LEN,g_ez=0;
constfloatg_fx=0,g_fy=LEN,g_fz=LEN;
constfloatg_gx=LEN,g_gy=LEN,g_gz=0;
constfloatg_hx=LEN,g_hy=LEN,g_hz=LEN;
///窗口宽度
intg_width=720;
///窗口高度
intg_height=600;
///鼠标器左键是否按下
boolmouse_button_pressed=false;
///记录鼠标器位置
intmouse_x;
intmouse_y;
///旋转的纬度
floattheta=0;
///旋转的经度
floatphi=0;
/**
鼠标按钮回调函数
*/
voidmouse(intbutton,intstate,intx,inty)
if(button==GLUT_LEFT_BUTTON)
if(state==GLUT_DOWN)
//如果鼠标器左键按下,mouse_button_pressed置位
//并记录光标位置
mouse_button_pressed=true;
mouse_x=x;
mouse_y=y;
else
mouse_button_pressed=false;
鼠标运动处理函数
voidmotion(intx,inty)
if(mouse_button_pressed)
theta-=y-mouse_y;
//根据鼠标器的移动改变旋转的纬度
if(theta<
0)theta+=360;
//限制纬度在0到180度之间
if(theta>
360)theta-=360;
phi+=x-mouse_x;
//根据鼠标器的移动改变旋转的经度
if(phi<
0)phi+=360;
//限制经度在0到360度之间
if(phi>
360)phi-=360;
//更新记录的鼠标器位置
glutPostRedisplay();
//通知系统:
窗口需要刷新
点类
classpoint3d{
public:
floatx;
floaty;
floatz;
point3d(float_x,float_y,float_z){x=_x;
y=_y;
z=_z;
point3d(point3d&
p){x=p.x;
y=p.y;
z=p.z;
point3dmiddle(point3d&
p2){returnpoint3d((x+p2.x)/2,(y+p2.y)/2,(z+p2.z)/2);
floatbetween(point3d&
p2){return(x-p2.x)*(x-p2.x)+(y-p2.y)*(y-p2.y)+(z-p2.z)*(z-p2.z);
};
绘制Seripinski锥体
三点坐标为a(x1,y1,z1),b(x2,y2,z2),c(x3,y3,z3)
voidseripinski(point3d&
a,point3d&
b,point3d&
c,point3d&
d,point3d&
e,point3d&
f,point3d&
g,point3d&
h)
if(a.between(b)<
MIN_LEN)return;
//绘制锥体
glBegin(GL_LINES);
glVertex3f(a.x,a.y,a.z);
glVertex3f(b.x,b.y,b.z);
glVertex3f(c.x,c.y,c.z);
glVertex3f(e.x,e.y,e.z);
glVertex3f(d.x,d.y,d.z);
glVertex3f(g.x,g.y,g.z);
glVertex3f(f.x,f.y,f.z);
glVertex3f(h.x,h.y,h.z);
glEnd();
//line(x0,y0,x1,y1);
line(x1,y1,x2,y2);
line(x2,y2,x3,y3);
\b主处理回调函数,每当需要重画时由OpenGL库调用
\b该函数功能是调用seripinski,绘制seripinski锥体
voidmain_display_loop(void)
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
//刷新背景
glMatrixMode(GL_PROJECTION);
//设置矩阵模式为投影矩阵
//初始化投影矩阵
glOrtho(-1,1,-1,1,-1,1);
//设置平行投影的投影矩阵
glRotatef(phi,0,1,0);
//绕y轴旋转OCS,旋转的角度为phi
glRotatef(theta,1,0,0);
//绕x轴旋转OCS,旋转的角度为theta
seripinski(point3d(g_ax,g_ay,g_az),point3d(g_bx,g_by,g_bz),point3d(g_cx,g_cy,g_cz),point3d(g_dx,g_dy,g_dz),point3d(g_ex,g_ey,g_ez),point3d(g_fx,g_fy,g_fz),point3d(g_gx,g_gy,g_gz),point3d(g_hx,g_hy,g_hz));
//更新窗口
//glutSwapBuffers();
OPENGL特性初始化函数
init()
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);
glClearColor(0,0,0,1);
glClearDepth
(1);
glColor3b(90,0,85);
///主函数
intmain(intargc,char*argv[])
glutInit(&
argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA);
glutInitWindowSize(g_width,g_height);
glutCreateWindow("
OpenGL"
glutMouseFunc(mouse);
glutMotionFunc(motion);
glutDisplayFunc(main_display_loop);
glutMainLoop();
return0;
通过本次实验,对绘制的简单场景综合利用几何变换或gluLookAt函数实现三维观察程序,从而通过本实验加深理解计算机图形学中的三维图形绘制流程的工作原理并且对分形学有一定的了解。
实验三:
裁剪与填充
利用vc实现对直线段的裁剪、实现对二维封闭几何图形的颜色填充
在二维观察中,需要在观察坐标系下对窗口进行裁剪,即
只保留窗口内的那部分图形,去掉窗口外的图形。
对二维几何图形内外进行不同颜色的填充。
使用easyX对vc添加图形库;
依据课本上算法、步骤或程序流程图,用VC++语言编写源程序;
编辑源程序并进行调试;
进行运行测试,并结合情况进行调整;
对运行结果进行保存与分析;
Cohen-sutherland裁减算法运行显示原直线,按任意键显示裁剪后直线
include<
graphics.h>
#include<
#defineLEFT1
#defineRIGHT2
#defineBOTTOM4
#defineTOP8
intencode(floatx,floaty,floatXL,floatXR,floatYB,floatYT)
{intc=0;
if(x<
XL)c|=LEFT;
if(x>
XR)c|=RIGHT;
if(y<
YB)c|=BOTTOM;
if(y>
YT)c|=TOP;
returnc;
//floatx1,y1,x2,y2,XL,XR,YB,YT;
voidC_S_Line_Clip(floatx1,floaty1,floatx2,floaty2,floatXL,floatXR,floatYB,floatYT)
{
intcode1,code2,code;
intx,y;
code1=encode(x1,y1,XL,XR,YB,YT);
code2=encode(x2,y2,XL,XR,YB,YT);
//printf("
%d\n"
code1);
code2);
while(code1!
=0||code2!
=0)
{if((code1&
code2)!
=0){//printf("
code1&
code2);
return;
if(code1!
code=code1;
else
code=code2;
if((LEFT&
code)!
{x=XL;
y=y1+(y2-y1)*(XL-x1)/(x2-x1);
elseif((RIGHT&
{x=XR;
y=y1+(y2-y1)*(XR-x1)/(x2-x1);
elseif((BOTTOM&
{y=YB;
x=x1+(x2-x1)*(YB-y1)/(y2-y1);
elseif((TOP&
{y=YT;
x=x1+(x2-x1)*(YT-y1)/(y2-y1);
if(code==code1)
{x1=x;
y1=y;
code1=encode(x,y,XL,XR,YB,YT);
{x2=x;
y2=y;
code2=encode(x,y,XL,XR,YB,YT);
cleardevice();
%f%f%f%f\n"
x1,x2,y1,y2);
//getchar();
intmain()
{intx1=12,x2=560,y1=202,y2=25;
intXL=50,XR=400,YB=50,YT=150;
intgdriver=DETECT,gmode;
initgraph(640,480);
getchar();
//line(XL,YB,XR,YT);
C_S_Line_Clip(x1,y1,x2,y2,XL,XR,YB,YT);
closegraph();
Vc下扫描线种子填充算法
stdlib.h>
string.h>
conio.h>
malloc.h>
#defineMaxSize100
voidfloodfill8(intx,inty,intoldcolor,intnewcolor)
if(getpixel(x,y)==oldcolor)
putpixel(x,y,newcolor);
//Sleep(10);
floodfill8(x,y+1,oldcolor,newcolor);
floodfill8(x,y-1,oldcolor,newcolor);
floodfill8(x-1,y,oldcolor,newcolor);
floodfill8(x+1,y,oldcolor,newcolor);
floodfill8(x+1,y+1,oldcolor,newcolor);
floodfill8(x+1,y-1,oldcolor,newcolor);
floodfill8(x-1,y+1,oldcolor,newcolor);
floodfill8(x-1,y-1,oldcolor,newcolor);
typedefstruct{
intx;
inty;
}Seed,ElemType;
typedefstruct
ElemTypedata[MaxSize];
inttop;
//栈顶指针
}SqStack;
voidInitStack(SqStack*&
s)
s=(SqStack*)malloc(sizeof(SqStack));
s->
top=-1;
int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 报告