package extractors.hog;


/**
 * This class provides an implementation for the {@link GradientFieldGenerator}. It generates a gradient
 * field by using a simple [-1,0,1] mask. The size of the resulting gradient field is the same as the one of
 * the given distance field. Borders are left with null.
 * 
 */
public class SimpleGradientsNullBorders implements GradientFieldGenerator {

	@Override
	public Gradient[][][] generateGradientField(double[][][] field) {
		Gradient[][][] gradientField = new Gradient[field.length][field[0].length][field[0][0].length];

		for (int x = 0; x < field.length; x++) {
			for (int y = 0; y < field[x].length; y++) {
				for (int z = 0; z < field[x][y].length; z++) {
					if (x == 0 || x == field.length - 1 || y == 0 || y == field[x].length - 1 || z == 0
							|| z == field[x][y].length - 1) {
						gradientField[x][y][z] = null;
					} else {
						double dx = field[x + 1][y][z] - field[x - 1][y][z];
						double dy = field[x][y + 1][z] - field[x][y - 1][z];
						double dz = field[x][y][z + 1] - field[x][y][z - 1];
						gradientField[x][y][z] = new Gradient(dx, dy, dz);
					}
				}
			}
		}
		return gradientField;
	}

	@Override
	public int getResx(DistanceFieldGenerator dfg) {
		return dfg.getResx();
	}

	@Override
	public int getResy(DistanceFieldGenerator dfg) {
		return dfg.getResy();
	}

	@Override
	public int getResz(DistanceFieldGenerator dfg) {
		return dfg.getResz();
	}

}
