package aima.gui.swing.framework.util;
import java.awt.Shape;
import java.awt.geom.AffineTransform;
import java.awt.geom.Path2D;
import aima.core.util.math.geom.shapes.Circle2D;
import aima.core.util.math.geom.shapes.Ellipse2D;
import aima.core.util.math.geom.shapes.IGeometric2D;
import aima.core.util.math.geom.shapes.Line2D;
import aima.core.util.math.geom.shapes.Point2D;
import aima.core.util.math.geom.shapes.Polyline2D;
import aima.core.util.math.geom.shapes.Rect2D;
/**
* This class is used to transfer a {@link IGeometric2D} into a {@code java.awt.}{@link Shape} to be able to display these shapes graphically.
*
* @author Arno von Borries
* @author Jan Phillip Kretzschmar
* @author Andreas Walscheid
*
*/
public class GraphicsTransfer2D {
/**
* Transfers a {@link IGeometric2D} into its {@link Shape} representative.
* @param geometric the geometric shape to be transferred.
* @return the transferred shape.
*/
public static Shape transfer(IGeometric2D geometric) {
if(geometric instanceof Circle2D)
return transfer((Circle2D) geometric);
else if(geometric instanceof Ellipse2D)
return transfer((Ellipse2D) geometric);
else if(geometric instanceof Line2D)
return transfer((Line2D) geometric);
else if(geometric instanceof Polyline2D)
return transfer((Polyline2D) geometric);
else if(geometric instanceof Rect2D)
return transfer((Rect2D) geometric);
return null;
}
/**
* Transfers a {@link Circle2D} into its {@link Shape} representative.
* @param circle the circle to be transferred.
* @return the transferred shape.
*/
private static Shape transfer(Circle2D circle) {
return new java.awt.geom.Ellipse2D.Double(circle.getCenter().getX()-circle.getRadius(),circle.getCenter().getY()-circle.getRadius(),2*circle.getRadius(),2*circle.getRadius());
}
/**
* Transfers a {@link Ellipse2D} into its {@link Shape} representative.
* @param ellipse the ellipse to be transferred.
* @return the transferred shape.
*/
private static Shape transfer(Ellipse2D ellipse) {
Shape result = new java.awt.geom.Ellipse2D.Double(ellipse.getCenter().getX()-ellipse.getHorizontalLength(),ellipse.getCenter().getY()-ellipse.getVerticalLength(),2*ellipse.getHorizontalLength(),2*ellipse.getVerticalLength());
return AffineTransform.getRotateInstance(ellipse.getAngle()).createTransformedShape(result);
}
/**
* Transfers a {@link Line2D} into its {@link Shape} representative.
* @param line the line to be transferred.
* @return the transferred shape.
*/
private static Shape transfer(Line2D line) {
return new java.awt.geom.Line2D.Double(line.getStart().getX(), line.getStart().getY(), line.getEnd().getX(), line.getEnd().getY());
}
/**
* Transfers a {@link Polyline2D} into its {@link Shape} representative.
* @param polyline the polyline to be transferred.
* @return the transferred shape.
*/
private static Shape transfer(Polyline2D polyline) {
Path2D result = new java.awt.geom.Path2D.Double();
Point2D[] vertexes = polyline.getVertexes();
result.moveTo(vertexes[0].getX(),vertexes[0].getY());
for(int i=1;i<vertexes.length;i++) {
result.lineTo(vertexes[i].getX(),vertexes[i].getY());
}
if(polyline.isClosed()) result.closePath();
return result;
}
/**
* Transfers a {@link Rect2D} into its {@link Shape} representative.
* @param rect the rectangle to be transferred.
* @return the transferred shape.
*/
private static Shape transfer(Rect2D rect){
return new java.awt.geom.Rectangle2D.Double(rect.getLowerLeft().getX(), rect.getLowerLeft().getY(), rect.getUpperRight().getX() - rect.getLowerLeft().getX(), rect.getUpperRight().getY() - rect.getLowerLeft().getY());
}
}