package edu.harvard.mcb.leschziner.particlefilter; import java.awt.geom.AffineTransform; import edu.harvard.mcb.leschziner.core.Particle; import edu.harvard.mcb.leschziner.core.ParticleFilter; /** * Rotates a particle by a fixed amount * * @author spartango * */ public class Rotator implements ParticleFilter { /** * */ private static final long serialVersionUID = -6677740995143021586L; // The angle of the rotation to be performed in radians private double radianAngle; /** * Build a rotator that rotates particles by a certain number of degrees * * @param angle * in degrees */ public Rotator(double angle) { // Degrees radianAngle = Math.toRadians(angle); } private static AffineTransform generateTransform(double angle, int size) { return AffineTransform.getRotateInstance(angle, size / 2.0, size / 2.0); } /** * Rotate a particle, generating a new, rotated particle */ @Override public Particle filter(Particle target) { AffineTransform transform = generateTransform(radianAngle, target.getSize()); return Particle.transform(target, transform); } /** * Un-rotate a particle by inverting the rotation angle * * @param target * particle * @return rotated particle */ public Particle reverseFilter(Particle target) { AffineTransform transform = generateTransform(-radianAngle, target.getSize()); return Particle.transform(target, transform); } }