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

uk.ac.rdg.resc.edal.coverage.grid.impl.AbstractGrid Maven / Gradle / Ivy

The newest version!
/*******************************************************************************
 * Copyright (c) 2012 The University of Reading
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the University of Reading, nor the names of the
 *    authors or contributors may be used to endorse or promote products
 *    derived from this software without specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 ******************************************************************************/

package uk.ac.rdg.resc.edal.coverage.grid.impl;

import uk.ac.rdg.resc.edal.coverage.grid.Grid;
import uk.ac.rdg.resc.edal.coverage.grid.GridAxis;
import uk.ac.rdg.resc.edal.coverage.grid.GridCoordinates;
import uk.ac.rdg.resc.edal.coverage.grid.GridExtent;

/**
 * Partial implementation of a {@link Grid}
 * 
 * @author Guy Griffiths
 * 
 */
public abstract class AbstractGrid implements Grid {

    @Override
    public long size() {
        // We reuse code in GridExtentImpl to calculate the size
        return GridExtentImpl.convert(getGridExtent()).size();
    }

    @Override
    public GridExtent getGridExtent() {
        int[] low = new int[getNDim()];
        int[] high = new int[getNDim()];
        for (int i = 0; i < getNDim(); i++) {
            GridAxis axis = getAxis(i);
            if (axis == null) {
                low[i] = -1;
                high[i] = -1;
            } else {
                low[i] = axis.getIndexExtent().getLow();
                high[i] = axis.getIndexExtent().getHigh();
            }
        }
        return new GridExtentImpl(new GridCoordinatesImpl(low), new GridCoordinatesImpl(high));
    }

    @Override
    public GridCoordinates getCoords(long index) {
        if (index < 0 || index >= size()) {
            throw new IndexOutOfBoundsException("Index must be between 0 and " + size());
        }
        int[] coords = new int[getNDim()];
        for (int i = 0; i < getNDim(); i++) {
            int size = 1;
            if (getAxis(i) != null) {
                size = getAxis(i).size();
            }
            coords[i] = (int) (index % size) + getMin(i);

            index = (index - coords[i]) / getAxisSize(i);
        }
        return new GridCoordinatesImpl(coords);
    }

    @Override
    public long getIndex(GridCoordinates coords) {
        long index = 0;
        for (int i = 0; i < getNDim(); i++) {
            if (!getAxis(i).getIndexExtent().contains(coords.getIndex(i))) {
                throw new IndexOutOfBoundsException("Index out of bounds on axis " + i);
            }

            int thisIndex = coords.getIndex(i) - getMin(i);

            int size = 1;
            for (int j = 0; j < i; j++) {
                size *= getAxisSize(j);
            }
            index += thisIndex * size;
        }
        return index;
    }

    private int getMin(int dim) {
        if (getAxis(dim) == null)
            return 0;
        return this.getAxis(dim).getIndexExtent().getLow();
    }

    private int getAxisSize(int dim) {
        if (getAxis(dim) == null)
            return 1;
        return this.getAxis(dim).size();
    }

    @Override
    public long getIndex(int... indices) {
        return getIndex(new GridCoordinatesImpl(indices));
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy