Affine Transform如何真正在Java中工作?

| 我一直在使用Affine Transform在我的java项目中旋转字符串,但是我还不是一位经验丰富的程序员,因此花了我很长时间才能完成看似很小的任务。 现在,我终于像它所希望的那样,使它或多或少地工作了,只是它还没有达到我想要的精确程度……。 由于花费了大量的尝试和错误,并且阅读了仿射变换的描述,所以我仍然不确定它的真正作用。我现在想知道的是,我取了一个字符串,并定义了字符串的中心(或我想旋转的点),但是矩阵从何而来? (显然我不知道呵呵) 有人可以尝试向我解释仿射变换的工作原理,换句话说就是Java doc吗?也许它可以帮助我调整实现,而且,我真的很想知道:) 提前致谢。     
已邀请:
要了解什么是仿射变换及其工作原理,请参阅Wikipedia文章。 通常,它是一个线性变换(如缩放或反射),可以实现为特定矩阵的乘法,然后进行平移(移动),这是通过添加向量来完成的。因此,要计算每个像素[x,y]的新位置,您需要将其乘以特定矩阵(进行线性变换),然后相加然后添加特定向量(进行平移)。     
除其他答案外,还提供更高级别的视图: 屏幕上的点具有x和y坐标,即可以写为向量(x,y)。可以认为更复杂的几何对象是由点的集合来描述的。 向量(点)可以乘以一个矩阵,结果是另一个向量(点)。 有特殊的(即巧妙构造的)矩阵,当与矢量相乘时,其结果是,矢量等于输入点的旋转,缩放,倾斜或有些棘手的平移。 基本上,这就是全部。此方法还有一些其他功能: 如果您将2个矩阵相乘,您将再次得到一个矩阵(至少在这种情况下;请停止进行nit-picking ;-))。 如果将等于2个几何变换的2个矩阵相乘,则生成的矩阵等效于一个接一个地进行2个几何变换(顺序很重要)。 这意味着您可以在单个矩阵中编码这些几何变换的任意链。您可以通过将各个矩阵相乘来创建此矩阵。 顺便说一句,这也适用于3D。 有关更多详细信息,请参见其他答案。     
除了其他人已经给出的答案之外,我还想展示一个实用的技巧,即旋转字符串或其他对象时通常应用的模式: 通过应用
translate(-x,-y)
将旋转点(x,y)移至空间原点。 旋转
rotate(angle)
(可能也会在此处进行缩放) 将所有内容都移回
translate(x,y)
。 请记住,您必须以相反的顺序应用这些步骤(请参见垃圾桶的答案)。 对于具有第一个平移的字符串,我通常将边界框的中心移至原点,而对于最后一个平移的字符串,则将字符串移至屏幕上应出现中心的实际点。然后,我可以简单地在任意位置画线。
Rectangle2D r = g.getFontMetrics().getStringBounds(text, g);
g.translate(final_x, final_y);
g.rotate(-angle);
g.translate(-r.getCenterX(), -r.getCenterY());
g.drawString(text, 0, 0);
或者
Rectangle2D r = g.getFontMetrics().getStringBounds(text, g);
AffineTransform trans = AffineTransform.getTranslateInstance(final_x, final_y);
trans.concatenate(AffineTransform.getRotateInstance(-angle));
trans.concatenate(AffineTransform.getTranslateInstance(-r.getCenterX(), -r.getCenterY()));
g.setTransform(trans);
g.drawString(text, 0, 0);
    
实际上,我发现有两点有助于理解
AffineTransform
: 您可以转换图形上下文
Graphics2D
或实现
Shape
接口的任何类,如此处所述。 级联转换具有明显的最后指定的优先顺序,在此也有提及。     
这是纯粹的数学视频指南,如何根据您的需求设计转换矩阵http://www.khanacademy.org/video/linear-transformation-examples--scaling-and-reflections?topic=linear-algebra 您可能需要观看以前的视频,以了解此矩阵的工作原理和原因。无论如何,如果您有足够的耐心,它是学习线性代数的好资源。     

要回复问题请先登录注册