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: import com.vividsolutions.jts.geomgraph.Position;
037: import com.vividsolutions.jts.geom.Location;
038:
039: /**
040: * A Depth object records the topological depth of the sides
041: * of an Edge for up to two Geometries.
042: * @version 1.7
043: */
044: public class Depth {
045:
046: private final static int NULL_VALUE = -1;
047:
048: public static int depthAtLocation(int location) {
049: if (location == Location.EXTERIOR)
050: return 0;
051: if (location == Location.INTERIOR)
052: return 1;
053: return NULL_VALUE;
054: }
055:
056: private int[][] depth = new int[2][3];
057:
058: public Depth() {
059: // initialize depth array to a sentinel value
060: for (int i = 0; i < 2; i++) {
061: for (int j = 0; j < 3; j++) {
062: depth[i][j] = NULL_VALUE;
063: }
064: }
065: }
066:
067: public int getDepth(int geomIndex, int posIndex) {
068: return depth[geomIndex][posIndex];
069: }
070:
071: public void setDepth(int geomIndex, int posIndex, int depthValue) {
072: depth[geomIndex][posIndex] = depthValue;
073: }
074:
075: public int getLocation(int geomIndex, int posIndex) {
076: if (depth[geomIndex][posIndex] <= 0)
077: return Location.EXTERIOR;
078: return Location.INTERIOR;
079: }
080:
081: public void add(int geomIndex, int posIndex, int location) {
082: if (location == Location.INTERIOR)
083: depth[geomIndex][posIndex]++;
084: }
085:
086: /**
087: * A Depth object is null (has never been initialized) if all depths are null.
088: */
089: public boolean isNull() {
090: for (int i = 0; i < 2; i++) {
091: for (int j = 0; j < 3; j++) {
092: if (depth[i][j] != NULL_VALUE)
093: return false;
094: }
095: }
096: return true;
097: }
098:
099: public boolean isNull(int geomIndex) {
100: return depth[geomIndex][1] == NULL_VALUE;
101: }
102:
103: public boolean isNull(int geomIndex, int posIndex) {
104: return depth[geomIndex][posIndex] == NULL_VALUE;
105: }
106:
107: public void add(Label lbl) {
108: for (int i = 0; i < 2; i++) {
109: for (int j = 1; j < 3; j++) {
110: int loc = lbl.getLocation(i, j);
111: if (loc == Location.EXTERIOR
112: || loc == Location.INTERIOR) {
113: // initialize depth if it is null, otherwise add this location value
114: if (isNull(i, j)) {
115: depth[i][j] = depthAtLocation(loc);
116: } else
117: depth[i][j] += depthAtLocation(loc);
118: }
119: }
120: }
121: }
122:
123: public int getDelta(int geomIndex) {
124: return depth[geomIndex][Position.RIGHT]
125: - depth[geomIndex][Position.LEFT];
126: }
127:
128: /**
129: * Normalize the depths for each geometry, if they are non-null.
130: * A normalized depth
131: * has depth values in the set { 0, 1 }.
132: * Normalizing the depths
133: * involves reducing the depths by the same amount so that at least
134: * one of them is 0. If the remaining value is > 0, it is set to 1.
135: */
136: public void normalize() {
137: for (int i = 0; i < 2; i++) {
138: if (!isNull(i)) {
139: int minDepth = depth[i][1];
140: if (depth[i][2] < minDepth)
141: minDepth = depth[i][2];
142:
143: if (minDepth < 0)
144: minDepth = 0;
145: for (int j = 1; j < 3; j++) {
146: int newValue = 0;
147: if (depth[i][j] > minDepth)
148: newValue = 1;
149: depth[i][j] = newValue;
150: }
151: }
152: }
153: }
154:
155: public String toString() {
156: return "A: " + depth[0][1] + "," + depth[0][2] + " B: "
157: + depth[1][1] + "," + depth[1][2];
158: }
159: }
|