Java 仿射变换是如何工作的?

Java 仿射变换是如何工作的?,java,swing,concatenation,transformation,Java,Swing,Concatenation,Transformation,定义运算符时,矩阵的串联有何意义?当我们处理二维问题时,为什么会有三维矩阵?我觉得问这个问题很愚蠢,但我缺乏任何关于这方面的信息,尽管我对向量分析和代数非常熟悉。。。为什么不只是将变换矩阵或缩放矩阵相乘,然后作为运算符应用于坐标 我正在尝试将缩放到鼠标的功能设置到我已经可以通过鼠标进行转换的网格上,但有两天我就是做不到。有没有一种方法可以在变压器上使用setTranslate或setScale,而不必重置现有的操作员?连接的组合是如何工作的 编辑最终我正确地实现了逐点缩放算法。。。诀窍是在应用任

定义运算符时,矩阵的串联有何意义?当我们处理二维问题时,为什么会有三维矩阵?我觉得问这个问题很愚蠢,但我缺乏任何关于这方面的信息,尽管我对向量分析和代数非常熟悉。。。为什么不只是将变换矩阵或缩放矩阵相乘,然后作为运算符应用于坐标

我正在尝试将缩放到鼠标的功能设置到我已经可以通过鼠标进行转换的网格上,但有两天我就是做不到。有没有一种方法可以在变压器上使用setTranslate或setScale,而不必重置现有的操作员?连接的组合是如何工作的

编辑最终我正确地实现了逐点缩放算法。。。诀窍是在应用任何其他操作之前应用依赖于zoomLevel本身的转换,同时保存上一个运算符:(以防有人对此感兴趣…)

。通过使用3x3矩阵乘法,您可以同时执行旋转、反射和平移


即,代替计算D*(C*(B*(x+a)+B)+C)+D,所有这些运算都可以放入单个矩阵运算M*x'(其中x'是带额外行的向量x)。现在,这种矩阵乘法可以在硬件中实现(这基本上就是3D图形卡所做的——优化4D乘法——但您的打印机可能已经为3D乘法优化了电路!)

您的问题非常广泛。请参阅额外的行和列。例如,您可以查看一些。对问题第一部分的非常简短的回答:(其余部分请参阅垃圾神的链接)应用一个变换是通过一个矩阵乘法完成的。应用一系列变换就是一系列乘法。数学允许您先乘以变换矩阵,然后将其结果应用于点。当您有一个很长的点列表,所有这些点都必须通过相同的操作序列进行转换时,这非常有用。
    AffineTransform savedTransform = new AffineTransform(transformer);
    AffineTransform tempTransform = new AffineTransform();

    tempTransform.translate(-0.25*(mouseX-transOfGridXD-game.curWS*sF*sqSize/2), -0.25*(mouseY-transOfGridYD-game.curWS*sF*sqSize/2)); //sF is the zoom level, game.curWS*sqSize is the grid size in pixels, transOfGrid is the translation of the transform
    tempTransform.concatenate(savedTransform);

    transformer.setTransform(tempTransform );
    transformer.translate(-(game.curWS)*sqSize*0.125, -(game.curWS)*sqSize*0.125);

    transformer.scale(1.25, 1.25);