计算机图形学实验四几何变换.docx

上传人:b****7 文档编号:16791930 上传时间:2023-07-17 格式:DOCX 页数:23 大小:990.01KB
下载 相关 举报
计算机图形学实验四几何变换.docx_第1页
第1页 / 共23页
计算机图形学实验四几何变换.docx_第2页
第2页 / 共23页
计算机图形学实验四几何变换.docx_第3页
第3页 / 共23页
计算机图形学实验四几何变换.docx_第4页
第4页 / 共23页
计算机图形学实验四几何变换.docx_第5页
第5页 / 共23页
计算机图形学实验四几何变换.docx_第6页
第6页 / 共23页
计算机图形学实验四几何变换.docx_第7页
第7页 / 共23页
计算机图形学实验四几何变换.docx_第8页
第8页 / 共23页
计算机图形学实验四几何变换.docx_第9页
第9页 / 共23页
计算机图形学实验四几何变换.docx_第10页
第10页 / 共23页
计算机图形学实验四几何变换.docx_第11页
第11页 / 共23页
计算机图形学实验四几何变换.docx_第12页
第12页 / 共23页
计算机图形学实验四几何变换.docx_第13页
第13页 / 共23页
计算机图形学实验四几何变换.docx_第14页
第14页 / 共23页
计算机图形学实验四几何变换.docx_第15页
第15页 / 共23页
计算机图形学实验四几何变换.docx_第16页
第16页 / 共23页
计算机图形学实验四几何变换.docx_第17页
第17页 / 共23页
计算机图形学实验四几何变换.docx_第18页
第18页 / 共23页
计算机图形学实验四几何变换.docx_第19页
第19页 / 共23页
计算机图形学实验四几何变换.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

计算机图形学实验四几何变换.docx

《计算机图形学实验四几何变换.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验四几何变换.docx(23页珍藏版)》请在冰点文库上搜索。

计算机图形学实验四几何变换.docx

计算机图形学实验四几何变换

贵州大学实验报告

学院:

计算机科学与信息学院专业:

软件工程班级:

102班

姓名

学号

实验组

实验时间

指导教师

成绩

实验项目名称

实验四几何变换

实验目的

掌握二维图形的几何变换的基本原理。

二维图形的基本几何变换:

位置改变(平移、旋转)和变形(缩放、错切,反射、投影等)以及复合变换。

了解三维图形的错切变换

实验要求

根据本实验的特点、要求和具体条件,掌握二维图形的几何变换的基本原理,了解三维图形的错切变换,并成功编写测试代码进行实验。

1.设有一三角形ABC,其中三个顶点为A(5,10),B(1,2),C(8,5),如三角形的顶点A不变,将AB和AC边缩小一倍后,求缩小后的三角形对于直线-2x+4y+3=0的对称变换后的结果图。

2.将一四边形以原点为中心,以15°为间隔旋转。

3.在三维坐标中,对长度为1的标准立方体做错切变换,错切单位为2;

实验原理

一、实验原理:

标准齐次坐标(x,y,1)二维变换的矩阵表示

平移变换

旋转变换

放缩变换

平移变换只改变图形的位置,不改变图形的大小。

旋转变换不改变图形的形状

放缩变换引起图形形状的变化。

 

复合变换

结果与变换的顺序有关(矩阵乘法不可交换)

二、Java3D

在java3D中坐标轴的显示如下所示:

Java3D的编程思想显示如下:

在实验时,要引入相关的jar包,显示如下所示:

实验环境

硬件平台:

PC机

软件:

Windows7平台,eclipse集成开发环境,java编程语言。

Java3D

实验步骤

1.掌握算法原理;

2.依据算法,编写源程序并进行调试;

3.对运行结果进行保存与分析;

4.把源程序以文件的形式提交;

5.按格式书写实验报告。

实验内容

处理点的类:

packagewangqian.draw.transform;

publicclassMyPoint{

privateintx;

privateinty;

publicMyPoint(){

}

publicMyPoint(intx,inty){

super();

this.x=x;

this.y=y;

}

publicintgetX(){

returnx;

}

publicvoidsetX(intx){

this.x=x;

}

publicintgetY(){

returny;

}

publicvoidsetY(inty){

this.y=y;

}

}

三角形的变换

核心代码:

三角形点的录入:

publicvoidputPoint1(){

MyPointpoint1=newMyPoint();

point1.setX(100);

point1.setY(200);

pointlist.add(point1);

MyPointpoint2=newMyPoint();

point2.setX(20);

point2.setY(40);

pointlist.add(point2);

MyPointpoint3=newMyPoint();

point3.setX(160);

point3.setY(100);

pointlist.add(point3);

MyPointpoint4=newMyPoint();

point4.setX(100);

point4.setY(200);

pointlist.add(point4);

}

根据点画三角形:

if(num==1){

for(inti=1;i

MyPointp1=pointlist.get(i);

intx1=p1.getX();

inty1=p1.getY();

MyPointp2=pointlist.get(i-1);

intx2=p2.getX();

inty2=p2.getY();

g.drawLine(x1,y1,x2,y2);

}

}

三角形的缩小变换:

privatevoidchangePictureSize(MyPointunchangedpoint,doublesx,doublesy){

for(MyPointpb:

pointlist){

pb.setX((int)(pb.getX()*sx+unchangedpoint.getX()*(1-sx)));

pb.setY((int)(pb.getY()*sy+unchangedpoint.getY()*(1-sy)));

}

g.setColor(Color.BLUE);

drawPicture

(1);

}

三角形关于特定直线的对称变换:

privatevoidchangePictureLocation(){

for(MyPointpb:

pointlist){

doublex1=(pb.getY()+2*pb.getX()+0.75)/2.5;

doubley1=(pb.getY()+2*pb.getX()-3)/5.0;

pb.setX((int)(x1+(x1-pb.getX())));

pb.setY((int)(y1-(pb.getY()-y1)));

}

g.setColor(Color.BLUE);

drawPicture

(1);

}

四边形的旋转变换:

四边形点的录入和绘画同三角形

四边形的旋转函数显示如下:

privatevoidspinPicture(){

doubler;

r=15/180.0*3.1415926;//旋转150

for(MyPointpb:

pointlist2){//遍历多边形的顶点

doublex1=pb.getX()*Math.cos(r)-pb.getY()*Math.sin(r);//根据度数和顶点值来确定改变的顶点

doubley1=pb.getX()*Math.sin(r)+pb.getY()*Math.cos(r);

pb.setX((int)(x1));

pb.setY((int)(y1));

}

g.setColor(Color.ORANGE);

drawPicture

(2);

}

键盘的监听类:

classKeyMonitorextendsKeyAdapter{

publicvoidkeyPressed(KeyEvente){

switch(e.getKeyCode()){

caseKeyEvent.VK_C:

//清空画布

panel.repaint();

break;

caseKeyEvent.VK_1:

//准备进行三角形的变换

putPoint1();

g.setColor(Color.RED);

drawPicture

(1);

g.drawLine(0,0,0,600);

g.drawLine(0,0,600,0);

g.drawLine(-30,(int)(-63/4),200,(int)(397/4));

break;

caseKeyEvent.VK_2:

//准备进行四边形的变换

putPoint2();

g.setColor(Color.MAGENTA);

drawPicture

(2);

g.drawLine(0,0,0,600);

g.drawLine(0,0,600,0);

break;

caseKeyEvent.VK_3:

BasicConstructbc=newBasicConstruct();

bc.addMyBox(x,y,z,bc);

break;

caseKeyEvent.VK_S:

//图形的缩小变换

changePictureSize(pointlist.get(0),0.5,0.5);

break;

caseKeyEvent.VK_L:

//图形的对称变换

changePictureLocation();

break;

caseKeyEvent.VK_T:

//四边形的旋转变换

spinPicture();

break;

caseKeyEvent.VK_E:

//复原3D图形

x=0.1f;

y=0.1f;

z=0.1f;

break;

caseKeyEvent.VK_X:

//X轴的错切变换

BasicConstructbc0=newBasicConstruct();

x=x+0.1f;//x轴错切,改变x轴的比例,

bc0.addMyBox(x,y,z,bc0);//长方体的绘制函数

break;

caseKeyEvent.VK_Y:

//Y轴的错切变换

BasicConstructbc1=newBasicConstruct();

y=y+0.1f;//y轴错切,改变y轴的比例,

bc1.addMyBox(x,y,z,bc1);

break;

caseKeyEvent.VK_Z:

//Z轴的错切变换

BasicConstructbc2=newBasicConstruct();

z=z+0.1f;//z轴错切,改变z轴的比例,

bc2.addMyBox(x,y,z,bc2);

break;

default:

;

}

}

}

3D图形的框架搭建

/*

*绘制三维图形的类

*里面包含了绘制长方体的方法和鼠标的监听事件

*/

publicclassBasicConstructextendsJFrame{

protectedSimpleUniversesimpleU;

protectedBranchGrouprootBranchGroup;

publicBasicConstruct(){

initial_setup();

}

/*

*初始化步骤

*/

protectedvoidinitial_setup(){

getContentPane().setLayout(newBorderLayout());//得到框架和设置布局

GraphicsConfigurationconfig=SimpleUniverse

.getPreferredConfiguration();//得到配置函数

Canvas3Dcanvas3D=newCanvas3D(config);//创建3d图形的面板

getContentPane().add("Center",canvas3D);//把3d图形面板添加到框架上

simpleU=newSimpleUniverse(canvas3D);//设置3d图形的画布形式

rootBranchGroup=newBranchGroup();

}

/*

*设置3d画布的视角以及高光等参数

*/

publicvoidaddDirectionalLight(Vector3fdirection,Color3fcolor){

BoundingSpherebounds=newBoundingSphere();

bounds.setRadius(1000d);

DirectionalLightlightD=newDirectionalLight(color,direction);

lightD.setInfluencingBounds(bounds);

rootBranchGroup.addChild(lightD);

}

/*

*本次实验的核心函数创建长方体的函数需要长方体的长宽高比例以及颜色

*/

publicvoidaddBox(floatx,floaty,floatz,Color3fdiffuse,Color3fspec){

Appearanceapp=newAppearance();//设置长方体的视角以及绘制参数

Materialmat=newMaterial();//创建节点

mat.setDiffuseColor(diffuse);//设置长方体的轮廓颜色和表面颜色

mat.setSpecularColor(spec);

mat.setShininess(5.0f);//超出范围则不显示

app.setMaterial(mat);

Boxbox=newBox(x,y,z,app);//创建长方体

TransformGrouptg=newTransformGroup();

tg.addChild(box);

rootBranchGroup.addChild(tg);

tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);

tg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);

/*

*创建鼠标事件,使长方体能够被移动和旋转

*/

MouseRotatemyMouseRotate=newMouseRotate();

myMouseRotate.setTransformGroup(tg);

myMouseRotate.setSchedulingBounds(newBoundingSphere());

rootBranchGroup.addChild(myMouseRotate);

MouseTranslatemyMouseTranslate=newMouseTranslate();

myMouseTranslate.setTransformGroup(tg);

myMouseTranslate.setSchedulingBounds(newBoundingSphere());

rootBranchGroup.addChild(myMouseTranslate);

MouseZoommyMouseZoom=newMouseZoom();

myMouseZoom.setTransformGroup(tg);

myMouseZoom.setSchedulingBounds(newBoundingSphere());

rootBranchGroup.addChild(myMouseZoom);

}

publicvoidfinalise(){

simpleU.addBranchGraph(rootBranchGroup);

simpleU.getViewingPlatform().setNominalViewingTransform();

}

/*

*封装类需要调用的函数,主要是整合3d长方体的创建

*/

publicvoidaddMyBox(floatx,floaty,floatz,BasicConstructbc){

bc.setSize(1024,768);

bc.addBox(x,y,z,newColor3f(1,0,0),newColor3f(1,0,0));

bc.addDirectionalLight(newVector3f(0f,0f,-1),

newColor3f(1f,1f,0f));

bc.finalise();

bc.show();

return;

}

}

实验结果

本次实验中图形的变换可以通过键盘来控制。

1、运行程序之后,点击“1”进入三角形的变换:

2、点击“S”进行三角形的缩小变换:

如上图所示,蓝色的三角形为原三角形缩小后的三角形。

3、点击“L”键,进行三角形关于直线-2x+4y+3=0的对称变换:

如图所示,直线上方的三角形即为关于直线对称后得到的三角形。

4、点击“C”键,清空画布,进行四边形的变换:

5、点击“2”键,进行四边形的变换:

6、点击“T”键,进行四边形的旋转变换,旋转角度为15度:

7、点击“3”查看java3D的立方体:

用鼠标拖动即可对立方体进行旋转,查看其3D视图:

8、点击“X”键,对立方体进行X轴方向的错切:

9、点击“Y”键,对立方体进行Y轴方向的错切:

10、点击“Z”键,对立方体进行Z轴方向的错切:

实验总结

本次实验让我了解并掌握了图形的基本几何变换,对于本次实验,有如下说明:

1、本次实验继承了JFrame,并在程序中使用了JPanel,使得画笔的获得更为方便,可直接在函数中调用声明为成员变量的画笔,从而避免了作为参数传递的麻烦。

2、本次实验中运用了tanslate(intx,inty)函数,将图形上下文的点平移到当前坐标系中的点(x, y)。

便于实验结果的观察。

本次实验的不足在于:

改变大小的函数,对称变换的函数以及旋转变换的函数中均存在对double类型数的取整运算,使得实验结果存在必然的误差,在改变大小以及对称变换中体现的不明显,但是在旋转变换中误差很明显:

在旋转一周多时图形显示如下:

由上图可以看出图形变小了。

旋转多周后效果更为明显:

给要进行取整运算的表达式加上0.5,这个问题仍然存在,这个旋转问题在本次实验中还没有找到更好的解决办法,希望在今后的学习中可以得到解决。

指导教师意见

 

签名:

年月日

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

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

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2