001:
002: /*
003: * The JTS Topology Suite is a collection of Java classes that
004: * implement the fundamental operations required to validate a given
005: * geo-spatial data set to a known topological specification.
006: *
007: * Copyright (C) 2001 Vivid Solutions
008: *
009: * This library is free software; you can redistribute it and/or
010: * modify it under the terms of the GNU Lesser General Public
011: * License as published by the Free Software Foundation; either
012: * version 2.1 of the License, or (at your option) any later version.
013: *
014: * This library is distributed in the hope that it will be useful,
015: * but WITHOUT ANY WARRANTY; without even the implied warranty of
016: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
017: * Lesser General Public License for more details.
018: *
019: * You should have received a copy of the GNU Lesser General Public
020: * License along with this library; if not, write to the Free Software
021: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
022: *
023: * For more information, contact:
024: *
025: * Vivid Solutions
026: * Suite #1A
027: * 2328 Government Street
028: * Victoria BC V8T 5G5
029: * Canada
030: *
031: * (250)385-6040
032: * www.vividsolutions.com
033: */
034: package com.vividsolutions.jts.geomgraph;
035:
036: /**
037: * @version 1.7
038: */
039: import com.vividsolutions.jts.geom.Coordinate;
040:
041: /**
042: * Utility functions for working with quadrants, which are numbered as follows:
043: * <pre>
044: * 1 | 0
045: * --+--
046: * 2 | 3
047: * <pre>
048: *
049: * @version 1.7
050: */
051: public class Quadrant {
052: /**
053: * Returns the quadrant of a directed line segment (specified as x and y
054: * displacements, which cannot both be 0).
055: */
056: public static int quadrant(double dx, double dy) {
057: if (dx == 0.0 && dy == 0.0)
058: throw new IllegalArgumentException(
059: "Cannot compute the quadrant for point ( " + dx
060: + ", " + dy + " )");
061: if (dx >= 0) {
062: if (dy >= 0)
063: return 0;
064: else
065: return 3;
066: } else {
067: if (dy >= 0)
068: return 1;
069: else
070: return 2;
071: }
072: }
073:
074: /**
075: * Returns the quadrant of a directed line segment from p0 to p1.
076: */
077: public static int quadrant(Coordinate p0, Coordinate p1) {
078: double dx = p1.x - p0.x;
079: double dy = p1.y - p0.y;
080: if (dx == 0.0 && dy == 0.0)
081: throw new IllegalArgumentException(
082: "Cannot compute the quadrant for two identical points "
083: + p0);
084: return quadrant(dx, dy);
085: }
086:
087: /**
088: * Returns true if the quadrants are 1 and 3, or 2 and 4
089: */
090: public static boolean isOpposite(int quad1, int quad2) {
091: if (quad1 == quad2)
092: return false;
093: int diff = (quad1 - quad2 + 4) % 4;
094: // if quadrants are not adjacent, they are opposite
095: if (diff == 2)
096: return true;
097: return false;
098: }
099:
100: /**
101: * Returns the right-hand quadrant of the halfplane defined by the two quadrants,
102: * or -1 if the quadrants are opposite, or the quadrant if they are identical.
103: */
104: public static int commonHalfPlane(int quad1, int quad2) {
105: // if quadrants are the same they do not determine a unique common halfplane.
106: // Simply return one of the two possibilities
107: if (quad1 == quad2)
108: return quad1;
109: int diff = (quad1 - quad2 + 4) % 4;
110: // if quadrants are not adjacent, they do not share a common halfplane
111: if (diff == 2)
112: return -1;
113: //
114: int min = (quad1 < quad2) ? quad1 : quad2;
115: int max = (quad1 > quad2) ? quad1 : quad2;
116: // for this one case, the righthand plane is NOT the minimum index;
117: if (min == 0 && max == 3)
118: return 3;
119: // in general, the halfplane index is the minimum of the two adjacent quadrants
120: return min;
121: }
122:
123: /**
124: * Returns whether the given quadrant lies within the given halfplane (specified
125: * by its right-hand quadrant).
126: */
127: public static boolean isInHalfPlane(int quad, int halfPlane) {
128: if (halfPlane == 3) {
129: return quad == 3 || quad == 0;
130: }
131: return quad == halfPlane || quad == halfPlane + 1;
132: }
133:
134: /**
135: * Returns true if the given quadrant is 0 or 1.
136: */
137: public static boolean isNorthern(int quad) {
138: return quad == 0 || quad == 1;
139: }
140: }
|