




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、贵州大学实验报告学院: 计算机科学与信息学院 专业:软件工程 班级: 102班姓名学号实验组实验时间指导教师成绩实验项目名称实验四 几何变换实验目的掌握二维图形的几何变换的基本原理。二维图形的基本几何变换:位置改变(平移、旋转)和变形(缩放、错切,反射、投影等)以及复合变换。了解三维图形的错切变换实验要求根据本实验的特点、要求和具体条件,掌握二维图形的几何变换的基本原理,了解三维图形的错切变换,并成功编写测试代码进行实验。1.设有一三角形ABC,其中三个顶点为A(5,10),B(1,2),C(8,5),如三角形的顶点A不变,将AB和AC边缩小一倍后,求缩小后的三角形对于直线-2x+4y+3=0
2、的对称变换后的结果图。2将一四边形以原点为中心,以15°为间隔旋转。3.在三维坐标中,对长度为1的标准立方体做错切变换,错切单位为2;实验原理一、实验原理:标准齐次坐标(x,y,1) 二维变换的矩阵表示平移变换旋转变换放缩变换平移变换只改变图形的位置,不改变图形的大小。旋转变换不改变图形的形状放缩变换引起图形形状的变化。复合变换结果与变换的顺序有关(矩阵乘法不可交换)二、Java3D在java3D中坐标轴的显示如下所示:Java3D的编程思想显示如下:在实验时,要引入相关的jar包,显示如下所示:实验环境硬件平台:PC机软件:Windows7平台,eclipse集成开发环境,java
3、编程语言。 Java 3D实验步骤1. 掌握算法原理;2. 依据算法,编写源程序并进行调试;3. 对运行结果进行保存与分析;4. 把源程序以文件的形式提交;5. 按格式书写实验报告。实验内容处理点的类:package wangqian.draw.transform;public class MyPoint private int x;private int y;public MyPoint() public MyPoint(int x, int y) super();this.x = x;this.y = y;public int getX() return x;public void set
4、X(int x) this.x = x;public int getY() return y;public void setY(int y) this.y = y;三角形的变换核心代码:三角形点的录入:public void putPoint1() MyPoint point1 = new MyPoint();point1.setX(100);point1.setY(200);pointlist.add(point1);MyPoint point2 = new MyPoint();point2.setX(20);point2.setY(40);pointlist.add(point2);MyP
5、oint point3 = new MyPoint();point3.setX(160);point3.setY(100);pointlist.add(point3);MyPoint point4 = new MyPoint();point4.setX(100);point4.setY(200);pointlist.add(point4);根据点画三角形:if (num = 1) for (int i = 1; i < pointlist.size(); i+) / 根据给出的顶点画线MyPoint p1 = pointlist.get(i);int x1 = p1.getX();int
6、 y1 = p1.getY();MyPoint p2 = pointlist.get(i - 1);int x2 = p2.getX();int y2 = p2.getY();g.drawLine(x1, y1, x2, y2); 三角形的缩小变换:private void changePictureSize(MyPoint unchangedpoint, double sx, double sy) for (MyPoint pb : pointlist) pb.setX(int) (pb.getX() * sx + unchangedpoint.getX() * (1 - sx);pb.se
7、tY(int) (pb.getY() * sy + unchangedpoint.getY() * (1 - sy);g.setColor(Color.BLUE);drawPicture(1);三角形关于特定直线的对称变换:private void changePictureLocation() for (MyPoint pb : pointlist) double x1 = (pb.getY() + 2 * pb.getX() + 0.75) / 2.5;double y1 = (pb.getY() + 2 * pb.getX() - 3) / 5.0;pb.setX(int) (x1 +
8、(x1 - pb.getX();pb.setY(int) (y1 - (pb.getY() - y1);g.setColor(Color.BLUE);drawPicture(1);四边形的旋转变换:四边形点的录入和绘画同三角形四边形的旋转函数显示如下:private void spinPicture() double r;r = 15 / 180.0 * 3.1415926;/ 旋转150for (MyPoint pb : pointlist2) / 遍历多边形的顶点double x1 = pb.getX() * Math.cos(r) - pb.getY() * Math.sin(r);/
9、根据度数和顶点值来确定改变的顶点double y1 = pb.getX() * Math.sin(r) + pb.getY() * Math.cos(r);pb.setX(int) (x1);pb.setY(int) (y1);g.setColor(Color.ORANGE);drawPicture(2);键盘的监听类:class KeyMonitor extends KeyAdapter public void keyPressed(KeyEvent e) switch (e.getKeyCode() case KeyEvent.VK_C:/清空画布panel.repaint();break
10、;case KeyEvent.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;case KeyEvent.VK_2:/准备进行四边形的变换putPoint2();g.setColor(Color.MAGENTA);drawPicture(2);g.drawLine(0, 0, 0, 600);g.
11、drawLine(0, 0, 600, 0);break;case KeyEvent.VK_3:BasicConstruct bc = new BasicConstruct();bc.addMyBox(x, y, z, bc);break;case KeyEvent.VK_S:/图形的缩小变换changePictureSize(pointlist.get(0), 0.5, 0.5);break;case KeyEvent.VK_L:/图形的对称变换changePictureLocation();break;case KeyEvent.VK_T:/四边形的旋转变换spinPicture();br
12、eak;case KeyEvent.VK_E:/复原3D图形x = 0.1f;y = 0.1f;z = 0.1f;break;case KeyEvent.VK_X:/X轴的错切变换BasicConstruct bc0 = new BasicConstruct();x = x + 0.1f;/x轴错切,改变x轴的比例,bc0.addMyBox(x, y, z, bc0);/长方体的绘制函数break;case KeyEvent.VK_Y:/Y轴的错切变换BasicConstruct bc1 = new BasicConstruct();y = y + 0.1f;/y轴错切,改变y轴的比例,bc1
13、.addMyBox(x, y, z, bc1);break;case KeyEvent.VK_Z:/Z轴的错切变换BasicConstruct bc2 = new BasicConstruct();z = z + 0.1f;/z轴错切,改变z轴的比例,bc2.addMyBox(x, y, z, bc2);break;default:;3D图形的框架搭建/* * 绘制三维图形的类 * 里面包含了绘制长方体的方法和鼠标的监听事件 */public class BasicConstruct extends JFrame protected SimpleUniverse simpleU;protect
14、ed BranchGroup rootBranchGroup;public BasicConstruct() initial_setup();/* * 初始化步骤 */protected void initial_setup() getContentPane().setLayout(new BorderLayout();/ 得到框架和设置布局GraphicsConfiguration config = SimpleUniverse.getPreferredConfiguration();/ 得到配置函数Canvas3D canvas3D = new Canvas3D(config);/ 创建3
15、d图形的面板getContentPane().add("Center", canvas3D);/ 把3d图形面板添加到框架上simpleU = new SimpleUniverse(canvas3D);/ 设置3d图形的画布形式rootBranchGroup = new BranchGroup();/* * 设置3d画布的视角以及高光等参数 */public void addDirectionalLight(Vector3f direction, Color3f color) BoundingSphere bounds = new BoundingSphere();boun
16、ds.setRadius(1000d);DirectionalLight lightD = new DirectionalLight(color, direction);lightD.setInfluencingBounds(bounds);rootBranchGroup.addChild(lightD);/* * 本次实验的核心函数 创建长方体的函数 需要长方体的长宽高比例以及颜色 */public void addBox(float x, float y, float z, Color3f diffuse, Color3f spec) Appearance app = new Appear
17、ance();/ 设置长方体的视角以及绘制参数Material mat = new Material();/ 创建节点mat.setDiffuseColor(diffuse);/ 设置长方体的轮廓颜色和表面颜色mat.setSpecularColor(spec);mat.setShininess(5.0f);/ 超出范围则不显示app.setMaterial(mat);Box box = new Box(x, y, z, app);/ 创建长方体TransformGroup tg = new TransformGroup();tg.addChild(box);rootBranchGroup.a
18、ddChild(tg);tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE);tg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ);/* * 创建鼠标事件,使长方体能够被移动和旋转 */MouseRotate myMouseRotate = new MouseRotate();myMouseRotate.setTransformGroup(tg);myMouseRotate.setSchedulingBounds(new BoundingSphere();rootBranchGroup
19、.addChild(myMouseRotate);MouseTranslate myMouseTranslate = new MouseTranslate();myMouseTranslate.setTransformGroup(tg);myMouseTranslate.setSchedulingBounds(new BoundingSphere();rootBranchGroup.addChild(myMouseTranslate);MouseZoom myMouseZoom = new MouseZoom();myMouseZoom.setTransformGroup(tg);myMous
20、eZoom.setSchedulingBounds(new BoundingSphere();rootBranchGroup.addChild(myMouseZoom);public void finalise() simpleU.addBranchGraph(rootBranchGroup);simpleU.getViewingPlatform().setNominalViewingTransform();/* * 封装类需要调用的函数,主要是整合3d长方体的创建 */public void addMyBox(float x, float y, float z, BasicConstruct bc) bc.setSize(1024, 768);bc.addBox(x, y, z, new Color3f(1, 0, 0), new Color3f(1, 0, 0);bc.addDirectionalLight(new Vector3f(0f, 0f, -1),new Color3f(1f, 1f, 0f);bc.finalise();bc.show();return;实验结果本次实验中图形的变换可以通过键盘来控制。1、运行程序之后,点击“1”进入三角形的变换:2、点击“S”进行三角形的缩
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 出口经营合同样本
- 制作广告长期合同标准文本
- 修复地面合同标准文本
- 冠名使用合同标准文本
- 内科医疗质量控制提升计划
- 科技公司商业计划书范文
- 工业生产企业感染疫情报告流程
- 桥梁建设钢筋安装施工工艺流程
- 中小学教育改革中教师角色心得体会
- 小学三年级语文复习计划
- QC成果减少隧道工程Ⅳ类Ⅴ类围岩超挖量
- LY/T 1763-2008沿海防护林体系工程建设技术规程
- 《质量回溯》培训课件
- GB/T 1687.3-2016硫化橡胶在屈挠试验中温升和耐疲劳性能的测定第3部分:压缩屈挠试验(恒应变型)
- GB/T 13140.2-2008家用和类似用途低压电路用的连接器件第2部分:作为独立单元的带螺纹型夹紧件的连接器件的特殊要求
- 浙江省医疗机构麻醉药品、精神药品管理实施细则
- 行政事业单位日常公用支出管理办法
- 2023年山西晋勤科技文化有限责任公司招聘笔试题库及答案解析
- 肝脏结核CT表现课件
- 《沉淀溶解平衡》说播课课件(全国高中化学优质课大赛获奖案例)
- 五年级《红楼梦》知识考试题库(含答案)
评论
0/150
提交评论