计算机图形学模拟太阳系源代码

时间:2019-05-14 18:08:20下载本文作者:会员上传
简介:写写帮文库小编为你整理了多篇相关的《计算机图形学模拟太阳系源代码》,但愿对你工作学习有帮助,当然你在写写帮文库还可以找到更多《计算机图形学模拟太阳系源代码》。

第一篇:计算机图形学模拟太阳系源代码

#include #include #include #include //行星

GLfloat rot0 = 30.0;GLfloat rot1 = 0.0;GLfloat rot2 = 0.0;GLfloat rot3 = 0.0;GLfloat rot4 = 0.0;GLfloat rot5 = 0.0;GLfloat rot6 = 0.0;GLfloat rot7 = 0.0;GLfloat rot8 = 0.0;//卫星

GLfloat rot9 = 0.0;GLfloat rot10 = 0.0;GLfloat rot11 = 0.0;

void init(){ glClearColor(0.0,0.0,0.0,0.0);glClearDepth(1.0);glShadeModel(GL_FLAT);}

void display(){ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);glColor3f(1.0,1.0,1.0);glLoadIdentity();//gluLookAt(0, 10, 10, 0,0,0,0, 1,0);//glRotatef(45.0,0.0,0.0,1.0);glTranslatef(0.0,0.0,-20.0);glRotatef(90.0,1.0,0.0,0);glPushMatrix();//绘制太阳

glColor3f(1.0,0.0,0.0);glutSolidSphere(2.0,32,32);//绘制地球

glPushMatrix();glColor3f(0.0,0.0,1.0);// 绘制辅助轨道

glRotatef(90,1.0,0,0.0);

glutSolidTorus(0.02, 5.0, 10, 64);glRotatef(-90,1.0,0,0.0);// 设置地球公转速度

glRotatef(rot0,0.0,1.0,0.0);// 设置地球半径

glTranslatef(5.0,0.0,0.0);// 设置地球自转速度

//glRotatef(rot1,0.0,1.0,0.0);// 绘制地球

glutSolidSphere(0.4,32,32);// 绘制地球的卫星-月亮 glColor3f(0.5,0.6,0.5);// 抵消地球自转影响

//glRotatef(-rot1,0.0,1.0,0.0);// 绘制辅助轨道

glRotatef(90,1.0,0,0.0);

glRotatef(-90,1.0,0,0.0);// 设置月亮公转速度

glRotatef(rot9,0.0,1.0,0.0);// 设置月亮公转半径

glTranslatef(0.6,0.0,0.0);// 绘制月亮

glutSolidSphere(0.1,10,8);glPopMatrix();// 绘制水星

glPushMatrix();glColor3f(0.0,1.0,1.0);// 绘制辅助轨道

glRotatef(90,1.0,0,0.0);glutSolidTorus(0.02, 2.5, 10, 64);glRotatef(-90,1.0,0,0.0);// 设置水星公转速度

glRotatef(rot1,0.0,1.0,0.0);// 设置水星公转半径

glTranslatef(2.5,0.0,0.0);// 设置水星自传

glRotatef(rot3,0.0,1.0,0.0);// 绘制水星

glutSolidSphere(0.2,32,32);glPopMatrix();

//绘制金星

glPushMatrix();glColor3f(0.0,1.0,0.0);//绘制辅助轨道

glRotatef(90,1.0,0,0.0);glutSolidTorus(0.02, 3.4, 10, 64);glRotatef(-90,1.0,0,0.0);// 设置金星公转速度

glRotatef(rot2,0.0,3.0,0.0);// 设置金星公转半径

glTranslatef(3.4,0.0,0.0);// 设置金星自传

glRotatef(rot0,0.0,1.0,0.0);// 绘制金星

glutSolidSphere(0.3,32,32);glPopMatrix();//绘制火星

glPushMatrix();glColor3f(1.0,0.0,0.0);//绘制辅助轨道

glRotatef(90,1.0,0,0.0);glutSolidTorus(0.02, 6.6, 10, 64);glRotatef(-90,1.0,0,0.0);// 设置火星公转速度

glRotatef(rot3,0.0,4.0,0.0);// 设置火星公转半径

glTranslatef(6.6,0.0,0.0);// 设置火星自传

glRotatef(rot7,0.0,2.0,0.0);// 绘制火星

glutSolidSphere(0.5,32,32);glPopMatrix();//绘制木星

glPushMatrix();glColor3f(2.0,0.1,1.0);//绘制辅助轨道

glRotatef(90,1.0,0,0.0);glutSolidTorus(0.02, 8.5, 10, 64);glRotatef(-90,1.0,0,0.0);// 设置木星公转速度

glRotatef(rot4,0.0,0.4,0.0);// 设置木星公转半径

glTranslatef(8.5,0.0,0.0);// 设置木星自传

glRotatef(rot3,0.0,0.3,0.0);// 绘制木星

glutSolidSphere(1.0,32,32);

// 绘制木星卫星-木卫1 glColor3f(0.4,0.3,0.5);// 抵消地球自转影响

//glRotatef(-rot1,0.0,1.0,0.0);

// 绘制辅助轨道

glRotatef(90,1.0,0,0.0);

glRotatef(-90,1.0,0,0.0);// 设置木卫1公转速度

glRotatef(rot10,0.0,1.0,0.0);// 设置木卫1公转半径

glTranslatef(1.3,0.0,0.0);// 绘制木卫1 glutSolidSphere(0.1,10,8);

// 绘制木星卫星-木卫2 glColor3f(0.5f,0.5f,0.5f);// 抵消地球自转影响

//glRotatef(-rot1,0.0,1.0,0.0);

// 绘制辅助轨道

glRotatef(90,1.0,0,0.0);

glRotatef(-90,1.0,0,0.0);// 设置木卫2公转速度

glRotatef(rot11,0.0,1.0,0.0);// 设置木卫2公转半径

glTranslatef(1.2,0.0,0.0);// 绘制木卫2 glutSolidSphere(0.08,10,8);glPopMatrix();

//绘制土星

glPushMatrix();glColor3f(1.0f, 1.0f, 0.0f);//绘制辅助轨道

glRotatef(90,1.0,0,0.0);glutSolidTorus(0.02, 12.5, 10, 64);glRotatef(-90,1.0,0,0.0);// 设置土星公转速度

glRotatef(rot5,0.0,0.4,0.0);// 设置土星公转半径

glTranslatef(12.5,0.0,0.0);// 设置土星自传

glRotatef(rot3,0.0,0.3,0.0);// 绘制土星

glutSolidSphere(0.85,32,32);//绘制土星光环

glRotatef(90,1.0,0,0.0);glutSolidTorus(0.1, 1.25, 10, 64);glRotatef(-90,1.0,0,0.0);glRotatef(90,1.0,0,0.0);glutSolidTorus(0.07, 1.65, 10, 64);glRotatef(-90,1.0,0,0.0);glPopMatrix();glPopMatrix();//绘制天王星 glPushMatrix();glColor3f(0.0f, 1.0f, 1.0f);//绘制辅助轨道

glRotatef(90,1.0,0,0.0);glutSolidTorus(0.02, 15.5, 10, 64);glRotatef(-90,1.0,0,0.0);// 设置天王星公转速度

glRotatef(rot6,0.0,0.4,0.0);// 设置天王星公转半径

glTranslatef(15.5,0.0,0.0);// 设置天王星自传

glRotatef(rot1,0.0,0.3,0.0);// 绘制天王星

glutSolidSphere(0.15,32,32);glPopMatrix();//绘制海王星 glPushMatrix();glColor3f(0.0f, 0.0, 8.0f);//绘制辅助轨道

glRotatef(90,1.0,0,0.0);glutSolidTorus(0.02, 17.5, 10, 64);glRotatef(-90,1.0,0,0.0);// 设置海王星公转速度

glRotatef(rot7,0.0,0.4,0.0);// 设置海王星公转半径

glTranslatef(17.5,0.0,0.0);// 设置海王星自传

glRotatef(rot3,0.0,0.3,0.0);// 绘制海王星

glutSolidSphere(0.145,32,32);glPopMatrix();

//绘制冥王星

glPushMatrix();glColor3f(0.5f, 0.5f, 0.5f);//绘制辅助轨道

glRotatef(90,1.0,0,0.0);glutSolidTorus(0.02, 19.5, 10, 64);glRotatef(-90,1.0,0,0.0);// 设置冥王星公转速度

glRotatef(rot8,0.0,0.4,0.0);// 设置冥王星公转半径

glTranslatef(19.5,0.0,0.0);// 设置冥王星自传

glRotatef(rot2,0.0,0.3,0.0);// 绘制冥王星

glutSolidSphere(0.145,32,32);glPopMatrix();

glutSwapBuffers();

glFlush();}

void idle(){

rot0+=0.1;if(rot0>=360.0)rot0-=360.0;rot1+=0.416;if(rot1>=360.0)rot1-=360.0;rot2+=0.1631;if(rot2>=360.0)rot2-=360.0;rot3+=0.053;if(rot3>=360.0)rot3-=360.0;rot4+=0.0083;if(rot4>=360.0)rot4-=360.0;rot5+=0.0034;if(rot5>=360.0)rot5-=360.0;rot6+=0.00119;if(rot6>=360.0)rot6-=360.0;rot7+=0.00069;if(rot7>=360.0)rot7-=360.0;rot8+=0.0008;if(rot8>=360.0)rot8-=360.0;rot9+=1.0;if(rot9>=360.0)rot9-=360.0;rot10+=0.005;if(rot10>=360.0)rot10-=360.0;rot11+=0.01;if(rot11>=360.0)

rot11-=360.0;

glutPostRedisplay();}

void reshape(int w,int h){ glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(60.0,(GLdouble)w/(GLdouble)h,1.0,100.0);glMatrixMode(GL_MODELVIEW);}

void main(int argc,char **argv){ glutInit(&argc,argv);

glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);glutInitWindowSize(600,400);glutInitWindowPosition(500,500);glutCreateWindow(“planet sim”);init();

glutDisplayFunc(display);glutReshapeFunc(reshape);glutIdleFunc(idle);glutMainLoop();

return;}

第二篇:《计算机图形学》实验报告

吉林大学

计算机科学与技术学院

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

班级: 211923班

学号: 21190928

姓名: 林星宇

2021-2022学年第1学期

实验项目1

边标志算法的实现

实验性质

□演示性实验 验证性实验

□操作性实验 综合性实验

实验地点

计算机楼B212

机器编号

一、实现的功能

编写应用程序,采用鼠标输入顶点的方法确定待填充多边形(多边形最后一点双击);实现边标志算法完成对该多边形的填充,要求 完成使用自己学号的后四位数字对多边形内部进行填充。

二、采用的图形学算法及实现

(算法的实现函数是什么(函数名,参数,返回值,函数功能等)以及采用了哪些数据结构(数组,链表等))

要求使用边标志算法的原理和实 现方法,所以使用了EdgeMarkFill函数,即边标志算法:

void CMFCDrawTestView::EdgeMarkFill(CDC* pDC, CArray* plist, COLORREF color)

pDC为设备环境变量指针,plist为多边形点表,color为传入的RGB()值。

int zima[16][32]为学号后4位二维数组。

X1,x2,y1,y2分别为多边形上的最小最小大,y值

三、采用的交互方式及实现

(采用了哪些交互方式来完成绘制,这些交互方式应用到了哪些系统消息,是如何实现的)

边填充的实现:编写应用程序,采用鼠标输入顶点的方法确定待填充多边形(多边形最后一点双击);实现边标志算法完成对该多边形的填充,要求 完成使用自己学号的后四位数字对多边形内部进行填充。

易知,在画完多边形后,即双击左键(OnLButtonUp)后,使用EdgeMarkFill函数。

Type=2时,在OnLButtonUp中,调用EdgeMarkFill(pDC,&(obj->points), RGB(r, 0, 0));

四、实验结果

(程序的运行结果)

应用程序运行后,标志算法完成对该多边形的填充的图形结果如下:

”“

五、遇到的问题及解决办法

问题1:(在实现过程中遇到了什么样的问题,及采用了何种解决办法)

在获取下x1,x2,y1,y2时,因为Dos界面x、y大小颠倒的原因,获取时出现了问题。

首先,通过for(int i = 1;i < plist->GetSize();i++){

CPoint p = plist->GetAt(i);

if(x1 > p.x)x1 = p.x;

if(x2 < p.x)x2 = p.x;

if(y1 > p.y)y1 = p.y;

if(y2 < p.y)y2 = p.y;

}

获取x1,x2,y1,y2.在遍历多边形过程中:

int count = plist->GetSize();

for(int i = 0;i < count;i++){

CPoint p1 = plist->GetAt(i);

CPoint p2 = plist->GetAt((i + 1)% count);

if(p1.y == p2.y)

continue;

if(p1.y > p2.y)

{

CPoint p;p = p1;p1 = p2;p2 = p;

}

xs = p1.x;

dxs =(p2.x-p1.x)/(double)(p2.y-p1.y);

//dys = abs(p2.y-p1.y)/(p2.y-p1.y);

for(ys = p1.y;ys!= p2.y;ys += 1)

{

Ixs = int(xs + 0.5);

MARK[ys][Ixs] =!MARK[ys][Ixs];

xs = xs + dxs;

}

黄线处即为处理x1,x2,y1,y2的大小。

问题2:通过数组zima[][]来确定多边形区域填充学号后4位时,zima[y ][x ]未%其字长,即zima[y % 16][x % 32]。后改为:

for(y = y1;y <= y2;y++)

{

bool inside = false;

for(x = x1;x <= x2;x++)

{

if(MARK[y][x])

inside =!inside;

if(inside)

{

if(zima[y % 16][x % 32])

pDC->SetPixel(x, y, RGB(255, 0, 0));

}

}

}

实验项目2

立方体的比例、平移、旋转变换及投影显示

实验性质

□演示性实验 验证性实验

□操作性实验 综合性实验

实验地点

计算机楼B212

机器编号

一、实现的功能

建立立方体的数据模型;编写应用程序,利用菜单和键盘结合的方式完成对立方体的移动、比例和旋转变换,并显示透视或斜二测投影结果。要求应用程序具有如下功能:

1、通过菜单选择的方式,选择对三维空间中的立方体作斜二测投 影或透视投影;

2、通过键盘按键或鼠标移动的方式,完成对三维空间中的立方体 进行平移变换(上下左右前后),比例变换(放大或缩小)以及 旋转变换(绕 x,y,z 轴),并同时显示变换后的投影结果

3、创建对话框,通过对话框设置透视投影时候的投影中心,以及旋转变换时候的旋转轴(可以设置成分别绕 x 轴,y 轴,z 轴进 行旋转)

二、采用的图形学算法及实现

(算法的实现函数是什么(函数名,参数,返回值,函数功能等)以及采用了哪些数据结构(数组,链表等))

题目要求实现立方体的移动、比例和旋转变换,并显示透视或斜二测投影结果。

对要求1:在菜单选TY项中选择斜二测投影(斜二=1)或透视投影(透视=1)。然后在OnDraw中调用Draw_Cubic(CDC* pDC)画出立方体。

对要求2:在OnKeyDown中调用函数,即在键盘上按“S”使立方体变小,“B”使立方体变大,“←”“→”“↑”“↓”使立方体左右上下移动。

对要求3:在菜单XYZ中选择旋转的x,y,z轴,即x=1或y=1或z=1,然后在OnKeyDown中调用函数,即按键盘上的“T”或“P”.

三、采用的交互方式及实现

(采用了哪些交互方式来完成绘制,这些交互方式应用到了哪些系统消息,是如何实现的)

由题目要求1,易知需要一个函数Draw_Cubic(CDC* pDC)画出立方体的斜二测投影或透视投影并且建立一个菜单栏TY(投影)。即在菜单选TY项中选择斜二测投影(斜二=1)或透视投影(透视=1)。然后在OnDraw中调用Draw_Cubic(CDC* pDC)画出立方体。

由题目要求2:易知直接在OnKeyDown函数上添加使立方体变大变小,前后左右平移的功能。即即在键盘上按“S”使立方体变小,“B”使立方体变大,“←”“→”“↑”“↓”使立方体左右上下移动。

由题目要求3:建立一个菜单XYZ决定旋转的轴。

四、实验结果

(程序的运行结果)

斜二测投影:

”“

斜二测投影平移到左上角:

”“

斜二测投影平移到右下角:

”“

斜二测投影变大:

”“

斜二测投影变小:

”“

斜二测投影变为透视投影:

”“

斜二测投影绕z轴旋转:

”“

”“

”“

五、遇到的问题及解决办法

(在实现过程中遇到了什么样的问题,及采用了何种解决办法)

问题1:一开始建立立方体时,没有建立边表,导致投影困难。

后来建立了点表和对应的边表。

问题2:一开始Draw_Cubic中x1, y1,z1, x2, y2,z2定义为了int型。

实验项目3

用矩形窗口对多边形进行裁剪

实验性质

□演示性实验 验证性实验

□操作性实验 综合性实验

实验地点

计算机楼B212

机器编号

一、实现的功能

编写应用程序实现多边形裁剪。要求首先采用鼠标确定裁剪区域(矩形区域),然 后用鼠标输入待裁剪的多边形(可分别使用鼠标左键和右键来确定裁剪区域和待裁剪 的多边形)。多边形绘制完毕后进行裁剪,以不同颜色显示被裁剪对象位于窗口内(此 部分应保证多边形的完整性)及外部的部分。

二、采用的图形学算法及实现

(算法的实现函数是什么(函数名,参数,返回值,函数功能等)以及采用了哪些数据结构(数组,链表等))

因为要编写应用程序实现多边形裁剪。要求首先采用鼠标确定裁剪区域(矩形区域),然 后用鼠标输入待裁剪的多边形(可分别使用鼠标左键和右键来确定裁剪区域和待裁剪 的多边形)。所以要使用多边形裁剪算法,即Cut_Top(),Cut_Bottom(),Cut_Left(),Cut_Right()四个函数。

Cut()函数为用绿色显示被裁剪对象位于窗口内部分。

存在int type的变量;

当type=1时,在OnLButtonUp中画出矩形框。

当type=2时,画出多边形,在左键双击后,在OnLButtonDblClk中调用如下函数:Cut_Top();Cut_Right();Cut_Bottom();Cut_Left();Cut();

裁剪多边形在,并标出在矩形内部的部分。

三、采用的交互方式及实现

(采用了哪些交互方式来完成绘制,这些交互方式应用到了哪些系统消息,是如何实现的)

编写应用程序实现多边形裁剪。要求首先采用鼠标确定裁剪区域(矩形区域),然 后用鼠标输入待裁剪的多边形(可分别使用鼠标左键和右键来确定裁剪区域和待裁剪 的多边形)。多边形绘制完毕后进行裁剪,以不同颜色显示被裁剪对象位于窗口内(此 部分应保证多边形的完整性)及外部的部分。

根据以上绘制方法,可知需要处理WM_OnLButtonDblClk(左键双击)及WM_LButtonUp(左键抬起)消息,为了绘制橡皮线,还需处理调用WM_MouseMove(鼠标移动)消息。

因为可以用鼠标画出矩形和多边形,所以这么规定,当type=1时画矩形,即:

DDALine(pDC,lx,by,lx,ty,RGB(r, g, b));

DDALine(pDC, lx, by, rx, by, RGB(r, g, b));

DDALine(pDC, rx, by, rx, ty, RGB(r, g, b));

DDALine(pDC, lx, ty, rx, ty, RGB(r, g, b));

当type=2时画多边形,而后裁剪,即:

for(int i = 0;i < pointList.GetSize();i++)

{

p1 = pointList.GetAt(i);

p2 = pointList.GetAt((i+1)% count);

DDALine(pDC, p1.x, p1.y, p2.x, p2.y, RGB(0,255,0));

}

四、实验结果

(程序的运行结果)

裁剪结果如下图所示,黑色为裁剪窗口,红色为多边形被裁剪的部分,绿色为多边形裁剪后的部分:

”“

五、遇到的问题及解决办法

(在实现过程中遇到了什么样的问题,及采用了何种解决办法)

问题1:我在裁剪使一开始对多边形做上下左右裁剪时,这四个步骤是分别对原图形裁剪,而不是对图形接连进行裁剪。后来在裁剪函数上先除去之前图形,然后把已裁剪多边形重新构建。如下:

pointList.RemoveAll();

for(int i = 0;i < m;i++)

pointList.Add(CP[i]);

问题2:在多边形被矩形裁剪的部分显现不同颜色花费了挺多时间,后来我直接让裁剪的部分颜色被覆盖就可以了。如下:

for(int i = 0;i < pointList.GetSize();i++)

{

p1 = pointList.GetAt(i);

p2 = pointList.GetAt((i+1)% count);

DDALine(pDC, p1.x, p1.y, p2.x, p2.y, RGB(0,255,0));

}

第三篇:计算机图形学学习心得

《计算机图形学》学习报告

 东西方建筑中的理性

尽管东方“木构”的暂时性文化和西方“石砌”的永久性文化氛围造成了建筑形式风格的差异,但是它们都兼有理性和感性美。从柱式的英文“order”一词,到中国古建筑等级制的基数开间,无不透露着匠人的理性思考;从古埃及绘画中为了将人的特征最大限度表现而作的头部侧面身体正面的绘画,到文艺复兴达芬奇创造的透视画法,一步步将人们引向更为理性的世界。

西方古典主义者强调构图中的主从关系,突出轴线、讲求配称;倡导理性,主张建筑的真实,反对表现感情和情绪。随之而来的比例、节奏、韵律、秩序美,是建筑区别于雕塑和绘画两大艺术的特点。

维特鲁威提出的建筑三原则:坚固、适用、美观,时时刻刻提醒着我们建筑是要被建造起来的,它是我们的“避难所”,需要理性的结构、缜密的分析和思考。时代在进步,建筑理论从勒杜克的结构理性主义发展到现在的解构主义,再也不是建筑形式适应结构的时代了,而是两者互为促进。

我们对建筑的理解不再是像路易斯康那样再去问砖想做什么,等待它做拱卷的回答。我们向大自然学习,卡拉特拉瓦创造了许多带有理性美的仿生建筑。当我们想进一步拓宽我们的思维时,我们还能向谁求助?计算机图形学为我们打开了理性思考的一扇窗。

 计算机图形学对理性建筑的贡献

半个多世纪以来,计算机技术得到了飞速的发展。它的进步不仅仅使世界变得更平,信息交流更便捷,在此平台上开发的各种绘图软件更是将建筑师从传统的手工渲染画图中解放出来,也解放了结构师的工作量。用了30年的时间,计算机的速度从K(103)到T(1012),而从T到Z(1021),我们只用了10年时间。发展的速度是越来越快,我们设计方法和速度都得到了革新。这是这样一个数字化信息化的时代,才有弗兰克盖里建筑的夸张和扎哈哈迪德设计的新奇。

原来我们随手绘出的自由曲线,现在计算机都能帮我们算出是否有建造的可能,以及建筑性能也能在建造前得到分析。在创意上,计算机也能将我们模糊的概念无限发展,给它一个规则,它可能还你一个超乎想象的造型,在理性规则中生成感性而自由的建筑。

知其然,还应知其所以然,看着电视机的变薄,图像更加逼真,这变化的一切都建立在计算机图形学的架构下,了解了基础原理,才能更高效地做高质量的建筑设计。

 计算机图形学的理论知识

1.相关概念

计算机图形学是主要研究通过计算机处理用集合数据和数学模型所描述的图形的原理、算法和系统。包括图形的输入、存储、运算、转换、传送和输出。数字化技术是泛指在某特定领域利用包括硬件、软件在内的计算机与电子技术以及数学或数字模型等描述的问题进行求解、模拟或分析活动的一切应用技术。

建筑数字化技术研究应用包括建筑的数字化设计和反映建筑的数字化特征在内的数字技术。而建筑数字化技术的核心几何学科就是计算机图形学。2.反映建筑数字化特征的典型图形技术

建筑的动态特征——图形显示:如奥地利格拉茨美术馆的925盏灯形成的外墙面显示屏 建筑的互动特征——图形显示:如杜瑟赫姆市的随情感变化而色彩变化的建筑物

建筑的数字特征——几何运算:如柏林Max Reinhardt大楼模型及“莫比乌斯环”变换 建筑的虚实特征——交互式图形:如法国国立图书馆(实体与网络图书馆)

设计手段和设计媒体的数字化特征——交互式图形:如纽约韩国基督教长老会教堂 而建筑性能如声环境、热环境、光环境、风环境模拟的可视化分析中都用到了图形学。3.虚拟现实技术(VR)

虚拟现实技术是计算机生成的给人多种感官刺激的虚拟世界(环境),是一种高级的人机交互系统。

虚拟现实技术的三个基本特征:沉浸感、交互性、想象力 它具有多学科的综合性,正如建筑学是一门综合的艺术,虚拟现实技术包括图像处理、图形学、计算几何、多传感器、网络、多媒体和仿真技术等。

正如课堂上老师放映的《碟中谍4》,逼真的爆炸场景,以及从皮克斯动画开始的动物毛发到最近火热的《少年派》逼真的老虎与人共存画面,虚拟现实技术的进步影响到了我们生活的方方面面,触到了我们原来想都不敢想的世界。

而VR技术在建筑行业中,有以下作用:(1)指导设计:让建筑师通过浏览观察和了解空间关系,特别是对空间大小、方向、形状和建筑元素行为的理解。(2)建筑表现与环境仿真(3)仿真施工:检查和修改施工细节、合理性和有效性

4.虚拟现实的基础与关键技术:建模与描绘

基于几何和图形学的建模和描绘技术

直接几何建模

3D扫描建模

投影视图建模

基于图像的场景描绘技术(IBR)

图像投影变形技术 光场重建技术

混合式IBR技术

IBR技术图形的绘制独立于场景的复杂性,仅仅与所要生成画面的分辨率有关。

第四篇:计算机图形学实验

实验三 MFC画直线

最近自己在学习如何在VC 6.0 开发环境下的使用MFC AppWizard(exe)来绘画一条直线,虽然比较简单,通过这样的练习可以帮助你熟悉MFC的开发环境以及其中的消息传递机制,希望对于像我一样初入MFC图形绘制学习的人有帮

第一步:构建MFC窗体

打开Visual C++ 6.0编译器 新建→工程→MFC AppWizard(exe),工程名以DrawLine为例,然后确定。为了方便,在MFC应用程序向导—步骤1当中选择“单文档”,其余所有的步骤都为默认值,直接“完成”。这样一个简单的MFC窗体就构建好了,自己不妨Compile—Build—BuildExecute一下。

第二步:编辑菜单项

选择ResourceView视窗展开Menu文件夹,左键双击IDR_DRAWLITYPE,右边就会出现菜单图形编辑界面,为了简化,我们只在添加帮助→DrawLine功能选择项。双击空白会弹出“菜单项目 属性”对话框。ID:ID_DRAW_LINE;标明:

DrawLine(&D),其它的为缺省。

第三步:建立消息命令

如果此时运行该程序,你会发现帮助—DrawLine的功能选项是灰色的,原因就在于我们还没有添加该功能的消息命令相应函数。通过“查看—Message Maps—Project:DrawLine—Class name:CDrawLineView—Object IDs:ID_DRAW_LINE—选定COMMAND—Add Function„”,其它为默认,最后确定完成。现在如果再重新运行该程序的话,会发现原来的灰色已经消除了。

第四步:添加鼠标消息响应

打开ClassView视窗,右键选定CDrawLineView,选择Add Windows Messsage Handler会弹出对话框,完成CDrawLineView类的WM_LBUTTONDOWN、WM_MOUSEMOVE、WM_LBUTTONUP三个Windows消息事件的新建。

第五步:添加响应代码

首先,在ClassView视窗中双击CDrawLineView会定位到“DrawLineView.h : interface of the CDrawLineView class”的文件,添加CDrawLineView类的成员:protected: int m_Drag;POINT m_pPrev;POINT m_pOrigin;三个成员变量。视窗中展开CDrawLineView类,双击定位OnLBUTTONDOWN()函数。在该函数消息响应

处添加如下代码:

//建立好绘图的设备环境

CClientDC dc(this);OnPrepareDC(&dc);

dc.DPtoLP(&point);

//获取起始点坐标 m_pPrev=point;m_pOrigin=point;

m_Drag=1;

然后,定位于OnMouseMove(),添加如下代码(其中关键用到了橡皮筋技术):

//建立好绘图的设备环境

CClientDC dc(this);

OnPrepareDC(&dc);dc.DPtoLP(&point);

dc.SetROP2(R2_NOT);//橡皮筋绘图技术

//判断是否BUTTONDOWN

if(m_Drag)

{

dc.MoveTo(m_pOrigin);dc.LineTo(m_pPrev);dc.MoveTo(m_pOrigin);dc.LineTo(point);

}

m_pPrev=point;

最后,在OnLBUTTONDOWN()添加代码: m_Drag=0;

程序运行效果图

实验4 实现圆的生成算法

一、实验目的

1.熟悉CDC图形程序库; 2.掌握中点画圆生成算法; 3.掌握Bresenham画圆算法。

二、实验内容

利用VisualC++6.0设计一个简易画圆绘图板,验证圆生成算法。

三、实验指导

1.生成绘图应用程序的框架,如下图所示。具体实现见第二次实验,过程不再详细说明。

2.在应用程序中增加菜单

完成相关菜单的设计,具体的效果如下图所示,并设置好相关菜单消息的映射,具体的实现在前面的实验中介绍过,再此不在详细说明。

3.在绘图函数中添加代码

通过以上步骤,得到了与菜单对应的消息映射,就可以在函数中添加代码绘制图形了。(1)利用中点画圆算法实现圆的生成(算法原理见教材)。void CDraw_CirView::OnMid(){ // TODO: Add your command handler code here CDC*pDC=GetDC();//得到绘图类指针

RedrawWindow();//重绘窗口

int x,y,x0=200,y0=200,r=100;//圆的圆心为(x0,y0),半径为r float d;x=0;y=r;d=1.25-r;

pDC->SetPixel(x+x0,y+y0,RGB(255,0,0));pDC->SetPixel(y+x0,x+y0,RGB(255,0,0));pDC->SetPixel(y+x0,-x+y0,RGB(255,0,0));pDC->SetPixel(x+x0,-y+y0,RGB(255,0,0));pDC->SetPixel(-x+x0,-y+y0,RGB(255,0,0));pDC->SetPixel(-y+x0,-x+y0,RGB(255,0,0));pDC->SetPixel(-y+x0,x+y0,RGB(255,0,0));pDC->SetPixel(-x+x0,y+y0,RGB(255,0,0));while(x<=y){

if(d<0)

{

d=d+2*x+3;

x++;

}

else

{

d=d+2*(x-y)+5;

x++;

y--;}

pDC->SetPixel(x+x0,y+y0,RGB(255,0,0));

pDC->SetPixel(y+x0,x+y0,RGB(255,0,0));

pDC->SetPixel(y+x0,-x+y0,RGB(255,0,0));

pDC->SetPixel(x+x0,-y+y0,RGB(255,0,0));

pDC->SetPixel(-x+x0,-y+y0,RGB(255,0,0));

pDC->SetPixel(-y+x0,-x+y0,RGB(255,0,0));

pDC->SetPixel(-y+x0,x+y0,RGB(255,0,0));

pDC->SetPixel(-x+x0,y+y0,RGB(255,0,0));} } 由以上代码绘出的图形如下:

(2)利用Bresenham算法生成圆(算法原理见教材)。void CDraw_CirView::OnBre(){ // TODO: Add your command handler code here CDC*pDC=GetDC();//得到绘图类指针

//RedrawWindow();//重绘窗口

int x,y,x0=200,y0=200,r=50;//圆的圆心为(x0,y0),半径为r int delta,delta1,delta2,direction;x=0;y=r;delta=2*(1-r);while(y>=0){

pDC->SetPixel(x+x0,y+y0,RGB(0,0,255));

pDC->SetPixel(x+x0,-y+y0,RGB(0,0,255));

pDC->SetPixel(-x+x0,y+y0,RGB(0,0,255));

pDC->SetPixel(-x+x0,-y+y0,RGB(0,0,255));

if(delta<0)

{

delta1=2*(delta+y)-1;

if(delta<=0)direction=1;

else direction=2;

}

else if(delta>0)

{

delta2=2*(delta-x)-1;

if(delta2<=0)direction=2;

else direction=3;

}

else direction=2;

switch(direction)

{

case 1:x++;

delta+=2*x+1;

break;

case 2:x++;y--;

delta+=2*(x-y+1);

break;

case 3:y--;

delta+=(-2*y+1);

break;

} } }

由以上代码绘出的图形如下:

(3)以上是本次实验的基本部分,利用中点画圆和Bresenham画圆算法实现的基本图形的绘制。能不能利用该算法,完成一些复杂图形的生成,比如利用基本的画圆算法绘制一个奥运五环。甚至根据画圆算法,实现二次曲线的生成,如椭圆的生成等等。请同学们认真考虑,完成这部分的内容,上机调试。

四、思考

1.如何实现圆心为任意位置的圆的绘制; 2.两种画圆算法的比较。

第五篇:计算机图形学学习体会

计算题图形学课程学习体会

计算机图形学是研究用计算机生成、处理和显示图形的一门学科。他的重要性体现在人们越来越强烈的需要和谐的人机交互环境,UI已经成为软件的重要组成部分,以图形的方式表示抽象的概念和数据已经成为信息领域的发张趋势。这门课我们通过自学和同学间互相上课,了解和掌握了计算机图形学的概念、方法和基本的算法。

学习的过程中,感触比较深的是,常常被那些算法所困扰,算法很难理解,解释的枯燥而且难学。原因首先是计算机图形学这门学科本身特点就是综合性很强,涉及的内容和应用广泛,学科交叉复杂。综合了计算机科学、数学、物理学等其他相关学科的知识。而且学科发展日新月异,新的应用领域不断拓展,相关学科相互渗透。其次是与计算机图形学课程中的算法特点有关。很多的算法是为了追求高效率,精益求精,构思独特、实现精巧,算法本身就很难看懂和理解。第三方面就是这门课程是一门理论性和实践性兼顾的综合性课程,实践性很强,不实践就显得空洞,枯燥乏味。

这门课学习的目的是让我们掌握计算机图形学的相关概念、原理和知识,算法的难学难理解,是我们学习的主要障碍。课程实践中,教员让我们自学,互相授课,增强时间体会。在自学和自作可见互相授课过程中,要求要注重基础,强调基本

这些动画,对增强原理、算法的理解性具有很大的作用。

以上是本人在计算机图形课学习过程中的体会,字数不多,确是心得,不足之处还请曹老师指正。

下载计算机图形学模拟太阳系源代码word格式文档
下载计算机图形学模拟太阳系源代码.doc
将本文档下载到自己电脑,方便修改和收藏,请勿使用迅雷等下载。
点此处下载文档

文档为doc格式


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:645879355@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。

相关范文推荐

    计算机图形学实验报告

    实 验 报 告 一、 实验目的 1、掌握有序边表算法填充多边形区域; 2、理解多边形填充算法的意义; 3、增强C语言编程能力。 二、 算法原理介绍 根据多边形内部点的连续性知:一条......

    计算机图形学论文

    工欲善其事,必先利其器 ——浅析计算机图形学及其作用 本学期学校开设了计算机图形学,一开始不知计算机图形学为何物的我不是很理解为什么要有这门课,但是经过一学期的洗礼过后......

    计算机图形学实验报告

    0908141020 试验092 尤洋 实验1-1: 通过循环画线,实现了画四边形的功能 实验1-2: 通过循环设置顶点坐标,循环画线,实现了画7个顶点的金刚石 实验1-3: 通过填充实现了画三彩多边形......

    计算机图形学心得体会

    计算机图形学心得体会 姓名: 学号: 201203284 班级: 计科11202 序号: 31 院系: 计算机科学学院 通过一个学期的学习,经过老师细心的讲解,我对图形学这门课有了基础的认识,从......

    对于计算机图形学感想

    计算机图形学 1045532136 朱啸林 我们班是计算机科学与技术,刚开始知道要上图形学的时候我还是一头雾水,觉得没什么联系,经过老师的点拨和自己的领悟,我明白了其中的道理。计算......

    计算机图形学中英文关键词

    Computer graphics 计算机图形学 Two-dimensional 二维 Three-dimensional 三维 geometric transformation 几何变换 composite transformations 复合变换 Two-dimensional......

    计算机图形学的简单认识

    计算机图形学的简单认识 090600304229计科0942卿文玲第一周,我们上了一节计算机图形学。记得刚开始领到书的时候,翻看里面的内容,发现好多数学公式,心想:“完了,这不就是变相数学......

    2012级硕士研究生计算机图形学试题

    2012级硕士研究生计算机图形学试题问答题 1、 简述中点划线法。10分 2、 绘图说明多边形扫描填充算法过程。10分 3、 Hermite曲线公式及说明。10分 4、 编码裁剪过程。10分......