1、放缩变换平移变换只改变图形的位置,不改变图形的大小。旋转变换不改变图形的形状放缩变换引起图形形状的变化。复合变换结果与变换的顺序有关(矩阵乘法不可交换)二、Java3D在java3D中坐标轴的显示如下所示:Java3D的编程思想显示如下:在实验时,要引入相关的jar包,显示如下所示:实验环境硬件平台:PC机软件:Windows7平台,eclipse集成开发环境,java编程语言。 Java 3D实验步骤1. 掌握算法原理;2. 依据算法,编写源程序并进行调试;3. 对运行结果进行保存与分析;4. 把源程序以文件的形式提交;5. 按格式书写实验报告。实验内容处理点的类:package wangq
2、ian.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 setX(int x) public int getY() return y; public void setY(int y) 三角形的变换核心代码:三角形点的录入:public void putPoint1() MyPo
3、int 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); MyPoint point3 = new MyPoint(); point3.setX(160); point3.setY(100); pointlist.add(point3); MyPoint point4 = new MyPoint(); p
4、oint4.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 y1 = p1.getY(); MyPoint p2 = pointlist.get(i - 1); int x2 = p2.getX(); int y2 = p2.getY(); g.drawLine(x1, y1, x2, y
5、2); 三角形的缩小变换:private void changePictureSize(MyPoint unchangedpoint, double sx, double sy) for (MyPoint pb : 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);三角形关于特定直线的对称
6、变换:private void changePictureLocation() 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 + (x1 - pb.getX(); pb.setY(int) (y1 - (pb.getY() - y1);四边形的旋转变换:四边形点的录入和绘画同三角形四边形的旋转函数显示如下:private void spinPicture() double r; r = 15 / 1
7、80.0 * 3.1415926;/ 旋转150 pointlist2) / 遍历多边形的顶点 double x1 = pb.getX() * Math.cos(r) - pb.getY() * Math.sin(r);/ 根据度数和顶点值来确定改变的顶点 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 exte
8、nds KeyAdapter public void keyPressed(KeyEvent e) switch (e.getKeyCode() case KeyEvent.VK_C:/清空画布 panel.repaint(); break; 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)
9、 (397 / 4); case KeyEvent.VK_2:/准备进行四边形的变换 putPoint2(); g.setColor(Color.MAGENTA); drawPicture(2); case KeyEvent.VK_3: BasicConstruct bc = new BasicConstruct(); bc.addMyBox(x, y, z, bc); case KeyEvent.VK_S:/图形的缩小变换 changePictureSize(pointlist.get(0), 0.5, 0.5); case KeyEvent.VK_L:/图形的对称变换 changePict
10、ureLocation(); case KeyEvent.VK_T:/四边形的旋转变换 spinPicture(); case KeyEvent.VK_E:/复原3D图形 x = 0.1f; y = 0.1f; z = 0.1f; case KeyEvent.VK_X:/X轴的错切变换 BasicConstruct bc0 = new BasicConstruct(); x = x + 0.1f;/x轴错切,改变x轴的比例, bc0.addMyBox(x, y, z, bc0);/长方体的绘制函数 case KeyEvent.VK_Y:/Y轴的错切变换 BasicConstruct bc1 =
11、 new BasicConstruct(); y = y + 0.1f;/y轴错切,改变y轴的比例, bc1.addMyBox(x, y, z, bc1); case KeyEvent.VK_Z:/Z轴的错切变换 BasicConstruct bc2 = new BasicConstruct(); z = z + 0.1f;/z轴错切,改变z轴的比例, bc2.addMyBox(x, y, z, bc2); default: ; 3D图形的框架搭建/* * 绘制三维图形的类 * 里面包含了绘制长方体的方法和鼠标的监听事件 */public class BasicConstruct extend
12、s JFrame protected SimpleUniverse simpleU; protected BranchGroup rootBranchGroup; public BasicConstruct() initial_setup(); /* * 初始化步骤 protected void initial_setup() getContentPane().setLayout(new BorderLayout();/ 得到框架和设置布局 GraphicsConfiguration config = SimpleUniverse .getPreferredConfiguration();/
13、得到配置函数 Canvas3D canvas3D = new Canvas3D(config);/ 创建3d图形的面板 getContentPane().add(Center, canvas3D);/ 把3d图形面板添加到框架上 simpleU = new SimpleUniverse(canvas3D);/ 设置3d图形的画布形式 rootBranchGroup = new BranchGroup(); * 设置3d画布的视角以及高光等参数 public void addDirectionalLight(Vector3f direction, Color3f color) BoundingS
14、phere bounds = new BoundingSphere(); bounds.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, C
15、olor3f spec) Appearance app = new Appearance();/ 设置长方体的视角以及绘制参数 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 Tran
16、sformGroup(); tg.addChild(box); rootBranchGroup.addChild(tg); tg.setCapability(TransformGroup.ALLOW_TRANSFORM_WRITE); tg.setCapability(TransformGroup.ALLOW_TRANSFORM_READ); /* * 创建鼠标事件,使长方体能够被移动和旋转 */ MouseRotate myMouseRotate = new MouseRotate(); myMouseRotate.setTransformGroup(tg); myMouseRotate.s
17、etSchedulingBounds(new BoundingSphere(); rootBranchGroup.addChild(myMouseRotate); MouseTranslate myMouseTranslate = new MouseTranslate(); myMouseTranslate.setTransformGroup(tg); myMouseTranslate.setSchedulingBounds(new BoundingSphere(); rootBranchGroup.addChild(myMouseTranslate); MouseZoom myMouseZo
18、om = new MouseZoom(); myMouseZoom.setTransformGroup(tg); myMouseZoom.setSchedulingBounds(new BoundingSphere(); rootBranchGroup.addChild(myMouseZoom); public void finalise() simpleU.addBranchGraph(rootBranchGroup); simpleU.getViewingPlatform().setNominalViewingTransform(); * 封装类需要调用的函数,主要是整合3d长方体的创建
19、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”进入
20、三角形的变换: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轴方向的错切:实验总
21、结本次实验让我了解并掌握了图形的基本几何变换,对于本次实验,有如下说明:1、 本次实验继承了JFrame,并在程序中使用了JPanel,使得画笔的获得更为方便,可直接在函数中调用声明为成员变量的画笔,从而避免了作为参数传递的麻烦。2、 本次实验中运用了tanslate(int x,int y)函数,将图形上下文的点平移到当前坐标系中的点 (x,y)。便于实验结果的观察。本次实验的不足在于:改变大小的函数,对称变换的函数以及旋转变换的函数中均存在对double类型数的取整运算,使得实验结果存在必然的误差,在改变大小以及对称变换中体现的不明显,但是在旋转变换中误差很明显:在旋转一周多时图形显示如下:由上图可以看出图形变小了。旋转多周后效果更为明显:给要进行取整运算的表达式加上0.5,这个问题仍然存在,这个旋转问题在本次实验中还没有找到更好的解决办法,希望在今后的学习中可以得到解决。指导教师意见签名: 年 月 日