1 回答

TA貢獻1833條經驗 獲得超4個贊
我查看了這本書,發現用法AffineTransform.preConcatenate()令人困惑。我更喜歡使用AffineTransform.concatenate(),因為對我來說這提供了更自然的流程。
讓我們看第一個例子(變換,然后交換 y 方向)。
這是你的代碼:
AffineTransform at1 = new AffineTransform();
at1.setToScale(1,-1);
AffineTransform at2 = new AffineTransform();
at2.setToTranslation(insFrame.left, sizeFrame.getHeight() - insFrame.bottom - 1);
at1.preConcatenate(at2);
使用 using concatenate,您可以將其寫為:
AffineTransform at1 = new AffineTransform();
at1.setToTranslation(insFrame.left, sizeFrame.getHeight() - insFrame.bottom - 1);
AffineTransform at2 = new AffineTransform();
at2.setToScale(1,-1);
at1.concatenate(at2);
或者,甚至更短:
AffineTransform at = new AffineTransform();
at.translate(insFrame.left, sizeFrame.getHeight() - insFrame.bottom - 1);
at.scale(1,-1);
您可以看到代碼中直接表示的“翻譯,然后縮放”流程。
對于第二個測試,您可以應用相同的方法:
// Affine Transformation 3, 4 and 5
// ╭ umax ? umin vmax ? vmin ╮
// T(umin, vmin) ? S | ----------- , ----------- | ? T(-xmin, -ymin)
// ╰ xmax ? xmin ymax ? ymin ╯
AffineTransform at = new AffineTransform();
at.translate(umin, vmin);
at.scale((umax-umin)/(xmax-xmin), (vmax-vmin)/(ymax-ymin));
at.translate(-xmin, -ymin);
注意這一點:umin, vmin已經表示左下屏幕坐標和umax, vmax右上屏幕坐標,所以不需要額外的平移或y軸翻轉!
一些結束語:
Java2D 中線的默認寬度是一個縮放單位。選擇
ymin
和ymax
后,一個縮放單位會填滿窗口的整個高度。g2d.setStroke(new BasicStroke(0.0f));
為了不只得到一個填充的矩形,您應該在調用之前將線寬設置為可能的最小值g2d.draw()
。的參數
Rectangle2D.Double()
是x, y, w, h
,因此您在第二個示例中創建矩形對象的代碼可能應該讀取Rectangle2D.Double rectangle = new Rectangle2D.Double(0, 1.5, 100, 1);
(高度為 2.5,上邊框不會顯示在屏幕上)。
添加回答
舉報