001: /*
002: * The Unified Mapping Platform (JUMP) is an extensible, interactive GUI
003: * for visualizing and manipulating spatial features with geometry and attributes.
004: *
005: * Copyright (C) 2003 Vivid Solutions
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License
009: * as published by the Free Software Foundation; either version 2
010: * of the License, or (at your option) any later version.
011: *
012: * This program is distributed in the hope that it will be useful,
013: * but WITHOUT ANY WARRANTY; without even the implied warranty of
014: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
015: * GNU General Public License for more details.
016: *
017: * You should have received a copy of the GNU General Public License
018: * along with this program; if not, write to the Free Software
019: * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
020: *
021: * For more information, contact:
022: *
023: * Vivid Solutions
024: * Suite #1A
025: * 2328 Government Street
026: * Victoria BC V8T 5G5
027: * Canada
028: *
029: * (250)385-6040
030: * www.vividsolutions.com
031: */
032:
033: package com.vividsolutions.jump.geom;
034:
035: import com.vividsolutions.jts.geom.*;
036:
037: /**
038: * Increases the number of cases
039: * JTS overlay operations can handle without robustness errors
040: * by removing "excess" precision from the input geometries.
041: */
042: public class MaxPrecisionOverlayOp {
043: public MaxPrecisionOverlayOp() {
044: }
045:
046: public static double getMinInAbsValue(double x0, double x1) {
047: double absx0 = Math.abs(x0);
048: double absx1 = Math.abs(x1);
049:
050: if (absx0 < absx1) {
051: return x0;
052: }
053:
054: return x1;
055: }
056:
057: private void printBits(double x) {
058: System.out.println("double value = " + x);
059: System.out.println(Long.toBinaryString(Double
060: .doubleToLongBits(x)));
061: System.out
062: .println(Long.toHexString(Double.doubleToLongBits(x)));
063: }
064:
065: public Geometry intersection(Geometry g0, Geometry g1) {
066: Envelope env = new Envelope();
067: env.expandToInclude(g0.getEnvelopeInternal());
068: env.expandToInclude(g1.getEnvelopeInternal());
069:
070: printBits(env.getMinX());
071: printBits(env.getMaxX());
072: printBits(env.getMinY());
073: printBits(env.getMaxY());
074:
075: Coordinate minPt = new Coordinate();
076: minPt.x = getMinInAbsValue(env.getMinX(), env.getMaxX());
077: minPt.y = getMinInAbsValue(env.getMinY(), env.getMaxY());
078:
079: minPt.x = 475136.0; // 477000.0;
080: minPt.y = 5366784.0; //5360000.0;
081:
082: Coordinate negMinPt = new Coordinate(minPt);
083: negMinPt.x = -negMinPt.x;
084: negMinPt.y = -negMinPt.y;
085:
086: AffineTransform trans = new AffineTransform();
087: trans.translate(negMinPt);
088:
089: Geometry g0Copy = (Geometry) g0.clone();
090: Geometry g1Copy = (Geometry) g1.clone();
091: printBits(g1Copy.getCoordinate().x);
092: g0Copy.apply(new CoordinatePrecisionReducer());
093: g1Copy.apply(new CoordinatePrecisionReducer());
094:
095: // trans.apply(g0Copy);
096: // trans.apply(g1Copy);
097: printBits(g1Copy.getCoordinate().x);
098: printBits(2345.626654971);
099:
100: System.out.println(g0Copy);
101: System.out.println(g1Copy);
102:
103: Geometry result = g0Copy.intersection(g1Copy);
104:
105: System.out.println(result.getArea() / g0Copy.getArea());
106:
107: trans.translate(minPt);
108: trans.apply(result);
109:
110: return result;
111: }
112:
113: public class CoordinatePrecisionReducer implements CoordinateFilter {
114: private static final double POW10 = 1000.0;
115:
116: public void filter(Coordinate p) {
117: double x = p.x * POW10;
118: x = Math.floor(x);
119:
120: //x -= 477000.0 * POW10;
121: p.x = x;
122:
123: double y = p.y * POW10;
124: y = Math.floor(y);
125:
126: //y -= 5360000.0 * POW10;
127: p.y = y;
128: }
129: }
130: }
|