Sting
Sting

Reputation: 363

Java 2d coordinate transformation

I am trying to plot a graph using the java 2d graphics library and I thought I had it. I want to plot in the coordinate system where 0,0 is in the center of the panel on the left edge. I used the following code and it seemed to give me the result I needed.

private void doDraw(Graphics g) {
  Graphics2D g2d = (Graphics2D) g;
  AffineTransform saveAT = g2d.getTransform();
  // get the height of the panel
  int height = getHeight();
  // Find the middle of the panel
  double yTrans = ((double)height)/2.0;
  AffineTransform tform = AffineTransform.getTranslateInstance( 0.0, yTrans);
  g2d.setTransform(tform);
  //draw the line for the x-axis.
  g2d.drawLine(0,  0, 100, 0);
  //restore the old transform
  g2d.setTransform(saveAT);
}

This plotted the origin centered in the window.

The problem shows itself when I added a menu. Then the origin was offset in the y direction about twice the size of the menu higher then it should be. Do I need to account for the size of the menu and other containers that I add to the panel?

private void doDraw(Graphics g) {
  Graphics2D g2d = (Graphics2D) g.create();

  int height = getHeight();
  double yTrans = ((double)height)/2.0;
  AffineTransform tform = AffineTransform.getTranslateInstance( 0.0, yTrans);
  g2d.transform(tform);
  //draw the line for the x-axis.
  g2d.drawLine(0,  0, 100, 0);
}

works, thank you for your help

Upvotes: 0

Views: 2308

Answers (1)

trashgod
trashgod

Reputation: 205875

You might try the approach outlined here. Override paintComponent() to obtain a graphics context relative to the enclosing panel, rather than the enclosing frame.

To center the origin at the left edge, use

g2d.translate(0, h / 2);

To get upright, cartesian coordinates, use

g2d.scale(1, -1);

Upvotes: 1

Related Questions