Mega Code Archive

 
Categories / Java / 2D Graphics GUI
 

Transform Translation and Rotation

import java.awt.BasicStroke; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.RenderingHints; import java.awt.Shape; import java.awt.Stroke; import java.awt.geom.AffineTransform; import java.awt.geom.GeneralPath; import java.awt.geom.Rectangle2D; import javax.swing.JComponent; import javax.swing.JFrame; public class TransformTransRotation extends JComponent {   Shape axes, shape;   int length = 54, arrowLength = 4, tickSize = 4;   public TransformTransRotation() {     axes = createAxes();     shape = createShape();   }   protected Shape createAxes() {     GeneralPath path = new GeneralPath();     // Axes.     path.moveTo(-length, 0);     path.lineTo(length, 0);     path.moveTo(0, -length);     path.lineTo(0, length);     // Arrows.     path.moveTo(length - arrowLength, -arrowLength);     path.lineTo(length, 0);     path.lineTo(length - arrowLength, arrowLength);     path.moveTo(-arrowLength, length - arrowLength);     path.lineTo(0, length);     path.lineTo(arrowLength, length - arrowLength);     // Half-centimeter tick marks     float cm = 72 / 2.54f;     float lengthCentimeter = length / cm;     for (float i = 0.5f; i < lengthCentimeter; i += 1.0f) {       float tick = i * cm;       path.moveTo(tick, -tickSize / 2);       path.lineTo(tick, tickSize / 2);       path.moveTo(-tick, -tickSize / 2);       path.lineTo(-tick, tickSize / 2);       path.moveTo(-tickSize / 2, tick);       path.lineTo(tickSize / 2, tick);       path.moveTo(-tickSize / 2, -tick);       path.lineTo(tickSize / 2, -tick);     }     // Full-centimeter tick marks     for (float i = 1.0f; i < lengthCentimeter; i += 1.0f) {       float tick = i * cm;       path.moveTo(tick, -tickSize);       path.lineTo(tick, tickSize);       path.moveTo(-tick, -tickSize);       path.lineTo(-tick, tickSize);       path.moveTo(-tickSize, tick);       path.lineTo(tickSize, tick);       path.moveTo(-tickSize, -tick);       path.lineTo(tickSize, -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(axes);     g2.draw(shape);     // Transform the Graphics2D.       AffineTransform rat = new AffineTransform();       rat.setToTranslation(100, 0);       rat.rotate(Math.PI / 6);       g2.transform(rat);     // Draw the "new" shapes in dashed.     Stroke stroke = new BasicStroke(1, BasicStroke.CAP_BUTT,         BasicStroke.JOIN_BEVEL, 0, new float[] { 3, 1 }, 0);     g2.setStroke(stroke);     g2.draw(axes);     g2.draw(shape);   }   public static void main(String[] a) {     JFrame f = new JFrame();     f.getContentPane().add(new TransformTransRotation());     f.setSize(450, 350);     f.show();   } }