0

をオーバーライドして、JPanelにいくつかの形状を描画したいと思いますpaintComponent。パンとズームができるようにしたいと思います。パンとズームは、オブジェクトAffineTransformsetTransformメソッドで簡単に実行できます。Graphics2Dその後、簡単に図形を描画できますg2.draw(myShape)。図形は「ワールド座標」で定義されているため、パンするときに正常に機能し、描画する前にキャンバス/JPanel座標に変換する必要があります。

次に、座標の象限を変更したいと思います。JPanelとコンピューターがよく使用する第4象限から、ユーザーが最もよく知っている第1象限まで。Xは同じですが、Y軸は下向きではなく上向きに増加する必要があります。によってオリゴを再定義するのは簡単ですnew Point(origo.x, -origo.y);

しかし、どうすればこの象限に図形を描くことができますか?キャンバスの座標ではなく、シェイプの座標(ワールド座標で定義)を保持したいと思います。ですから、何らかの方法でそれらを変換するか、オブジェクトを変換する必要があり、それを効率的Graphics2Dに実行したいと思います。私もこれを行うことができますか?AffineTransform

描画するための私のコード:

        public void paintComponent(Graphics g) {
            super.paintComponent(g);
            Graphics2D g2 = (Graphics2D)g;
            g2.setColor(Color.blue);

            AffineTransform at = g2.getTransform();
            at.translate(-origo.x, -origo.y);
            at.translate(0, getHeight());
            at.scale(1, -1);
            g2.setTransform(at);
            g2.drawLine(30, 30, 140, 20);
            g2.draw(new CubicCurve2D.Double(30, 65, 23, 45, 23, 34, 67, 58));
        }
4

1 に答える 1

1

これはすぐに使える答えなので、テストされていませんが、うまくいくと思います。

(0, 高さ) で移動します。これにより、原点が左下に再配置されます。

(1, -1) でスケーリングします。これで、x 軸を中心に反転するはずです。

この場合、操作の順序は重要ではないと思います。

于 2010-04-01T21:16:43.603 に答える