1 回答

TA貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個(gè)贊
我查看了這本書,發(fā)現(xiàn)用法AffineTransform.preConcatenate()令人困惑。我更喜歡使用AffineTransform.concatenate(),因?yàn)閷ξ襾碚f這提供了更自然的流程。
讓我們看第一個(gè)例子(變換,然后交換 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);
您可以看到代碼中直接表示的“翻譯,然后縮放”流程。
對于第二個(gè)測試,您可以應(yīng)用相同的方法:
// 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);
注意這一點(diǎn):umin, vmin已經(jīng)表示左下屏幕坐標(biāo)和umax, vmax右上屏幕坐標(biāo),所以不需要額外的平移或y軸翻轉(zhuǎn)!
一些結(jié)束語:
Java2D 中線的默認(rèn)寬度是一個(gè)縮放單位。選擇
ymin
和ymax
后,一個(gè)縮放單位會(huì)填滿窗口的整個(gè)高度。g2d.setStroke(new BasicStroke(0.0f));
為了不只得到一個(gè)填充的矩形,您應(yīng)該在調(diào)用之前將線寬設(shè)置為可能的最小值g2d.draw()
。的參數(shù)
Rectangle2D.Double()
是x, y, w, h
,因此您在第二個(gè)示例中創(chuàng)建矩形對象的代碼可能應(yīng)該讀取Rectangle2D.Double rectangle = new Rectangle2D.Double(0, 1.5, 100, 1);
(高度為 2.5,上邊框不會(huì)顯示在屏幕上)。
添加回答
舉報(bào)