Home : Course Map : Chapter 6 : Java : Supplements :
Java2D: Transforms
JavaTech
Course Map
Chapter 6

Introduction
AWT
Swing
Containers
  Demo 1
UI Components
  Demo 2
UI Layout
  Demo 3   Demo 4
Text Display
  Demo 5
Drawing
  Demo 6   Demo 7
Draw Polygons
  Demo 8   Demo 9
Colors
Text Draw 
  Demo 10
Images
  Demo 11
Exercises

    Supplements
AWT
  Demo 1
Drawing
  Demo 2
Text Drawing
  Demo 3
UI Components
  Demo 4

Java2D
Shapes & Areas
  Demo 1   Demo 2
Stroke & Paint
  Demo 3
Transforms
  Demo 4
Gradients&Textures
  Demo 5   Demo 6
Text
  Demo 7   Demo 8
     About JavaTech
     Codes List
     Exercises
     Feedback
     References
     Resources
     Tips
     Topic Index
     Course Guide
     What's New

The example here demonstrates the use of AffineTransform, which transforms a shape in a way that maintains the parallelism of straight lines. The transformations include rotatation, scaling, and shearing.

In the previous applet in Shapes & Areas, we used a transform to translate the drawing context.

Note: transforms can be done either directly on a given shape or on the graphics context itself. In the latter case, all further drawings will be rendered according to the new transformed coordinate system.

The translation transform is done on the graphics context. The other transforms are done on the shape objects to create new shapes that are transformed versions of the originals.

The demo applet below illustrates transforms for translation, rotation, scaling, shearing and combinations of transforms. The applet loads a TransformPanel object, which carries out the transformations and drawings.

 

TransformApplet.java  
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

/**  Demonstration of AffineTransform in Java2D.**/
public class TransformApplet extends JApplet
{
  public void init () {
    Container content_pane = getContentPane ();

    // Create an instance of DrawingPanel
    TransformPanel transform_panel =
        new TransformPanel ();

    // Add the DrawingPanel to the contentPane.
    content_pane.add (transform_panel);

  } //init

} // class TransformApplet
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;

/**  Demonstrate different AffineTransforms of a rectangle.**/
class TransformPanel extends JPanel {

  public void paintComponent (Graphics g) {
    // First paint background
    super.paintComponent (g);
    Graphics2D g2 =  (Graphics2D)g;

    // Turn on anti-aliasing.
    g2.setRenderingHint (RenderingHints.KEY_ANTIALIASING,
        RenderingHints.VALUE_ANTIALIAS_ON);

    // Create a rectangle.
    Shape shape1 =  new Rectangle2D.Double (20.0, 20.0, 30.0, 50.0);
    // Now draw it.
    g2.draw (shape1);

    // Shift the drawing origin 72 units  (1 inch) to the right
    // to obtain room for the next drawing
    AffineTransform at = AffineTransform.getTranslateInstance (72,0);
    g2.transform (at);

    // Create a rotation transform of 30 degrees CCW around the
    // the top left corner of the rectangle.
    AffineTransform  atx =
      AffineTransform.getRotateInstance (-Math.PI/6,30,20);
    // Take the shape object and create a rotated version
    Shape atShape = atx.createTransformedShape (shape1);
    g2.draw (atShape);

    // Another 72 unit shift.
    g2.transform (at);

    // Create a scaling transform
    atx = AffineTransform.getScaleInstance (1.5,1.5);
    // Take the shape object and create a scaled version
    atShape = atx.createTransformedShape (shape1);
    g2.draw (atShape);

    // Another 72 unit shift.
    g2.transform (at);

    // Create a shear transform
    atx = AffineTransform.getShearInstance (0.0,0.5);
    // Take the shape object and create a sheared version
    atShape = atx.createTransformedShape (shape1);
    g2.draw (atShape);

    // Another 72 unit shift.
    g2.transform (at);

    // Illustrate compound transforms
    // First get a transform object
    atx = new AffineTransform ();
    // Then set to a shear transform
    atx.setToShear (0.0,0.5);
    // and then rotate  about the current origin
    atx.rotate (-Math.PI/5,40,50);
    // Now apply to the rectangle
    atShape = atx.createTransformedShape (shape1);
    g2.draw (atShape);

  } // paintComponent
} //class TransformPanel


In the first four transforms, we used static methods in the AffineTransform class to obtain instances of the class for the particular type of transform desired. For example, a translation transform is obtained with

  AffineTransform at = AffineTransform.getTranslateInstance (72, 0);

Applying this to the graphics context moves its origin horizontally by 72 units:

  g2.transform (at);

All subsequent coordinate values are relative to that new position on the drawing surface. Here the translation lets us draw the rectangle at a different position without changing its internal coordinate values. Then the rectangle is operated on with a rotation transform obtained with the getRotateInstance() static method:

  AffineTransform atx =
    AffineTransform.getRotateInstance (-Math.PI/6, 40, 50);


Then a new rectangle in the rotated orientation is obtained with the createTransformedShape() method as follows:

  Shape atShape = atx.createTransformedShape (shape1);

Finally, the new rotated rectangle is drawn with:

  g2.draw (atShape);

This same process is repeated for scaling and shear transforms. Finally, a combined transform is created by creating an instance of AffineTransform and then its setToShear() and rotate() methods are applied to the original rectangle to obtain a new transformed one.

 

Latest update: Oct. 27, 2004

            Tech
Java Tech Graphics
Starting to Plot
  Demo 1
Drawing Panel
  Demo 2
Histogram Display

  Demo 3
Exercises

           Physics
Display Text Data
  Demo 1
Plot Data
  Demo 2
Find Max/Min
  Demo 3
Exercises

  Part I Part II Part III
Java Core 1  2  3  4  5  6  7  8  9  10  11  12 13 14 15 16 17
18 19 20
21
22 23 24
Supplements

1  2  3  4  5  6  7  8  9  10  11  12

Tech 1  2  3  4  5  6  7  8  9  10  11  12
Physics 1  2  3  4  5  6  7  8  9  10  11  12

Java is a trademark of Sun Microsystems, Inc.