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. It reduces the size of the distance field by 2 in each dimension.
 * 
 */
public class SimpleGradients implements GradientFieldGenerator {

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

		for (int x = 1; x < field.length - 1; x++) {
			for (int y = 1; y < field[x].length - 1; y++) {
				for (int z = 1; z < field[x][y].length - 1; z++) {
					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 - 1][y - 1][z - 1] = new Gradient(dx, dy, dz);
				}
			}
		}
		return gradientField;
	}

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

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

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