FileDocCategorySizeDatePackage
Transformers.javaAPI DocExample3073Mon Apr 05 10:13:34 BST 1999None

Transformers.java

import java.awt.*;
import java.awt.geom.*;

public abstract class Transformers
    extends Component {
  Shape mAxes, mShape;
  int mLength = 54, mArrowLength = 4, mTickSize = 4;
  
  public Transformers() {
    mAxes = createAxes();
    mShape = createShape();
  }
  
  protected Shape createAxes() {
    GeneralPath path = new GeneralPath();
    
    // Axes.
    path.moveTo(-mLength, 0);
    path.lineTo(mLength, 0);
    path.moveTo(0, -mLength);
    path.lineTo(0, mLength);
    // Arrows.
    path.moveTo(mLength - mArrowLength, -mArrowLength);
    path.lineTo(mLength, 0);
    path.lineTo(mLength - mArrowLength, mArrowLength);
    path.moveTo(-mArrowLength, mLength - mArrowLength);
    path.lineTo(0, mLength);
    path.lineTo(mArrowLength, mLength - mArrowLength);
    // Half-centimeter tick marks
    float cm = 72 / 2.54f;
    float lengthCentimeter = mLength / cm;
    for (float i = 0.5f; i < lengthCentimeter; i += 1.0f) {
      float tick = i * cm;
      path.moveTo( tick, -mTickSize / 2);
      path.lineTo( tick,  mTickSize / 2);
      path.moveTo(-tick, -mTickSize / 2);
      path.lineTo(-tick,  mTickSize / 2);
      path.moveTo(-mTickSize / 2,  tick);
      path.lineTo( mTickSize / 2,  tick);
      path.moveTo(-mTickSize / 2, -tick);
      path.lineTo( mTickSize / 2, -tick);
    }
    // Full-centimeter tick marks
    for (float i = 1.0f; i < lengthCentimeter; i += 1.0f) {
      float tick = i * cm;
      path.moveTo( tick, -mTickSize);
      path.lineTo( tick,  mTickSize);
      path.moveTo(-tick, -mTickSize);
      path.lineTo(-tick,  mTickSize);
      path.moveTo(-mTickSize,  tick);
      path.lineTo( mTickSize,  tick);
      path.moveTo(-mTickSize, -tick);
      path.lineTo( mTickSize, -tick);
    }
    return path;
  }
  
  protected Shape createShape() {
    float cm = 72 / 2.54f;
    return new Rectangle2D.Float(cm, cm, 2 * cm, cm);
  }
  
  public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D)g;
    
    // Use antialiasing.
    g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON);
    
    // Move the origin to 75, 75.
    AffineTransform at = AffineTransform.getTranslateInstance(75, 75);
    g2.transform(at);

    // Draw the shapes in their original locations.
    g2.setPaint(Color.black);
    g2.draw(mAxes);
    g2.draw(mShape);
    
    // Transform the Graphics2D.
    g2.transform(getTransform());
    
    // Draw the shapes in their new locations, but dashed.
    Stroke stroke = new BasicStroke(1,
        BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0,
        new float[] { 3, 1 }, 0);
    g2.setStroke(stroke);
    g2.draw(mAxes);
    g2.draw(mShape);
  }
  
  public abstract AffineTransform getTransform();
  
  public Frame getFrame() {
    ApplicationFrame f = new ApplicationFrame("...more than meets the eye");
    f.setLayout(new BorderLayout());
    f.add(this, BorderLayout.CENTER);
    f.setSize(350,200);
    f.center();
    return f;
  }
}