2010-07-14 82 views
1

我希望能夠在由Path2D.Double構成的Java2D場景上縮放和取消縮放,而不需要使用 來增加線條,只需擴大距離即可。java2d對象的非破壞性轉換

我嘗試將轉換應用於PaintComponent方法接收的Graphics2D對象,但這會使線條變粗。我發現的唯一方法是對行進行轉換(例如line.transform(AffineTransform.getScaleInstance(2d,2d))),但每次我縮放並再次取消縮放時,由於浮點錯誤,我都會丟失信息。

長話短說:轉變是破壞性的。有沒有一種方法可以說:「我希望在不修改線條內容的情況下應用該轉換」。

回答

0

當你發現,改變Graphics2D變換影響所有圖紙,但沒有排除保存,修改和恢復內paintComponent()變換。在此example中,內容在縮放的上下文中繪製,而圍繞目標對象的Rectangle.Double被繪製爲未縮放。

附錄:example使用顯式轉換,但您也可以使用AffineTransform。與Rectangle2D類似,Path2D實現了Shape接口,因此您可以相應地使用createInverse()createTransformedShape()。這裏有一個相關的example

+0

我看到我可以保存一個轉換並稍後爲Graphics2D恢復它,但我想要做的事情可以重新配置爲與Path2D一樣。 – 2010-07-14 22:36:11

+0

@Paul Brauner:如上所述,您可以在'Path2D'上使用'AffineTransform'。 – trashgod 2010-07-15 01:35:14

+0

是的,但它然後修改Path2D,這是整個點,我想能夠將它應用到Path2D並獲得一個新的沒有修改原來的一個 – 2010-07-15 09:02:20

1

我找到了解決方法:根據Graphic2D中的比例因子更改線寬,這樣我就可以將轉換應用於Graphic2D本身,並且不會破壞包含在Path2D中的原始座標。

tr = g.getTransform() 
g.transform(AffineTransform.getScaleInstance(scaleFactor,scaleFactor)) 
g.setStroke(new java.awt.BasicStroke(1.0f/scaleFactor.toFloat)) 
/* draw lines */ 
g.setTransform(tr)