当前位置:编程学习 > JAVA >>

Step By Step(Java 2D图形篇<二>)

 

本篇将继续介绍Java 2D 图形部分的内容。

    5.    坐标变换:

    坐标变换是图形编程中非常重要的一项技术,该技术在基于3D的开发中应用更为普遍,我们这里将介绍Java 2D中四种基本的变换:

    1)    比例缩放(scale):放大和缩小从一个固定点出发的所有距离;

    2)    旋转(rotate):环绕着一个固定中心旋转所有点;

    3)    平移(translate):将所有的点移动一个固定量;

    4)    切变(shear):使一个线条固定不变,再按照与该固定线条之间的距离,成比例地将与该线条平行的各个线条"滑动"一个距离量。

    这里提及的四种变换规则可以组合在一起使用,然而需要注意的是,在组合时,Graphics2D是按照相反的顺序执行变换的,如:

1     public void paint(Graphics g) {

2         Graphics2D g2 = (Graphics2D)g;

3         g2.rotate(angle);

4         g2.scale(2,2);

5         g2.translate(x,y);

6     }

 

    对于上面代码中的组合变换,translate将会被最先执行,其次是scale,最后才是rotate。

    在Java 2D的API中提供了AffineTransform类用于描述各种变换,该类提供了一组静态工厂方法用于获取不同的AffineTransform子类,如:getRotateInstance、getScaleInstance、getTranslateInstance和getShearInstance。之后我们再通过Graphics2D.setTransform()方法设置当前Graphics的坐标变换对象。然而在实际的应用中,我们经常需要调用的却是Graphics2D.transform()方法以组合当前的变换和新设置的变换,而setTransform()域方法则是完全替换当前Graphics的变换为新设置的变换。

  1     public class MyTest extends JPanel {

  2         public static void main(String[] args) {

  3             JFrame frame = new JFrame();

  4             frame.setTitle("AffineTransform");

  5             frame.setSize(1000, 600);

  6             frame.addWindowListener(new WindowAdapter() {

  7                 public void windowClosing(WindowEvent e) {

  8                     System.exit(0);

  9                 }

 10             });

 11             Container contentPane = frame.getContentPane();

 12             contentPane.add(new MyTest());

 13             frame.show();

 14         }

 15         public void paintComponent(Graphics g) {

 16             super.paintComponent(g);

 17             g.setColor(Color.orange);

 18             g.drawLine(0, getHeight()/4, getWidth(), getHeight()/4);

 19             g.drawLine(0, getHeight()/2, getWidth(), getHeight()/2);

 20             g.drawLine(0, getHeight()*3/4, getWidth(), getHeight()*3/4);

 21             paintWithGraphicsMethod(g);

 22             paintWithTransform(g);

 23             paintWithSetTransform(g);

 24             paintWithStaticTransformInstance(g);

 25         }

 26         //通过Graphics自身提供的变换方法进行变换

 27         private void paintWithGraphicsMethod(Graphics g) {

 28             //Graphics中的变换都是组合变换方式,

 29             Graphics2D g2d = (Graphics2D) g;

 30             AffineTransform oldTrans = g2d.getTransform();

 31             g2d.setColor(Color.yellow);

 32             g2d.fillRect(20, 20, 60, 60);

 33             //1. 基于原点进行平移变换

 34             g2d.translate(160, 0);

 35             g2d.fillRect(20, 20, 60, 60);

 36             //2. 基于1)平移变换后继续平移变换

 37             g2d.translate(160, 0);

 38             //3. 在2)平移的基础上进行旋转变换

 39             g2d.rotate(Math.PI / 4);

 40             g2d.fillRect(20, 20, 60, 60);

 41             //4. 这里需要特别注意,由于3)中组合了旋转变换,因此这里再直接进行

 42             //平移变换x时,因为坐标系的角度发生了变化,所以不能得到期望的平移

 43             //效果,在平移前需要将3)中的旋转再反向旋转回来。

 44             g2d.rotate(-Math.PI / 4);

 45             g2d.translate(160, 0);

 46             //5. 在4)的基础上做放大变换

 47             g2d.scale(1.5, 1.5);

 48             g2d.fillRect(20, 20, 60, 60);

 49             //6. 做切变变化,可以通过调整shear()方法的两个参数,进一步掌握切变变换

 50             g2d.translate(160, 0);

 51    &

补充:软件开发 , Java ,
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,