package advanced.gestureSound.gestures.qualities;
import java.util.List;
import org.mt4j.input.inputData.AbstractCursorInputEvt;
import org.mt4j.input.inputData.InputCursor;
import Jama.Matrix;
import advanced.gestureSound.gestures.GestureEngine;
import advanced.gestureSound.gestures.filters.KalmanFilter;
public class Curvature extends Quality {
KalmanFilter filter;
public Curvature(GestureEngine engine) {
super(engine);
filter = KalmanFilter.buildKF(0.1, 5, 10);
filter.setX(new Matrix(new double[][]{{0.01}, {0.01}, {0.01}}));
filter.predict();
}
@Override
public void update(InputCursor in) {
float val=0.0f;
val = (float) (findCurvature(in)/(Math.PI)/in.getVelocityVector().w);
System.out.println("Curvature: "+val);
filter.correct(new Matrix(new double[][]{{val}}));
filter.predict();
//System.out.println("0:"+filter.getX().get(0,0));
//System.out.println("1:"+filter.getX().get(1,0));
//System.out.println("2:"+filter.getX().get(2,0));
val = (float) filter.getX().get(2,0);
//System.out.println("Curvature: "+val);
engine. gestureQualityChange("curvature", val);
}
private float findCurvature(InputCursor in) {
if (in.getEventCount() < 3)
return 0.0f;
List<AbstractCursorInputEvt> events = in.getEvents();
AbstractCursorInputEvt posEvt = events.get(events.size()-1);
AbstractCursorInputEvt prev = events.get(events.size()-2);
AbstractCursorInputEvt prev2 = events.get(events.size()-3);
if (prev == null)
return 0;
if (prev2 == null)
return 0;
return getAngle(posEvt, prev)-getAngle(prev, prev2);
}
private float getAngle(AbstractCursorInputEvt ev1, AbstractCursorInputEvt ev2) {
return (float) Math.atan2(ev1.getPosX()-ev2.getPosX(), ev1.getPosY()-ev2.getPosY());
}
}