计算机图形学实验报告Word格式文档下载.docx

上传人:b****5 文档编号:21043500 上传时间:2023-01-27 格式:DOCX 页数:11 大小:478.30KB
下载 相关 举报
计算机图形学实验报告Word格式文档下载.docx_第1页
第1页 / 共11页
计算机图形学实验报告Word格式文档下载.docx_第2页
第2页 / 共11页
计算机图形学实验报告Word格式文档下载.docx_第3页
第3页 / 共11页
计算机图形学实验报告Word格式文档下载.docx_第4页
第4页 / 共11页
计算机图形学实验报告Word格式文档下载.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

计算机图形学实验报告Word格式文档下载.docx

《计算机图形学实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。

计算机图形学实验报告Word格式文档下载.docx

(3)绘制时可选择线绘制

(4)绘制时可选择填充绘制,填充绘制时颜色过渡要平滑

(5)实现旋转功能,缩放功能,用鼠标左键或者键盘控制

(6)绘制时可选择自定义填充模式1,显示为线型,用户选择预定义的颜色,对鼠标左键点击到的网格进行填充

(7)绘制时可选择自定义填充模式2,显示为线型,用户选择预定义的颜色,对鼠标左键选择的区域内的三角网格进行填充

(8)绘制时可选择纹理填充,将所给的纹理图像填充到显示图形上

(9)绘制时可选择显示坐标轴,可选择恢复为初始状态

(10)上边的选择使用OpenGL菜单

1.2采取方法

1、从文件中读取数据,分别放置在triangle数组(三角形定点信息)和vertex数组(定点坐标信息)中

2、采集数据后,对数据进行统计,获得上界和下界,并将数据投影到指定区域内

3、线绘制:

遍历triangle,对定点两两进行绘制,算法具体介绍

4、填充绘制:

以z轴坐标为准确定颜色

5、旋转采用球坐标变换gluLookAt函数,缩放采用变换gluOrtho函数

6、7、算法具体介绍

8、先从文件获得纹理数组,再进行投影,在xoy平面上填充

9、因为坐标轴要独立显示,故设置GridOn全局变量,需要显示时为1,不需要时为0

10、用菜单函数

2.实验中采用的算法

1、球面角旋转算法:

Distance为全局变量,表示gluLookAt的时候的距离,因为

,因此只要利用

算出变换后的球坐标,调用gluLookAt即可。

2、判断点在三角形内

判断点在三角形内,只要判断点和三个顶点组成的向量夹角和是不是360度即可,由于c语言的近似计算,程序内判断的是实际值与理想值相差不超过10-4次方

3、判断三角形在方框内

只需判断所有定点是否在[(oMx,oMy),(Mx,My)]内即可(oMx是点击前x坐标,Mx是实时的x坐标)

3算法代价

每次在重画前需要计算所有点的投影,因此代价比较大。

而判断工作在计算投影同时进行,因此并没有附加时间复杂度。

3.1算法分析

以拾取为例

if(State==CLICK||State==DRAG){

glGetDoublev(GL_PROJECTION_MATRIX,project);

glGetDoublev(GL_MODELVIEW_MATRIX,object);

glGetIntegerv(GL_VIEWPORT,view);

for(inti=0;

i<

trilen;

i++){

for(intj=0;

j<

3;

j++){

gluProject(

vertex[triangle[i][j]][0],vertex[triangle[i][j]][1],vertex[triangle[i][j]][2],

object,project,view,

&

screen[j][0],&

screen[j][1],&

screen[j][2]

);

}

if(State==CLICK){

if(inTriangle2(Mx,My,screen[0][0],Height-screen[0][1],screen[1][0],Height-screen[1][1],screen[2][0],Height-screen[2][1]))paint[i]=1;

if(State==DRAG){

if(inSquare(screen[0][0],Height-screen[0][1],screen[1][0],Height-screen[1][1],screen[2][0],Height-screen[2][1]))paint[i]=1;

时间复杂度为3×

trilen

3.2核心算法的详细伪码

intinTriangle(intx0,inty0,floatx1,floaty1,floatx2,floaty2,floatx3,floaty3){

floatt1,t2,t3;

//printf("

%f,%f,%f,%f,%f,%f\n"

x1-x0,y1-y0,x2-x0,y2-y0,x3-x0,y3-y0);

t1=theta(x1-x0,y1-y0,x2-x0,y2-y0);

t2=theta(x2-x0,y2-y0,x3-x0,y3-y0);

t3=theta(x1-x0,y1-y0,x3-x0,y3-y0);

%f,%f,%f\n"

t1,t2,t3);

%f,"

fabs(t1+t2+t2-2*3.1415926));

if(fabs(t1+t2+t2-2*3.1415926)<

0.001)return1;

return0;

intinSquare(intx1,inty1,intx2,inty2,intx3,inty3){

intt1,t2,t3,t4,t5,t6;

t1=(x1-Mx)*(x1-oMx);

t2=(x2-Mx)*(x2-oMx);

t3=(x3-Mx)*(x3-oMx);

t4=(y1-My)*(y1-oMy);

t5=(y2-My)*(y2-oMy);

t6=(y3-My)*(y3-oMy);

if((t1<

=0)&

&

(t2<

(t3<

(t4<

(t5<

(t6<

=0))return1;

voidrotate(intox,intoy,intnx,intny){

floatrx=asin(float(nx-ox)/Width/distance),ry=asin(float(ny-oy)/Height/distance);

//变换角

floatax=asin(lz/sqrt(pow(lz,2)+pow(lx,2))),ay=asin(ly/distance);

//原视角

floattx=rx+ax,ty=ry+ay;

//新视角

lx=distance*cos(tx)*cos(ty);

ly=distance*sin(ty);

lz=distance*sin(tx)*cos(ty);

%f,%f,%f,%f,%f,%f,%f\n"

rx,ry,ax,ay,lx,ly,lz);

}

4系统使用方法

同问题描述

5实验结果贴图

6.总结

6.1目前的工作

到目前为止,我们做的事情有:

建立菜单和菜单事件、三维旋转、平移、缩放、投影,点和线框的拾取、渐变填充、纹理填充。

6.2进一步的改进

本实验的旋转、拾取还有很多不完善的地方,实时的线框没有画出来,需要更加完善和精密的算法来完成。

参考文献:

1.OPENGLrefernce

2.OpenGL程序设计

3.计算机图形学(第二版)

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1