计算机图形学实验报告Word格式文档下载.docx
- 文档编号:21043500
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:11
- 大小:478.30KB
计算机图形学实验报告Word格式文档下载.docx
《计算机图形学实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验报告Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。
(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.计算机图形学(第二版)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)