gm_envelope.java

来自「用于GIS(全球地理系统)的分析和处理的代码。」· Java 代码 · 共 406 行 · 第 1/2 页

JAVA
406
字号
        double Xmax = upperCorner.getX();
        double Ymin = lowerCorner.getY();
        double Ymax = upperCorner.getY();
        if (x<Xmin) return false;
        if (x>Xmax) return false;
        if (y<Ymin) return false;
        if (y>Ymax) return false;
        return true;
    }
        
    /** Indique si self contient le point de coordonnees x,y,z passees en parametre (3D). */
    public boolean contains (double x, double y, double z) {
        double Xmin = lowerCorner.getX();
        double Xmax = upperCorner.getX();
        double Ymin = lowerCorner.getY();
        double Ymax = upperCorner.getY();
        double Zmin = lowerCorner.getZ();
        double Zmax = upperCorner.getZ();        
        if (x<Xmin) return false;
		if (x>Xmax) return false;
		if (y<Ymin) return false;
		if (y>Ymax) return false;
		if (z<Zmin) return false;
		if (z>Zmax) return false;
        return true;
    }
        
    /** Indique si self contient entierement l'enveloppe passee en parametre. */
    public boolean contains (GM_Envelope env) {
        if (!this.contains(env.getLowerCorner())) return false;
        if (!this.contains(env.getUpperCorner())) return false;
        return true;
    }
        
    /** Indique si self et l'enveloppe passee en parametre se recouvrent, en 2D. */
    public boolean overlaps (GM_Envelope env) {
        if (this.getUpperCorner().getX() < env.getLowerCorner().getX()) return false;
        if (this.getLowerCorner().getX() > env.getUpperCorner().getX()) return false;
		if (this.getUpperCorner().getY() < env.getLowerCorner().getY()) return false;
		if (this.getLowerCorner().getY() > env.getUpperCorner().getY()) return false;
		return true;        
    }
    
    
    
    
    ////////////////////////////////////////////////////////////////////////////////////////////////
    // Methodes expand /////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////// 
    
    /** Agrandit l'enveloppe pour contenir le point en entree. Si le point est deja dans l'enveloppe, ne fait rien. */
    public void expand (DirectPosition thePoint) {
        if (!this.contains(thePoint)) {
            int n = this.getDimension();
            for (int i=0; i<n; i++) {
                double theCoord = thePoint.getCoordinate(i);
                double theMin = lowerCorner.getCoordinate(i);
                double theMax = upperCorner.getCoordinate(i);
                if (theCoord > theMax) upperCorner.setCoordinate(i,theCoord);
                    else if (theCoord < theMin) lowerCorner.setCoordinate(i,theCoord);
            }
        }
    }
        
    /** Agrandit l'enveloppe pour contenir le point en entree. Si le point est deja dans l'enveloppe, ne fait rien. */
    public void expand (double x, double y) {
        if (!this.contains(x,y)) {
            double Xmin = lowerCorner.getX();
            double Xmax = upperCorner.getX();
            double Ymin = lowerCorner.getY();
            double Ymax = upperCorner.getY();
            if (y > Ymax) upperCorner.setY(y);
                else if (y < Ymin) lowerCorner.setY(y);
            if (x > Xmax) upperCorner.setX(x);
                else if (x < Xmin) lowerCorner.setX(x);
        }
    }
        
    /** Agrandit l'enveloppe pour contenir le point en entree. Si le point est deja dans l'enveloppe, ne fait rien. */
    public void expand (double x, double y, double z) {
        if (!this.contains(x,y,z)) {
            double Xmin = lowerCorner.getX();
            double Xmax = upperCorner.getX();
            double Ymin = lowerCorner.getY();
            double Ymax = upperCorner.getY();
            double Zmin = lowerCorner.getZ();
            double Zmax = upperCorner.getZ();
            if (z > Zmax) upperCorner.setZ(z);
                else if (z < Zmin) lowerCorner.setZ(z);
            if (y > Ymax) upperCorner.setY(y);
                else if (y < Ymin) lowerCorner.setY(y);
            if (x > Xmax) upperCorner.setX(x);
                else if (x < Xmin) lowerCorner.setX(x);
        }
    }  
                
    /** Agrandit l'enveloppe pour contenir l'enveloppe en entree. Si elle est deja contenue, ne fait rien. */
    public void expand (GM_Envelope env) {
        if (!this.contains(env)) {
            this.expand(env.getUpperCorner());
            this.expand(env.getLowerCorner());
        }
    }
        
    /** Effectue une homothetie de facteur h sur l'enveloppe. */
    public void expandBy (double h) {
        DirectPosition theCenter = this.center();
        int n = this.getDimension();
        for (int i=0; i<n; i++) {
            double center = theCenter.getCoordinate(i);
            double delta = upperCorner.getCoordinate(i)-center;
            upperCorner.setCoordinate(i,center + h*delta);
            lowerCorner.setCoordinate(i,center - h*delta);
        }
    }
    
    /** Effectue une homothetie de w sur l'axe des X et de l sur l'axe des Y. */
    public void expandBy (double w, double l) {
        DirectPosition theCenter = this.center();
        double centerX = theCenter.getX();
        double deltaX = this.maxX() - centerX;
        upperCorner.setX(centerX + w*deltaX);
        lowerCorner.setX(centerX - w*deltaX);
        
        double centerY = theCenter.getY();
        double deltaY = this.maxY() - centerY;
        upperCorner.setY(centerY + l*deltaY);
        lowerCorner.setY(centerY - l*deltaY);
    }
    
    /** Effectue une homothetie de w sur l'axe des X, de l sur l'axe des Y, et de h sur l'axe des Z. */
    public void expandBy (double w, double l, double h) {
        DirectPosition theCenter = this.center();
        double centerX = theCenter.getX();
        double deltaX = this.maxX() - centerX;
        upperCorner.setX(centerX + w*deltaX);
        lowerCorner.setX(centerX - w*deltaX);
        
        double centerY = theCenter.getY();
        double deltaY = this.maxY() - centerY;
        upperCorner.setY(centerY + l*deltaY);
        lowerCorner.setY(centerY - l*deltaY);
        
        double centerZ = theCenter.getZ();
        double deltaZ = this.maxZ() - centerZ;
        upperCorner.setZ(centerZ + h*deltaZ);
        lowerCorner.setZ(centerZ - h*deltaZ);
    }
    
    
    
    
    ////////////////////////////////////////////////////////////////////////////////////////////////
    // Divers //////////////////////////////////////////////////////////////////////////////////////
    //////////////////////////////////////////////////////////////////////////////////////////////// 
    
    /** Renvoie True si l'enveloppe est vide, c'est-a-dire : les coordonnees du lowerCorner 
        sont plus grandes que celles du upperCorner. */
    public boolean isEmpty() {
         int n = this.getDimension();
         for (int i=0; i<n; i++) {
             double theMin = lowerCorner.getCoordinate(i);
             double theMax = upperCorner.getCoordinate(i);
             if (theMin > theMax) return true;
         }
         return false;
    }
    
    /** Clone l'enveloppe. */
    public Object clone() {
        DirectPosition up = (DirectPosition)upperCorner.clone();
        DirectPosition low = (DirectPosition)lowerCorner.clone();
        return new GM_Envelope(up,low);
    }
    

    /** Affiche les coordonnees  */
    public String toString() {
        return samplePoint().toString();
    }
    
    /** Renvoie la liste des DirectPosition de l'objet. */
    public DirectPositionList samplePoint() {
        DirectPositionList dpl = new DirectPositionList();
        DirectPosition dp;
        dpl.add(lowerCorner);
        if (!Double.isNaN(lowerCorner.getZ())) 
            dp = new DirectPosition(upperCorner.getX(), lowerCorner.getY(), lowerCorner.getZ() ); // a revoir
        else 
            dp = new DirectPosition(upperCorner.getX(), lowerCorner.getY());
        dpl.add(dp);
        dpl.add(upperCorner);
        if (!Double.isNaN(upperCorner.getZ())) 
            dp = new DirectPosition(lowerCorner.getX(), upperCorner.getY(), upperCorner.getZ() ); // a revoir
        else 
            dp = new DirectPosition(lowerCorner.getX(), upperCorner.getY());
        dpl.add(dp);        
        
        return dpl;
    }
           
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?