/*
* GridScaleToRangeOperator.java
*
* Created on February 2, 2006, 8:33 PM
*
*/
package edu.oregonstate.cartography.grid.operators;
import edu.oregonstate.cartography.grid.Grid;
import java.util.Arrays;
/**
*
* @author Bernhard Jenny, Oregon State University
*/
public class GridScaleToRangeOperator extends ThreadedGridOperator {
/**
* New minimum and maximum values in the destination grid.
*/
private float dstMin, dstMax;
/**
* Minimum and maximum values in source grid. Temporary variables to
* accelerate computations.
*/
private float srcMin, srcMax;
/**
* Creates a new instance of GridScaleToRangeOperator
*/
public GridScaleToRangeOperator() {
dstMin = dstMax = 0.f;
}
public GridScaleToRangeOperator(float newMin, float newMax) {
setRange(newMin, newMax);
}
public GridScaleToRangeOperator(float[] newMinMax) {
setRange(newMinMax);
}
@Override
public Grid operate(Grid src, Grid dst) {
final float[] minMax = src.getMinMax();
srcMin = minMax[0];
srcMax = minMax[1];
return super.operate(src, dst);
}
@Override
public void operate(Grid src, Grid dst, int startRow, int endRow) {
float[][] srcGrid = src.getGrid();
float[][] dstGrid = dst.getGrid();
final int nCols = src.getCols();
final float srcRange = srcMax - srcMin;
final float dstRange = dstMax - dstMin;
if (srcRange <= 0 || dstRange <= 0) {
// set everything in dst to the new minimum
for (int row = startRow; row < endRow; ++row) {
Arrays.fill(dstGrid[row], dstMin);
}
} else {
final float f = dstRange / srcRange;
for (int row = startRow; row < endRow; ++row) {
float[] srcRow = srcGrid[row];
float[] dstRow = dstGrid[row];
for (int col = 0; col < nCols; ++col) {
dstRow[col] = (srcRow[col] - srcMin) * f + dstMin;
}
}
}
}
public float getNewMin() {
return dstMin;
}
public void setNewMin(float newMin) {
this.dstMin = newMin;
}
public float getNewMax() {
return dstMax;
}
public void setNewMax(float newMax) {
this.dstMax = newMax;
}
final public void setRange(float newMin, float newMax) {
this.dstMin = newMin;
this.dstMax = newMax;
}
final public void setRange(float[] minMax) {
this.dstMin = minMax[0];
this.dstMax = minMax[1];
}
@Override
public String getName() {
return "Scale To Range";
}
}