【问题标题】:How to use AffineTransform's translate?如何使用 AffineTransform 的翻译?
【发布时间】:2015-02-22 19:50:17
【问题描述】:

我问的不是 AffineTransform 是如何工作的,而是如何使用它的 translate 方法。

我多次阅读 API,但仍然不明白它是如何工作的。

public void translate(double tx,double ty)

将此转换与平移转换连接。这相当于调用 concatenate(T),其中 T 是由以下矩阵表示的 AffineTransform:

      [   1    0    tx  ]
      [   0    1    ty  ]
      [   0    0    1   ]

问题:

  1. affineTransform.translate(100, 0) 以某种方式将图像向右移动 +100 像素,向底部移动 +100 像素。为什么会这样?

  2. 如果我需要经常移动图像,是否可以使用 translate() 来移动图像?如果不是,在框架中移动我的旋转/旋转图像的推荐方法/方式是什么?

【问题讨论】:

  • 1- 通常是的,它应该移动 100x 和 0y,为什么它不移动需要一个可运行的示例来确定。 2-这取决于。通常,我会在应用它或保留原始副本之前创建图形上下文的副本,否则,您需要将其反转。请记住,您申请的任何翻译都是累积的

标签: java swing awt affinetransform


【解决方案1】:

affineTransform.translate(100, 0) 以某种方式将图像向右移动 +100 像素,向底部移动 +100 像素。为什么会这样?

一般来说,是的,它应该将绘图偏移移动到 100x 和 0y,这意味着 Graphics 上下文的 0x0 位置现在将从原始 Graphics 上下文的原点变为 100x0

记住,翻译是累积的,这意味着如果您之前以某种方式翻译了 Graphics 上下文,现在这将添加到它(第一个翻译 0x100,第二个翻译 100x0,您现在是 @987654330 @来自原来的Graphics上下文原点...

如果我需要经常移动图像,是否可以使用 translate() 来移动图像?如果不是,在框架中移动我的旋转/旋转图像的推荐方法/方式是什么?

通常,我使用Graphics#create 创建Graphics 上下文的副本(这会复制当前状态/属性,但仍会将输出生成回Graphics 上下文的原始输出),应用翻译到副本,画我想要的任何东西,然后dispose 复制。这使原始上下文保持不变(关于我已更改的属性)

这意味着您可以单独进行多个翻译,这不会影响以后执行的其他翻译。

另一种方法是反转翻译,但坦率地说,在副本上调用 dispose 更简单、更容易......

【讨论】:

  • 非常感谢您的解决方案。但是,您能否解释为什么当我只向 tx 提供 100 时它会向下移动和向右移动? mathsisfun.com/definitions/translation.html 表明通过给 tx 100,图像应该只向右移动 100 像素。但为什么 Java 的 translate 也将其下移?
  • 除非你能给出一个可运行的例子。您可能会考虑查看this question,我可以在其中遇到初始转换问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-08
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
相关资源
最近更新 更多