package extractors.hog;


/**
 * This class provides an implementation for the {@link GradientFieldGenerator}. It generates a gradient
 * field by approximation of the second derivative in each dimension.
 * 
 */
public class SecondGradients 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 = 2; x < field.length - 2; x++) {
			for (int y = 2; y < field[x].length - 2; y++) {
				for (int z = 2; z < field[x][y].length - 2; z++) {
					double dx = -2 * field[x][y][z] + field[x - 2][y][z] + field[x + 2][y][z];
					double dy = -2 * field[x][y][z] + field[x][y - 2][z] + field[x][y + 2][z];
					double dz = -2 * field[x][y][z] + field[x][y][z - 2] + field[x][y][z + 2];

					gradientField[x - 2][y - 2][z - 2] = new Gradient(dx, dy, dz);
				}
			}
		}

		return gradientField;
	}

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

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

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

}
