001: /*
002: * This file is part of the GeOxygene project source files.
003: *
004: * GeOxygene aims at providing an open framework which implements OGC/ISO specifications for
005: * the development and deployment of geographic (GIS) applications. It is a open source
006: * contribution of the COGIT laboratory at the Institut Géographique National (the French
007: * National Mapping Agency).
008: *
009: * See: http://oxygene-project.sourceforge.net
010: *
011: * Copyright (C) 2005 Institut Géographique National
012: *
013: * This library is free software; you can redistribute it and/or modify it under the terms
014: * of the GNU Lesser General Public License as published by the Free Software Foundation;
015: * either version 2.1 of the License, or any later version.
016: *
017: * This library is distributed in the hope that it will be useful, but WITHOUT ANY
018: * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
019: * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
020: *
021: * You should have received a copy of the GNU Lesser General Public License along with
022: * this library (see file LICENSE if present); if not, write to the Free Software
023: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024: *
025: */
026:
027: package fr.ign.cogit.geoxygene.spatial.geomprim;
028:
029: import fr.ign.cogit.geoxygene.spatial.coordgeom.DirectPosition;
030: import fr.ign.cogit.geoxygene.spatial.geomcomp.GM_CompositeCurve;
031:
032: /**
033: * Représente un composant d'une GM_SurfaceBoundary.
034: * Un GM_Ring est une GM_CompositeCurve fermée, c'est-à-dire des références vers des GM_OrientableCurve connectées en un cycle.
035: *
036: * @author Thierry Badard & Arnaud Braun
037: * @version 1.0
038: *
039: */
040:
041: public class GM_Ring extends GM_CompositeCurve {
042:
043: /** Constructeur par défaut */
044: public GM_Ring() {
045: super ();
046: }
047:
048: /** Constructeur à partir d'une et d'une seule GM_OrientableCurve.
049: * Ne vérifie pas la fermeture. */
050: public GM_Ring(GM_OrientableCurve oriCurve) {
051: super (oriCurve);
052: }
053:
054: /** Constructeur à partir d'une et d'une seule GM_OrientableCurve.
055: * Vérifie la fermeture, d'où le paramètre tolérance. Exception si ca ne ferme pas.*/
056: // TO DO : un nouveau type d'exception
057: public GM_Ring(GM_OrientableCurve oriCurve, double tolerance)
058: throws Exception {
059: super (oriCurve);
060: GM_Curve c = (GM_Curve) oriCurve.getPrimitive();
061: DirectPosition pt1 = c.startPoint();
062: DirectPosition pt2 = c.endPoint();
063: if (!pt1.equals(pt2, tolerance))
064: throw new Exception(
065: "tentative de créer un GM_Ring avec une courbe non fermée");
066: }
067:
068: /** Constructeur à partir d'une courbe composée (cast).
069: * Ne vérifie ni la fermeture, ni le chainage. */
070: public GM_Ring(GM_CompositeCurve compCurve) {
071: super ();
072: this .generator = compCurve.getGenerator();
073: this .primitive = compCurve.getPrimitive();
074: this .proxy[0] = compCurve.getPositive();
075: this .proxy[1] = compCurve.getNegative();
076: }
077:
078: /** Constructeur à partir d'une courbe composée (cast).
079: * Vérifie la fermeture et le chainage sinon exception. */
080: public GM_Ring(GM_CompositeCurve compCurve, double tolerance)
081: throws Exception {
082: super ();
083: this .generator = compCurve.getGenerator();
084: this .primitive = compCurve.getPrimitive();
085: this .proxy[0] = compCurve.getPositive();
086: this .proxy[1] = compCurve.getNegative();
087: if (!super .validate(tolerance))
088: throw new Exception(
089: "new GM_Ring(): La courbe composée passée en paramètre n'est pas chaînée");
090: if (!this .validate(tolerance))
091: throw new Exception(
092: "new GM_Ring(): La courbe composée passée en paramètre ne ferme pas.");
093: }
094:
095: /** Méthode pour vérifier qu'on a un chainage, et que le point initial est bien égal au point final.
096: * Surcharge de la méthode validate sur GM_CompositeCurve.
097: * Renvoie TRUE si c'est le cas, FALSE sinon.*/
098: public boolean validate(double tolerance) {
099: if (!super .validate(tolerance))
100: return false;
101: GM_CurveBoundary bdy = (GM_CurveBoundary) this .boundary();
102: if (bdy.getStartPoint().getPosition().equals(
103: bdy.getEndPoint().getPosition(), tolerance))
104: return true;
105: else
106: return false;
107: }
108: }
|