package org.openpixi.pixi.physics.movement.boundary;

import org.openpixi.pixi.physics.force.Force;
import org.openpixi.pixi.physics.particles.Particle;
import org.openpixi.pixi.physics.solver.Solver;

/**
 *  Reflects particle off the wall.
 *  Allows particle to be outside of the simulation area!
 */
public class HardwallBoundary extends ParticleBoundary {

	public HardwallBoundary(double xoffset, double yoffset) {
		super(xoffset, yoffset);
	}

	/**
	 * Since we are modifying the velocity we need to bring it from the half step to whole step.
	 */
	@Override
	public void apply(Solver solver, Force force, Particle particle, double timeStep) {
		solver.complete(particle, force, timeStep);

		if (xoffset < 0) {
			particle.setVx(Math.abs(particle.getVx()));
		}
		else if (xoffset > 0) {
			particle.setVx(-Math.abs(particle.getVx()));
		}
		if (yoffset < 0) {
			particle.setVy(Math.abs(particle.getVy()));
		}
		else if (yoffset > 0) {
			particle.setVy(-Math.abs(particle.getVy()));
		}

		solver.prepare(particle, force, timeStep);
	}
}
