如何使用AffineTransform的translate方法?

5

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

我已经多次阅读了API,但仍然不理解它的工作原理。

public void translate(double tx,double ty)

Concatenates this transform with a translation transformation. This is equivalent to calling concatenate(T), where T is an AffineTransform represented by the following matrix:

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

问题:

  1. affineTransform.translate(100, 0) 怎么会将图像向右移动100像素并向下移动100像素?为什么会这样?

  2. 如果我需要经常移动我的图像,我是否使用 translate() 来移动它们?如果不是,移动旋转/旋转后的图像的推荐方法/方式是什么?


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

3
affineTransform.translate(100, 0) 会将图像向右移动100个像素,向下移动100个像素。为什么会这样呢?
通常情况下,它会将绘图偏移量移动到100x和0y,这意味着Graphics上下文的0x0位置现在将从原始Graphics上下文的原点移动到100x0。
请记住,平移是累加的,这意味着如果您之前以某种方式平移了Graphics上下文,则现在会添加到其中(第一次平移0x100,第二次平移100x0,您现在距离原始Graphics上下文的原点有100x100 ...)
当需要经常移动图像时,我通常使用Graphics.create来创建Graphics上下文的副本(这将复制当前状态/属性,但仍将生成输出返回到Graphics上下文的原始输出),对副本应用平移,绘制所需内容,然后丢弃副本。这将使原始上下文保持不变(关于我已更改的属性)。
这意味着您可以在隔离中执行多个平移,而不会影响稍后执行的其他平移。
另一种方法是反转平移,但坦率地说,在副本上调用dispose只是更简单、更容易...

非常感谢您的解决方案。但是,您能否解释一下为什么当我只提供100给“tx”时,它会向下移动和向右移动?https://www.mathsisfun.com/definitions/translation.html显示,通过将“tx”设置为100,图像应该只向右移动100个像素。但为什么Java的translate方法也会向下移动呢? - user3437460
除非您能提供可运行的示例,否则无法解决问题。您可以考虑查看此问题,其中我遇到了初始转换问题。 - MadProgrammer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接