1

距離を広げるだけで、線を太くすることなく、Path2D.Double で作成された Java2D シーンをズームおよびズーム解除できるようにしたいと考えています。

paintComponent メソッドが受け取る Graphics2D オブジェクトに変換を適用しようとしましたが、これにより線が太くなります。私が見つけた唯一の方法は、線に変換を適用することでした(line.transform(AffineTransform.getScaleInstance(2d,2d))たとえば)が、ズームとズーム解除を再度行うたびに、浮動小数点エラーのために情報が失われます。

簡単に言えば、変換は破壊的です。「線の内容を変更せずに、その変換を適用してこの線を描きたい」と言う方法はありますか?

4

2 に答える 2

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)
于 2010-07-16T05:46:16.820 に答える
0

ご覧のとおり、変換を変更するとすべてのGraphics2D描画に影響しますが、変換を内部で保存、変更、および復元することを妨げるものは何もありません。このでは、コンテンツはスケーリングされたコンテキストで描画されますが、ターゲット オブジェクトの周囲はスケーリングされずに描画されます。paintComponent()Rectangle.Double

補遺: このでは明示的な変換を使用していますがAffineTransform、代わりに , を使用できます。同様Rectangle2Dに、はインターフェースをPath2D実装しているため、それに応じてとShapeを使用できます。関連するを次に示します。createInverse()createTransformedShape()

于 2010-07-14T19:20:11.567 に答える