`

AffineTransform

阅读更多
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class MainClass {
	public static void main(String[] args) {
		JFrame jf = new JFrame("Demo");
		Container cp = jf.getContentPane();
		MyCanvas tl = new MyCanvas();
		cp.add(tl);
		jf.setSize(300, 300);
		jf.setVisible(true);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

class MyCanvas extends JComponent {
	Shape shape;

	public MyCanvas() {
		shape = create();
	}

	protected Shape create() {
		float cm = 30f;
		return new Rectangle2D.Float(2*cm, 2*cm, cm, cm);
	}

	public void paint(Graphics g) {
		Graphics2D g2 = (Graphics2D) g;

		g2.setPaint(Color.black);
		g2.draw(shape);
		
		AffineTransform trans = new AffineTransform();
		
		trans.scale(-1, 1);
		
		trans.translate(-120, 0);
		
		g2.transform(trans);

		g2.setPaint(Color.red);
		g2.draw(shape);
	}
}
 


这种效果就是翻转之后再往后移120,但如果这样又为何会如此:

 

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class MainClass {
	public static void main(String[] args) {
		JFrame jf = new JFrame("Demo");
		Container cp = jf.getContentPane();
		MyCanvas tl = new MyCanvas();
		cp.add(tl);
		jf.setSize(300, 300);
		jf.setVisible(true);
		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

class MyCanvas extends JComponent {
	Shape shape;

	public MyCanvas() {
		shape = create();
	}

	protected Shape create() {
		float cm = 30f;
		return new Rectangle2D.Float(2*cm, 2*cm, cm, cm);
	}

	public void paint(Graphics g) {
		Graphics2D g2 = (Graphics2D) g;

		g2.setPaint(Color.black);
		g2.draw(shape);
		
		AffineTransform trans = new AffineTransform();
		
		trans.scale(-1, 1);
		
		g2.transform(trans);
		
		trans.translate(-30, 0);
		
		g2.transform(trans);

		g2.setPaint(Color.red);
		g2.draw(shape);
	}
}
 

结果与上图一样,怎么会这样呢,按理往后移30应该是看不到,原因是这里多了句

g2.transform(trans);

这句是什么作用呢,看解释:

 

Composes an AffineTransform object with the Transform in this Graphics2D according to the rule last-specified-first-applied. If the current Transform is Cx, the result of composition with Tx is a new Transform Cx'. Cx' becomes the current Transform for this Graphics2D . Transforming a point p by the updated Transform Cx' is equivalent to first transforming p by Tx and then transforming the result by the original Transform Cx. In other words, Cx'(p) = Cx(Tx(p)). A copy of the Tx is made, if necessary, so further modifications to Tx do not affect rendering.
Parameters:
Tx - the AffineTransform object to be composed with the current Transform

 

这里貌似是有问题的,Cx'怎么感觉就没翻转过呢,就感觉scale和transform两句没有发生作用一样,这是怎么回事呢?原因就是负负得正了,翻转两次,效果取消,看下文:

 

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
import javax.swing.JComponent;
import javax.swing.JFrame;

public class MainClass {
    public static void main(String[] args) {
        JFrame jf = new JFrame("Demo");
        Container cp = jf.getContentPane();
        MyCanvas tl = new MyCanvas();
        cp.add(tl);
        jf.setSize(300, 300);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

class MyCanvas extends JComponent {
    Shape shape;

    public MyCanvas() {
        shape = create();
    }

    protected Shape create() {
        float cm = 30f;
        return new Rectangle2D.Float(2*cm, 2*cm, cm, cm);
    }

    public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        
        
        g2.translate(90, 0);
        g2.setPaint(Color.black);
        g2.draw(shape);
        g2.drawLine(0, 0, 0, 5);
        g2.drawLine(-30, 0, -30, 5);
        g2.drawLine(-60, 0, -60, 5);
        g2.drawLine(-90, 0, -90, 5);
        g2.drawLine(-120, 0, -120, 5);
        g2.drawLine(30, 0, 30, 5);
        g2.drawLine(60, 0, 60, 5);
        g2.drawLine(90, 0, 90, 5);
        g2.drawLine(120, 0, 120, 5);
        g2.drawLine(150, 0, 150, 5);
        g2.drawLine(180, 0, 180, 5);
        
        AffineTransform trans = new AffineTransform();
        
        trans.scale(-1, 1);
        
        g2.transform(trans);
        g2.transform(trans);

        g2.setPaint(Color.red);
        g2.draw(shape);
    }
}

 


 

这里有完备的教程:

http://www.glyphic.com/transform/applet/1intro.html

 

记住一点,这个对象AffineTransform是面向坐标系操作的,也就是说它的操作对象是坐标系。

 

  • 大小: 7.5 KB
  • 大小: 7.7 KB
分享到:
评论

相关推荐

    初步解析Java中AffineTransform类的使用

    主要介绍了Java中AffineTransform类的使用,AffineTransform类经常被用来处理图片,需要的朋友可以参考下

    AffineTransform_仿射变换_AffineTransform_源码

    对图像做仿射变换,来实现对图像更好的处理,这是主程序cpp

    AffineTransform - MetaTrader 5脚本.zip

    本指标传送价格数据到新的坐标系统上转换价格轴(纵坐标轴)。

    mapinfo mapx5.0开发指南下

    目 录 欢迎使用... . . . . . . . ....MapInfo MapX 的新增功能 ....关于 MapInfo ....第 1 章: MapX 简介 ....地图绘制简介 ....使 MapX 适合您工作 ....主要功能概述 ....学习 MapX....第 2 章: MapX 基础 ....Map 对象 ....

    swing文件拖拽

    import java.awt.geom.AffineTransform; import java.awt.geom.Rectangle2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; ...

    java多种改变字体样式实例

    AffineTransform transform = new AffineTransform(); transform.setToTranslation(w/2-sw/2,h/2); Shape shape = tl.getOutline(transform); g2.setClip(shape); g2.setColor(Color.blue); g2.fill(shape....

    Java图片查看器 源代码

    import java.awt.geom.AffineTransform; import java.io.*;//数据流、序列化和文件系统提供系统输入和输出 import java.util.ArrayList;//最大限度地减少实现“随机访问”数据存储(如数组)支持的该接口所需的工作...

    基于SpringMVC annotation 的图形验证码

    AffineTransform trans = new AffineTransform(); trans.rotate(random.nextInt(45) * 3.14 / 180, 15 * i + 10, 7); // 缩放文字 float scaleSize = random.nextFloat() + 0.8f; if (scaleSize > 1.1f) scale...

    MAXPCANKAO

    AffineTransform对象, AffineTransform对象使您可以定义旋转或倾斜的坐标系。

    liuyueyi#quick-media#图片旋转问题修复1

    1.1. Graphics2d 方式 1.2. AffineTransform 方式 1.3 参考

    Java实现图片的拖拉变形放大缩小.rar

    Java实现图片的拖拉变形放大缩小,四个方向都可以拉大缩小图片,技术方面,使用java.awt.geom 包中的AffineTransform 类来实现图片拖拉缩放功能。

    JAVA技术:上传图片的缩放处理

    图片上传到服务器后,会根据情况将图片缩小成一个图标,我们可以利用java强大的图形处理功能,对上传的图片进行缩放处理。本文的程序使用jdk1.4中最新的ImageIO对图片进行读写,使用AffineTransform对图片进行缩放。

    Simple_asteroids:简单的小行星游戏。 使用Java开发

    它使用AffineTransform类来移动和旋转几何对象,这就是为什么它在算法上不快的原因。 音乐来自Freesound.org。 在游戏中,音乐由orangefreesound制作,其名称为“ 115 bpm的电子音乐循环”。 激光射击声是由...

    dip:使用OpenCVC ++ Python 3进行数字图像处理

    实现AffineTransform类 实现最近邻插值类 实现双线性插值层 在GeometricTransformer类中实现Transform函数 放大和缩小图像 调整图像大小 围绕中心旋转图像(保留图像内容) 围绕中心旋转图像(不保留图像内容) ...

    Java拉伸缩放图像

    摘要:Java源码,图形操作,图片拉伸,图像放大 Java拉伸缩放图像,滑动滑块时,图像实时地在相应的方向上拉伸...具体来说是使用java.awt.geom 包中的AffineTransform 类,来实现图像的拉伸缩放。 运行环境:Java/Eclipse

    java生成带图片的微信二维码

     import java.awt.geom.AffineTransform;   import java.awt.image.AffineTransformOp;   import java.awt.image.BufferedImage;   import java.io.File;   import java.io.IOException;   import ...

    JSP + Servlet实现生成登录验证码示例

    随机生成四位数验证码,包括汉字,数字,英文大小写。 1.Servlet类 ...import java.awt.geom.AffineTransform; import java.awt.geom.Line2D; import java.awt.image.BufferedImage; import java.i

Global site tag (gtag.js) - Google Analytics