Region.java

package gov.usgs.earthquake.qdm;

import java.util.ArrayList;

/**
 * A polygon without holes.
 *
 * Points are assumed to use x=longitude, y=latitude.
 * A "default" region has no boundary points, and contains all points.
 */
public class Region {

  /** String for net id */
  public String netid;
  /** String for region id */
  public String regionid;

  /** Arraylist of points */
  public ArrayList<Point> points;

  /**
   * Region constructor
   * @param netid string
   * @param regionid string
   */
  public Region(String netid, String regionid) {
    this.netid = netid;
    this.regionid = regionid;
    this.points = new ArrayList<Point>();
  }

  /**
   * Method to determine if this lat-lon in this region? In or out algorithm taken
   * from an algorithm by Edwards and Coleman of Oak Ridge Lab, version for BNL by
   * Benkovitz translated to C by Andy Michael and into Java by Alan Jones.
   *
   * @param xy point
   * @return bool if point is in region
   */
  public boolean inpoly(Point xy) {
    int in;
    double sine;
    boolean bool = false;
    int inside = 0;
    int nvert = this.points.size();
    // If there are no points in the region, assume default region
    // and declare the point inside
    if (nvert == 0)
      return true;
    Point p[] = (Point[]) this.points.toArray(new Point[0]);
    double x = xy.x;
    double y = xy.y;
    for (int i = 0; i < nvert; ++i) {
      in = i + 1;
      if (in >= nvert)
        in = 0;
      if (p[in].y == p[i].y && p[in].x == p[i].x)
        continue;
      sine = (x - p[i].x) * (p[in].y - p[i].y) - (y - p[i].y) * (p[in].x - p[i].x);
      if (sine == 0) {
        if (((x - p[i].x) * (p[in].x - p[i].x) + (y - p[i].y) * (p[in].y - p[i].y))
            * ((x - p[in].x) * (p[in].x - p[i].x) + (y - p[in].y) * (p[in].y - p[i].y)) > 0)
          continue;
        return true;
      }
      if (y > p[in].y && y <= p[i].y && sine < 0 || y <= p[in].y && y > p[i].y && sine > 0) {
        bool = !bool;
      }
    }
    if (bool)
      inside = 1;
    if (inside != 0)
      return true;
    else
      return false;
  }

}