`

AffineTransform setToTranslation

阅读更多
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, 200);
		jf.setVisible(true);
                jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
}

class MyCanvas extends JComponent {
	Shape shape;

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

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

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

		g2.setPaint(Color.black);
		g2.draw(shape);

		AffineTransform trans = new AffineTransform();
		trans.setToTranslation(100, 3);

		g2.transform(trans);

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

 

红色矩形是变换之后的,这个程序可以一目了然setToTranslation的作用,相当于是将整个坐标系平移,比如游戏中使用到的画Sprite

public void draw(Graphics2D g) {
    // draw background
    g.drawImage(bgImage, 0, 0, null);

    AffineTransform transform = new AffineTransform();
    for (int i = 0; i < NUM_SPRITES; i++) {
        Sprite sprite = sprites[i];

        // translate the sprite
        transform.setToTranslation(sprite.getX(), sprite.getY());

        // if the sprite is moving left, flip the image
        if (sprite.getVelocityX() < 0) {
            transform.scale(-1, 1);
            transform.translate(-sprite.getWidth(), 0);
        }

        // draw it
        g.drawImage(sprite.getImage(), transform, null);
    }

}

 

其中,setToTranslation方法就被用来实时定位Sprite的位置,而

transform.translate(-sprite.getWidth(), 0);

这句是干吗的呢?从字面理解是将Sprite往后移动一个宽度(面向为前,背对为后)。因为按y轴镜面翻转之后,实际Sprite是往左移动了一个宽度,因为原先该transform的原点在sprite的左上角。

 

分享到:
评论

相关推荐

    AffineTransform_仿射变换_AffineTransform_源码

    在计算机图形学中,仿射变换(AffineTransform)是一种强大的工具,用于改变图像的形状和位置,而保持其直线性质和平行性。这种变换是通过一个2x3的矩阵来实现的,它可以执行平移、旋转、缩放以及倾斜等操作。在C++...

    AffineTransform - MetaTrader 5脚本.zip

    "AffineTransform - MetaTrader 5脚本.zip" 是一个与MT5相关的资源包,包含了将价格数据进行坐标系统变换的脚本,即"affinetransform.mq5"。 `AffineTransform` 是一种数学变换方法,通常用于图像处理或几何图形...

    初步解析Java中AffineTransform类的使用

    在Java中,`AffineTransform`是`java.awt.geom`包下的一个类,主要用于处理二维图形的仿射变换。仿射变换是一种特殊的线性变换,它可以保持图形的直线性和平行性,这意味着变换后的图形仍然保持原有的角度和相对位置...

    AffineTransform

    /* affprojNR.c - subroutine for fitting affine and projective transforms * using numerical recipes in C routines for solving a set of linear equations. * Some care is taken to generate a well-...

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

    这些功能的实现主要依赖于`java.awt.geom`包中的`AffineTransform`类,这是一个强大的几何变换类,可以用于对二维坐标系统进行平移、旋转、缩放等多种操作。 `AffineTransform`类是Java 2D API的核心部分,它提供了...

    java 图片旋转、翻转、镜像处理

    AffineTransform rotateTransform = AffineTransform.getRotateInstance(Math.toRadians(angle), image.getWidth() / 2, image.getHeight() / 2); Graphics2D g2d = (Graphics2D) graphics; g2d.drawImage(image,...

    Java图片翻折,将图像压扁.rar

    AffineTransform transform = new AffineTransform(); // 翻转图像 // 如果想要垂直翻转,可以使用:transform.scale(-1, 1); transform.scale(1, -1); // 水平翻转 // 创建一个新的BufferedImage用于存储...

    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图形验证码

    AffineTransform affineTransform = new AffineTransform(); affineTransform.translate(x, y); affineTransform.rotate(Math.toRadians(random.nextInt(10) - 5)); g.setTransform(affineTransform); g.drawString...

    MAXPCANKAO

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

    Java中Graphics2D直线实例.pdf

    Java的`Graphics2D`类提供了`transform`属性,它是一个`AffineTransform`对象,可以用来执行这些变换操作。`AffineTransform`类提供了多种方法来设置变换属性,例如: 1. `rotate(double arc, double x, double y)`...

    java图片旋转

    - 创建`AffineTransform`对象:通过`AffineTransform.getRotateInstance()`方法创建一个旋转变换,传入旋转中心点的坐标和旋转角度(以弧度为单位)。 - 应用变换:在`Graphics2D`上下文中,调用`drawImage()`方法...

    一个带缩放及翻转功能的图片查看器Java源码示例

    缩放通常通过调整图像的宽度和高度来实现,可以使用`AffineTransform`类创建一个变换对象,然后应用到图像上。这个过程涉及到坐标系统的缩放操作,可能包括等比例放大和缩小。翻转则可以沿着水平或垂直轴进行,同样...

    Java图片倒影效果实例源码

    在这个实例中,我们可能会用到`java.awt.Image`类来代表图片,`java.awt.Graphics2D`类用于绘制和操作图像,以及`java.awt.geom`包下的`AffineTransform`类来进行图像的翻转操作。 1. **Image类**:这是Java中表示...

    swing窗口旋转关闭

    AffineTransform rotateTransform = new AffineTransform(); rotateTransform.rotate(Math.toRadians(angle), this.getWidth() / 2, this.getHeight() / 2); g2d.transform(rotateTransform); // 在这里绘制你...

    pict.rar_pict编程

    AffineTransform transform = new AffineTransform(); transform.translate(250, 50); // 移动到新的位置 transform.scale(-1, 1); // 沿X轴翻转 g2d.setTransform(transform); g2d.fillRect(50, 50, 100, 100)...

    java-图像操作.doc

    AffineTransform at = AffineTransform.getScaleInstance(scaleFactor, scaleFactor); g2d.transform(at); int x = 0; int y = 100; g2d.drawImage(scaledImage, x, y, this); }}} Java 图像操作...

    Java中验证码的简单实现

    AffineTransform affineTransform = new AffineTransform(); affineTransform.rotate(random.nextFloat() * Math.PI / 18, 0, 0); g.setTransform(affineTransform); g.drawString(code, 10, 30); g.dispose...

    基于Java的实例源码-图片翻折,将图像压扁.zip

    AffineTransform transform = new AffineTransform(); transform.concatenate(AffineTransform.getScaleInstance(-1, 1)); Graphics2D g2d = (Graphics2D) image.getGraphics(); g2d.setTransform(transform); ...

    全国计算机二级java上机练习题.pdf

    在`TransformPanel`类中,这些方法可能会利用`AffineTransform`的`rotate()`, `translate()`, `scale()`, 和 `shear()` 方法来改变图形的状态。 6. **布局管理器**: - 使用`BorderLayout`管理`TransformPanel`,...

Global site tag (gtag.js) - Google Analytics