AffineTransform at;
Graphics2D g2 = (Graphics2D)g;
g2.setColor(Color.black);
at = new AffineTransform();
at.setToTranslation(x, y);
at.setToRotation(theta);
g2.setTransform(at);
g2.drawPolygon(points);
我的代码在x和y处绘制一个三角形...当我按a和d时,三角形旋转..但是当我按下w和s时,三角形不会改变它的x和y。
变量是正确的..这是翻译例程..我不知道我哪里出错了..
如果我这样做:
AffineTransform at;
Graphics2D g2 = (Graphics2D)g;
g2.setColor(Color.black);
at = new AffineTransform();
at.setToTranslation(x, y);
g2.setTransform(at);
g2.drawPolygon(points);
at.setToRotation(theta);
g2.setTransform(at);
g2.drawPolygon(points);
一个旋转,一个移动..所以为什么我不能在绘制之前应用两个翻译?
答案 0 :(得分:0)
来自Oracle docs:
要添加坐标变换,请使用变换,旋转,缩放或 剪切方法。 setTransform方法仅用于还原 渲染后的原始Graphics2D变换。
只能有一个变换,在这个变换中你可以为旋转方法设置新的变换:
将当前的Graphics2D Transform与已翻译的连接 旋转变换。通过变换转换后续渲染 通过翻译到指定位置构建, 按指定的弧度旋转,然后向后平移 金额作为原始翻译。
还有一个警告:
警告:永远不应该使用此方法来应用新坐标 因为Graphics2D可能会在现有转换之上进行转换 已经有了其他目的所需的转换,例如 渲染Swing组件或应用缩放转换 调整打印机的分辨率。
答案 1 :(得分:0)
我认为你需要将两个转换连接成一个AffineTransformation。
即
AffineTransform at, toConcatenate;
Graphics2D g2 = (Graphics2D)g;
g2.setColor(Color.black);
at = new AffineTransform();
toConcatenate = new AffineTransform();
at.setToTranslation(x,y);
toConcatenate.setToRotation(theta);
at.concatenate(toConcatenate);
g2.setTransform(at)
g2.drawPolygon(points);
我基于在http://docs.oracle.com/javase/tutorial/2d/advanced/transforming.html
的Oracles网站上找到的教程我认为你的代码不起作用的原因是'setTransform方法覆盖了Graphics2D对象的当前变换'你用第二个变换覆盖第一个变换而不是连接两个变换。
希望这有帮助
答案 2 :(得分:0)
AffineTransform at;
Graphics2D g2 = (Graphics2D)g;
g2.setColor(Color.black);
at = new AffineTransform();
at.translate(x, y);
at.rotate(theta);
g2.setTransform(at);
g2.drawPolygon(points);
我使用了错误的东西..旋转和翻译是我需要的功能。