/* * GeoTools - The Open Source Java GIS Toolkit * http://geotools.org * * (C) 2006-2008, Open Source Geospatial Foundation (OSGeo) * * This library 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; * version 2.1 of the License. * * This library 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. */ package org.geotools.geometry.iso.util.algorithmND; /** * @author roehrig * * * * * @source $URL$ */ public class AlgoRectangleND { /** * Verifies whether a n-D point lays within the envelope, or at the border or corner of the envelope. * * @param minCoord Lower Corner of the envelope * @param maxCoord Upper Corner of the envelope * @param coord Coordinate which has to be tested whether it´s within the envelope or not * * @return TRUE, if the Coordinate lays within the envelope */ public static boolean contains(double minCoord[], double maxCoord[], double[] coord) { // Method tested - ok (SJ) - see JUNIT tests for (int i = 0, n = minCoord.length; i < n; ++i) { if ((coord[i] < minCoord[i]) || (coord[i] > maxCoord[i])) return false; } return true; } /** * Verifies whether another envelope intersects with this envelope * @param minCoord0 * @param maxCoord0 * @param minCoord1 * @param maxCoord1 * @return TRUE, if envelopes intersect; FALSE, if they dont intersect */ public static boolean intersects( double minCoord0[], double maxCoord0[], double minCoord1[], double maxCoord1[]) { // Method corrected and tested - ok (SJ) - see JUNIT tests // for (int i = 0, n = minCoord0.length; i < n; ++i) // if (contains(minCoord0, maxCoord0, minCoord1) || contains(minCoord0, maxCoord0, minCoord1)) // return true; // for (int i = 0, n = minCoord0.length; i < n; ++i) // if (contains(minCoord1, maxCoord1, minCoord0) || contains(minCoord1, maxCoord1, minCoord0)) // return true; for (int i = 0, n = minCoord0.length; i < n; ++i) { if (minCoord1[i] > maxCoord0[i] || maxCoord1[i] < minCoord0[i]) return false; } return true; } // AUSKOMMENTIERT, DA NICHT GENUTZT, NICHT KOMMENTIERT UND NICHT GETESTET (SJ) // /** // * @param minCoord // * @param maxCoord // * @return double // */ // public static double maxLength(double minCoord[], double maxCoord[]) { // double result = 0.0; // for (int i = 1, n = minCoord.length; i < n; ++i) { // if ( (maxCoord[i]-minCoord[i])>result ) result = maxCoord[i]-minCoord[i]; // } // return result; // } // AUSKOMMENTIERT, DA NICHT GENUTZT UND NICHT GETESTET (SJ) // /** // * Expands the envelope with a direct Position // * @param minCoord // * @param maxCoord // * @param coord // */ // public static void expand(double minCoord[], double maxCoord[], double coord[]) { // for (int i = 0, n = minCoord.length; i < n; ++i) { // if (coord[i] < minCoord[i]) minCoord[i] = coord[i]; // if (coord[i] > maxCoord[i]) maxCoord[i] = coord[i]; // } // } // AUSKOMMENTIERT, DA NICHT GENUTZT, NICHT KOMMENTIERT UND NICHT GETESTET (SJ) // /** // * @param minCoord // * @param maxCoord // * @param coord // */ // public static void add(double minCoord[], double maxCoord[], double[] coord) { // for (int i = 0, n = minCoord.length; i < n; ++i) { // if ( coord[i] < minCoord[i]) minCoord[i] = coord[i]; // if ( coord[i] > maxCoord[i]) maxCoord[i] = coord[i]; // } // } // AUSKOMMENTIERT, DA NICHT GENUTZT, NICHT KOMMENTIERT UND NICHT GETESTET (SJ) // /** // * @param minCoord // * @param maxCoord // * @return double[] // */ // public static double[] center(double minCoord[], double maxCoord[]) { // return AlgoPointND.scale(AlgoPointND.add(minCoord,maxCoord),0.5); // } // AUSKOMMENTIERT DA FEHLERHAFT (NICHT ROBUST) s. JUNIT TESTS (SJ) // /** // * @param minCoord // * @param maxCoord // * @param factor // */ // public static void scale(double minCoord[], double maxCoord[], double factor) { // if (factor <= 0.0 || factor == 1.0) return; // double[] center = center(minCoord, maxCoord); // double[] resultMin = AlgoPointND.subtract(center,minCoord); // double[] resultMax = AlgoPointND.subtract(center,maxCoord); // resultMin = AlgoPointND.scale(resultMin, factor); // resultMax = AlgoPointND.scale(resultMax, factor); // resultMin = AlgoPointND.add(center, resultMin); // resultMax = AlgoPointND.add(center, resultMax); // for (int i=0, n=minCoord.length; i<n; ++i) { // minCoord[i] = resultMin[i]; // maxCoord[i] = resultMax[i]; // } // } // AUSKOMMENTIERT, DA NICHT GETESTET UND NICHT DOKUMENTIERT (SJ) // /** // * @param minCoord // * @param maxCoord // * @param coord // * @return boolean // */ // public static boolean touches(double minCoord[], double maxCoord[], double[] coord) { // for (int i = 0, n = minCoord.length; i < n; ++i) { // if ((Math.abs(coord[i] - minCoord[i]) <= 0.0) // || (Math.abs(coord[i] - maxCoord[i]) <= 0.0)) { // return true; // } // } // return false; // } // AUSKOMMENTIERT, DA NICHT GETESTET UND NICHT DOKUMENTIERT (SJ) // /** // * @param minCoord // * @param maxCoord // * @param coord // * @param side // * @return boolean // */ // public static boolean touches(double minCoord[], double maxCoord[], double[] coord, int side) { // // side = 0: left and right // // side = 1: bottom and top // // side = 2: front and back // int n = minCoord.length; // assert (side < n); // double coords = coord[side]; // double min = minCoord[side]; // double max = maxCoord[side]; // return ((Math.abs(coords - min) <= 0.0) || // (Math.abs(coords - max) <= 0.0)); // } // AUSKOMMENTIERT, DA NICHT GETESTET UND NICHT DOKUMENTIERT (SJ), DESWEITEREN HAT ES DIE SELBE FUNKTION GELIEFERT WIE DIE METHODE "contains". // /** // * @param minCoord // * @param maxCoord // * @param p // * @return boolean // */ // public static boolean intersects(double minCoord[], double maxCoord[], double[] p) { // //return touches(minCoord, maxCoord, p) || contains(minCoord, maxCoord, p); // return contains(minCoord, maxCoord, p); // } }