Blame mono/Assistance/Guideline.cs

Ivan Mahonin cfceb0
using System;
Ivan Mahonin cfceb0
using System.Collections.Generic;
Ivan Mahonin b82ef4
using Assistance.Drawing;
Ivan Mahonin cfceb0
Ivan Mahonin cfceb0
namespace Assistance {
Ivan Mahonin cfceb0
	public class Guideline {
Ivan Mahonin b82ef4
		public static readonly Pen pen = new Pen("Light Gray");
Ivan Mahonin b82ef4
		public static readonly Pen penActive = new Pen("Deep Sky Blue");
Ivan Mahonin cfceb0
		public static readonly double snapLenght = 20.0;
Ivan Mahonin cfceb0
		public static readonly double snapScale = 1.0;
Ivan Mahonin 0f2bf8
		public static readonly double maxLenght = 20.0*snapLenght*snapScale;
Ivan Mahonin cfceb0
	
Ivan Mahonin 702257
		public virtual Track.Point transformPoint(Track.Point point)
Ivan Mahonin 589f9a
			{ return point; }
Ivan Mahonin cfceb0
		
Ivan Mahonin b82ef4
		public virtual void draw(Cairo.Context context, bool active) { }
Ivan Mahonin cfceb0
Ivan Mahonin 589f9a
		public void draw(Cairo.Context context)
Ivan Mahonin 589f9a
			{ draw(context, false); }
Ivan Mahonin cfceb0
		
Ivan Mahonin cfceb0
		public double calcTrackWeight(Track track) {
Ivan Mahonin 72d2fd
			if (track.count < 1)
Ivan Mahonin cfceb0
				return double.PositiveInfinity;
Ivan Mahonin cfceb0
			double sumWeight = 0.0;
Ivan Mahonin cfceb0
			double sumLength = 0.0;
Ivan Mahonin cfceb0
			double sumDeviation = 0.0;
Ivan Mahonin cfceb0
			
Ivan Mahonin 72d2fd
			Point prev = track.getFirst().position;
Ivan Mahonin 702257
			foreach(Track.Point tp in track.points) {
Ivan Mahonin 702257
				Point p = tp.position;
Ivan Mahonin d13872
				double length = (p - prev).len();
Ivan Mahonin cfceb0
				sumLength += length;
Ivan Mahonin cfceb0
				
Ivan Mahonin d13872
				double midStepLength = sumLength - 0.5*length;
Ivan Mahonin d13872
				if (midStepLength > Geometry.precision) {
Ivan Mahonin d13872
					double weight = length*Geometry.logNormalDistribuitionUnscaled(midStepLength, snapLenght, snapScale);
Ivan Mahonin d13872
					sumWeight += weight;
Ivan Mahonin cfceb0
				
Ivan Mahonin 702257
					Track.Point ntp = transformPoint(tp);
Ivan Mahonin 702257
					double deviation = (ntp.position - p).len();
Ivan Mahonin d13872
					sumDeviation += weight*deviation;
Ivan Mahonin d13872
				}
Ivan Mahonin d13872
				prev = p;
Ivan Mahonin cfceb0
			}
Ivan Mahonin d13872
			if (sumWeight < Geometry.precision)
Ivan Mahonin d13872
				return double.PositiveInfinity;
Ivan Mahonin cfceb0
			return sumDeviation/sumWeight;
Ivan Mahonin cfceb0
		}
Ivan Mahonin cfceb0
Ivan Mahonin cfceb0
		public static Guideline findBest(List<Guideline> guidelines, Track track) {
Ivan Mahonin 0f2bf8
			double bestWeight = 0.0;
Ivan Mahonin cfceb0
			Guideline best = null;
Ivan Mahonin cfceb0
			foreach(Guideline guideline in guidelines) {
Ivan Mahonin cfceb0
				double weight = guideline.calcTrackWeight(track);
Ivan Mahonin 0f2bf8
				if (best == null || weight < bestWeight) {
Ivan Mahonin cfceb0
					bestWeight = weight;
Ivan Mahonin cfceb0
					best = guideline;
Ivan Mahonin cfceb0
				}
Ivan Mahonin cfceb0
			}
Ivan Mahonin cfceb0
			return best;
Ivan Mahonin cfceb0
		}
Ivan Mahonin cfceb0
	}
Ivan Mahonin cfceb0
}
Ivan Mahonin cfceb0