/*
* Polygon2D.java
*
* Copyright (c) 2002-2017 Alexei Drummond, Andrew Rambaut and Marc Suchard
*
* This file is part of BEAST.
* See the NOTICE file distributed with this work for additional
* information regarding copyright ownership and licensing.
*
* BEAST is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* BEAST is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with BEAST; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301 USA
*/
package dr.geo;
import dr.xml.XMLParser;
import org.jdom.Element;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.util.List;
/**
* @author Marc A. Suchard
* @author Philippe Lemey
*/
public class Polygon2D extends AbstractPolygon2D {
public Polygon2D(double[] x, double[] y) {
if (x.length != y.length) {
throw new RuntimeException("Unbalanced arrays");
}
if (x[0] != x[x.length - 1] && y[0] != y[y.length - 1]) {
double[] newX = new double[x.length + 1];
double[] newY = new double[y.length + 1];
System.arraycopy(x, 0, newX, 0, x.length);
System.arraycopy(y, 0, newY, 0, y.length);
newX[x.length] = x[0];
newY[y.length] = y[0];
this.x = newX;
this.y = newY;
} else {
this.x = x;
this.y = y;
}
length = this.x.length - 1;
}
public Polygon2D(List<Point2D> points, boolean closed) {
this.point2Ds = points;
if (!closed) {
Point2D start = points.get(0);
points.add(start);
}
convertPointsToArrays();
length = points.size() - 1;
}
public Polygon2D() {
length = 0;
point2Ds = new ArrayList<Point2D>();
}
public Polygon2D(Element e) {
List<Element> children = e.getChildren();
id = e.getAttributeValue(XMLParser.ID);
parseCoordinates(e);
}
public double getProbability(Point2D Point2D, boolean outside) {
boolean contains = containsPoint2D(Point2D);
if (outside ^ contains) {
return 1.0;
} else {
return 0.0;
}
}
public double getLogProbability(Point2D Point2D, boolean outside) {
boolean contains = containsPoint2D(Point2D);
if (outside ^ contains) {
return 0.0;
} else {
return Double.NEGATIVE_INFINITY;
}
}
@Override
public void setFillValue(double value) {
throw new RuntimeException("setFillValue() call not allowed in Polygon2D; try Polygon2DFill.");
}
@Override
public double getFillValue() {
throw new RuntimeException("getFillValue() call not allowed in Polygon2D; try Polygon2DFill.");
}
@Override
public double getLogFillValue() {
throw new RuntimeException("getLogFillValue() call not allowed in Polygon2D; try Polygon2DFill.");
}
@Override
public boolean hasFillValue() {
return false;
}
public static void main(String[] args) {
Polygon2D polygon = new Polygon2D();
polygon.addPoint2D(new Point2D.Double(-10, -10));
polygon.addPoint2D(new Point2D.Double(-10, 50));
polygon.addPoint2D(new Point2D.Double(10, 50));
polygon.addPoint2D(new Point2D.Double(10, -10));
System.out.println(polygon);
System.out.println("");
Point2D pt = new Point2D.Double(0, 0);
System.out.println("polygon contains " + pt + ": " + polygon.containsPoint2D(pt));
pt = new Point2D.Double(100, 100);
System.out.println("polygon contains " + pt + ": " + polygon.containsPoint2D(pt));
System.out.println("");
Rectangle2D boundingBox = new Rectangle2D.Double(0, 0, 100, 100); // defines lower-left corner and width/height
System.out.println(boundingBox);
Polygon2D myClip = (Polygon2D)polygon.clip(boundingBox);
System.out.println(myClip);
}
}