All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jgrasstools.gears.libs.modules.Direction Maven / Gradle / Ivy

The newest version!
/*
 * This file is part of JGrasstools (http://www.jgrasstools.org)
 * (C) HydroloGIS - www.hydrologis.com 
 * 
 * JGrasstools is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program 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 General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see .
 */
package org.jgrasstools.gears.libs.modules;

import static java.lang.Math.sqrt;

/**
 * The possible flowdirections.
 *
 * 

* The normal (exiting) flowdirection schema defines in which cell the drop flows * if it has a particular value. *

 *        -1     0     1 
 *      +-----+-----+-----+
 * -1   |  4  |  3  |  2  |
 *      +-----+-----+-----+
 *  0   |  5  |  x  |  1  |
 *      +-----+-----+-----+
 *  1   |  6  |  7  |  8  |
 *      +-----+-----+-----+
 * 
*

* The entering flowdirection schema defines what value the neighbour cell * has to have to flow into the current (center) cell. *
 *        -1     0     1 
 *      +-----+-----+-----+
 * -1   |  8  |  7  |  6  |
 *      +-----+-----+-----+
 *  0   |  1  |  x  |  5  |
 *      +-----+-----+-----+
 *  1   |  2  |  3  |  4  |
 *      +-----+-----+-----+
 * 
*

*

* * @author Andrea Antonello (www.hydrologis.com) */ public enum Direction { E(1, 0, 1, 5), // EN(1, -1, 2, 6), // N(0, -1, 3, 7), // NW(-1, -1, 4, 8), // W(-1, 0, 5, 1), // WS(-1, 1, 6, 2), // S(0, 1, 7, 3), // SE(1, 1, 8, 4); private static final Direction[] orderedDirs = new Direction[]{E, EN, N, NW, W, WS, S, SE}; public int col; public int row; private int exiting; private int entering; private static Direction[][] dirs = {// {NW, N, EN},// {W, null, E},// {WS, S, SE}// }; /** * Constructor. * * @param col column of the current direction inside the schema. * @param row row of the current direction inside the schema. * @param exiting value of the flow, in normal (or exiting from the center/flow to) mode. * @param entering value of the flow in entering mode. */ private Direction( int col, int row, int exiting, int entering ) { this.col = col; this.row = row; this.exiting = exiting; this.entering = entering; } public int getFlow() { return exiting; } public int getEnteringFlow() { return entering; } public static int getOutletValue() { return 10; } /** * Get the dir for a particular col/row of the directions schema. * * @param col the col [-1, 1]. * @param row the row [1, 1]. * @return the direction or null for illegal values. */ public static Direction getDir( int col, int row ) { return dirs[col][row]; } /** * @return the array of directions, starting from the most eastern, going counterclockwise. */ public static Direction[] getOrderedDirs() { return orderedDirs; } /** * Get the {@link Direction} by its exiting flow. * * @param flowValue the value of the (exiting) flow. * @return the direction. */ public static Direction forFlow( int flowValue ) { switch( flowValue ) { case 1: return E; case 2: return EN; case 3: return N; case 4: return NW; case 5: return W; case 6: return WS; case 7: return S; case 8: return SE; case 10: return null; default: throw new IllegalArgumentException("Can't understand flow direction: " + flowValue); } } public double getDistance( double xRes, double yRes ) { switch( this ) { case E: case W: return xRes; case N: case S: return yRes; case EN: case NW: case WS: case SE: return sqrt(xRes * xRes + yRes * yRes); default: throw new IllegalArgumentException(); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy