/*
* Copyright (c) 2016 Vivid Solutions.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* and Eclipse Distribution License v. 1.0 which accompanies this distribution.
* The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html
* and the Eclipse Distribution License is available at
*
* http://www.eclipse.org/org/documents/edl-v10.php.
*/
package org.locationtech.jts.awt;
import java.awt.Shape;
import java.awt.geom.Ellipse2D;
import java.awt.geom.GeneralPath;
import java.awt.geom.Line2D;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
/**
* An interface for classes which create {@link Shape}s to represent
* {@link Point}
* geometries. Java2D does not provide an actual point shape, so some other
* shape must be used to render points (e.g. such as a Rectangle or Ellipse).
*
* @author Martin Davis
*
*/
public interface PointShapeFactory {
/**
* Creates a shape representing a {@link Point}.
*
* @param point
* the location of the point
* @return a shape
*/
Shape createPoint(Point2D point);
public static abstract class BasePointShapeFactory implements
PointShapeFactory {
/**
* The default size of the shape
*/
public static final double DEFAULT_SIZE = 3.0;
protected double size = DEFAULT_SIZE;
/**
* Creates a new factory for points with default size.
*
*/
public BasePointShapeFactory() {
}
/**
* Creates a factory for points of given size.
*
* @param size
* the size of the points
*/
public BasePointShapeFactory(double size) {
this.size = size;
}
/**
* Creates a shape representing a point.
*
* @param point
* the location of the point
* @return a shape
*/
public abstract Shape createPoint(Point2D point);
}
public static class Point extends BasePointShapeFactory {
/**
* Creates a new factory for points with default size.
*
*/
public Point() {
super();
}
/**
* Creates a factory for points of given size.
*
* @param size
* the size of the points
*/
public Point(double size) {
super(size);
}
/**
* Creates a shape representing a point.
*
* @param point
* the location of the point
* @return a shape
*/
public Shape createPoint(Point2D point) {
Line2D.Double pointMarker =
new Line2D.Double(
point.getX(),
point.getY(),
point.getX(),
point.getY());
return pointMarker;
}
}
public static class Square extends BasePointShapeFactory {
/**
* Creates a new factory for squares with default size.
*
*/
public Square() {
super();
}
/**
* Creates a factory for squares of given size.
*
* @param size
* the size of the points
*/
public Square(double size) {
super(size);
}
/**
* Creates a shape representing a point.
*
* @param point
* the location of the point
* @return a shape
*/
public Shape createPoint(Point2D point) {
Rectangle2D.Double pointMarker =
new Rectangle2D.Double(
0.0,
0.0,
size,
size);
pointMarker.x = (point.getX() - (size / 2));
pointMarker.y = (point.getY() - (size / 2));
return pointMarker;
}
}
public static class Star extends BasePointShapeFactory {
/**
* Creates a new factory for points with default size.
*
*/
public Star() {
super();
}
/**
* Creates a factory for points of given size.
*
* @param size
* the size of the points
*/
public Star(double size) {
super(size);
}
/**
* Creates a shape representing a point.
*
* @param point
* the location of the point
* @return a shape
*/
public Shape createPoint(Point2D point) {
GeneralPath path = new GeneralPath();
path.moveTo((float) point.getX(), (float) (point.getY() - size/2));
path.lineTo((float) (point.getX() + size * 1/8), (float) (point.getY() - size * 1/8));
path.lineTo((float) (point.getX() + size/2), (float) (point.getY() - size * 1/8));
path.lineTo((float) (point.getX() + size * 2/8), (float) (point.getY() + size * 1/8));
path.lineTo((float) (point.getX() + size * 3/8), (float) (point.getY() + size/2));
path.lineTo((float) (point.getX()), (float) (point.getY() + size * 2/8));
path.lineTo((float) (point.getX() - size * 3/8), (float) (point.getY() + size/2));
path.lineTo((float) (point.getX() - size * 2/8), (float) (point.getY() + size * 1/8));
path.lineTo((float) (point.getX() - size/2), (float) (point.getY() - size * 1/8));
path.lineTo((float) (point.getX() - size * 1/8), (float) (point.getY() - size * 1/8));
path.closePath();
return path;
}
}
public static class Triangle extends BasePointShapeFactory {
/**
* Creates a new factory for points with default size.
*
*/
public Triangle() {
super();
}
/**
* Creates a factory for points of given size.
*
* @param size
* the size of the points
*/
public Triangle(double size) {
super(size);
}
/**
* Creates a shape representing a point.
*
* @param point
* the location of the point
* @return a shape
*/
public Shape createPoint(Point2D point) {
GeneralPath path = new GeneralPath();
path.moveTo((float) (point.getX()), (float) (point.getY() - size / 2));
path.lineTo((float) (point.getX() + size / 2), (float) (point.getY() + size / 2));
path.lineTo((float) (point.getX() - size / 2), (float) (point.getY() + size / 2));
path.lineTo((float) (point.getX()), (float) (point.getY() - size / 2));
return path;
}
}
public static class Circle extends BasePointShapeFactory {
/**
* Creates a new factory for points with default size.
*
*/
public Circle() {
super();
}
/**
* Creates a factory for points of given size.
*
* @param size
* the size of the points
*/
public Circle(double size) {
super(size);
}
/**
* Creates a shape representing a point.
*
* @param point
* the location of the point
* @return a shape
*/
public Shape createPoint(Point2D point) {
Ellipse2D.Double pointMarker =
new Ellipse2D.Double(
0.0,
0.0,
size,
size);
pointMarker.x = (point.getX() - (size / 2));
pointMarker.y = (point.getY() - (size / 2));
return pointMarker;
}
}
public static class Cross extends BasePointShapeFactory {
/**
* Creates a new factory for points with default size.
*
*/
public Cross() {
super();
}
/**
* Creates a factory for points of given size.
*
* @param size
* the size of the points
*/
public Cross(double size) {
super(size);
}
/**
* Creates a shape representing a point.
*
* @param point
* the location of the point
* @return a shape
*/
public Shape createPoint(Point2D point) {
float x1 = (float) (point.getX() - size/2f);
float x2 = (float) (point.getX() - size/4f);
float x3 = (float) (point.getX() + size/4f);
float x4 = (float) (point.getX() + size/2f);
float y1 = (float) (point.getY() - size/2f);
float y2 = (float) (point.getY() - size/4f);
float y3 = (float) (point.getY() + size/4f);
float y4 = (float) (point.getY() + size/2f);
GeneralPath path = new GeneralPath();
path.moveTo(x2, y1);
path.lineTo(x3, y1);
path.lineTo(x3, y2);
path.lineTo(x4, y2);
path.lineTo(x4, y3);
path.lineTo(x3, y3);
path.lineTo(x3, y4);
path.lineTo(x2, y4);
path.lineTo(x2, y3);
path.lineTo(x1, y3);
path.lineTo(x1, y2);
path.lineTo(x2, y2);
path.lineTo(x2, y1);
return path;
}
}
public static class X extends BasePointShapeFactory {
/**
* Creates a new factory for points with default size.
*
*/
public X() {
super();
}
/**
* Creates a factory for points of given size.
*
* @param size
* the size of the points
*/
public X(double size) {
super(size);
}
/**
* Creates a shape representing a point.
*
* @param point
* the location of the point
* @return a shape
*/
public Shape createPoint(Point2D point) {
GeneralPath path = new GeneralPath();
path.moveTo((float) (point.getX()), (float) (point.getY() - size * 1/8));
path.lineTo((float) (point.getX() + size * 2/8), (float) (point.getY() - size/2));
path.lineTo((float) (point.getX() + size/2), (float) (point.getY() - size/2));
path.lineTo((float) (point.getX() + size * 1/8), (float) (point.getY()));
path.lineTo((float) (point.getX() + size/2), (float) (point.getY() + size/2));
path.lineTo((float) (point.getX() + size * 2/8), (float) (point.getY() + size/2));
path.lineTo((float) (point.getX()), (float) (point.getY() + size * 1/8));
path.lineTo((float) (point.getX() - size * 2/8), (float) (point.getY() + size/2));
path.lineTo((float) (point.getX() - size/2), (float) (point.getY() + size/2));
path.lineTo((float) (point.getX() - size * 1/8), (float) (point.getY()));
path.lineTo((float) (point.getX() - size/2), (float) (point.getY() - size/2));
path.lineTo((float) (point.getX() - size * 2/8), (float) (point.getY() - size/2));
path.closePath();
return path;
}
}
}