1

(-1, -1) から (+1, +1) までの数学的 (y が下ではなく上に成長する) 座標空間を設定し、ウィンドウのサイズに関係なくウィンドウに収まるようにしたいと考えています。

私はJava SE 7で匿名のJComponentサブクラスを使用しており、着信をキャストしGraphicspaintComponentからGraphics2D描画していますGraphics2D

ただし、Graphics2Dウィンドウのサイズに応じて変化するコンピューター座標空間に設定されます。ウィンドウのサイズに応じて再スケーリングし、Y を上に移動させるにはどうすればよいですか? 次のプログラムでは、右上の象限に黒い四角が表示されます。

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class G {
  public static void main (String [] args) {
    JFrame frame = new JFrame(G.class.getCanonicalName());
    frame.setUndecorated(true);
    JComponent component = new JComponent() {
      private static final long serialVersionUID = 1L;
      @Override
      protected void paintComponent (Graphics g) {
        super.paintComponent(g);
        paint2D((Graphics2D)g);
      }
      protected void paint2D (Graphics2D g2) {
        g2.draw(new Rectangle2D.Double(0.1, 0.1, 0.9, 0.9));
      }
    };
    frame.add(component);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 400);
    frame.setVisible(true);
  }
}
4

1 に答える 1

6

transform()と を使用して、必要に応じて座標系をセットアップしますtranslate()。そう:

  1. 原点を(0、高さ)にしたい; 左下の。
  2. 次に、Y 軸を反転します。

コード例:

AffineTransform tform = AffineTransform.getTranslateInstance( 0, height);
tform.scale( 1, -1);
g2.setTransform( tform);

[私の編集版]:

public static void main (String [] args) {
    JFrame frame = new JFrame( G2dTransform_Question.class.getCanonicalName());
    JComponent component = new JComponent() {
        private static final long serialVersionUID = 1L;
        @Override
        protected void paintComponent (Graphics g) {
            super.paintComponent(g);
            paint2D((Graphics2D)g);
        }
        protected void paint2D (Graphics2D g2) {
            AffineTransform tform = AffineTransform.getTranslateInstance( 0, getHeight());
            tform.scale( getWidth(), -getHeight());    // NOTE -- to make 1.0 'full width'.
            g2.setTransform( tform);

            g2.setColor( Color.BLUE);  // NOTE -- so we can *see* something.
            g2.fill( new Rectangle2D.Double(0.1, 0.1, 0.8, 0.8));  // NOTE -- 'fill' works better than 'draw'.
        }
    };

    frame.setLayout( new BorderLayout());    // NOTE -- make the component size to frame.
    frame.add( component, BorderLayout.CENTER);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 400);
    frame.setVisible(true);
}

[ホバークラフト版]: ありがとうホバー!

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;

import javax.swing.JComponent;
import javax.swing.JFrame;

public class G {
  public static final int PREF_W = 400;
  public static final int PREF_H = PREF_W;

public static void main (String [] args) {
    JFrame frame = new JFrame(G.class.getCanonicalName());
    frame.setUndecorated(true);
    JComponent component = new JComponent() {
      private static final long serialVersionUID = 1L;
      @Override
      protected void paintComponent (Graphics g) {
        super.paintComponent(g);
        AffineTransform tform = AffineTransform.getTranslateInstance( 0, getHeight());
        tform.scale( 1, -1);
        Graphics2D g2 = (Graphics2D) g.create();
        g2.setTransform( tform);
        paint2D(g2);
        g2.dispose();
      }
      protected void paint2D (Graphics2D g2) {
        g2.draw(new Rectangle2D.Double(10, 10, 20, 30));
      }

      @Override
      public Dimension getPreferredSize() {
         return new Dimension(PREF_W, PREF_H);
      }
    };
    frame.add(component);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.pack();
    frame.setVisible(true);
  }
}
于 2013-05-14T02:18:46.303 に答える