package ika.geo.grid; import ika.geo.GeoGrid; /** * * @author jenny */ public class CurvatureCombineOperator extends ThreadedGridOperator { private float scale; private GeoGrid maxCurv; private float maxCurvMax, maxCurvMin; @Override public String getName() { return "Plan Curvature Combination"; } @Override public void operate(GeoGrid planCurv, GeoGrid dst, int startRow, int endRow) { float[][] planCurvGrid = planCurv.getGrid(); float[][] maxCurvGrid = maxCurv.getGrid(); float[][] dstGrid = dst.getGrid(); final int nCols = planCurv.getCols(); float[] planCurvMinMax = planCurv.getMinMax(); final float scalePos = scale / Math.abs(planCurvMinMax[1]); final float scaleNeg = scale / Math.abs(planCurvMinMax[0]); final float maxCurvRange = maxCurvMax - maxCurvMin; final float f = 1f / maxCurvRange; for (int row = startRow; row < endRow; ++row) { float[] planCurvRow = planCurvGrid[row]; float[] maxCurvRow = maxCurvGrid[row]; float[] dstRow = dstGrid[row]; for (int col = 0; col < nCols; ++col) { // scale plan curvature to -scale..+scale, 0 remains 0. final float pc = planCurvRow[col]; final float scaledPlanCurv = pc > 0 ? pc * scalePos : pc * scaleNeg; // scale maximum curvature to range 0..1 final float scaledMaxCurv = (maxCurvRow[col] - maxCurvMin) * f; dstRow[col] = scaledPlanCurv + scaledMaxCurv; } } } /** * @param scale the scale to set */ public void setScale(float scale) { this.scale = scale; } /** * @param maxCurv the maxCurv to set */ public void setMaxCurv(GeoGrid maxCurv) { this.maxCurv = maxCurv; float[] maxCurvMinMax = maxCurv.getMinMax(); this.maxCurvMin = maxCurvMinMax[0]; this.maxCurvMax = maxCurvMinMax[1]; } }