using System;
using System.Drawing;
using System.Drawing.Imaging;
using System.Collections.Generic;
namespace Assistance {
public class Guideline {
public static readonly Pen pen = Pens.LightGray;
public static readonly Pen penActive = Pens.DeepSkyBlue;
public static readonly double snapLenght = 20.0;
public static readonly double snapScale = 1.0;
public virtual Point transformPoint(Point p) {
return p;
}
public virtual void draw(Graphics g, bool active) { }
public void draw(Graphics g) {
draw(g, false);
}
public double calcTrackWeight(Track track) {
if (track.points.Count < 2)
return double.PositiveInfinity;
double sumWeight = 0.0;
double sumLength = 0.0;
double sumDeviation = 0.0;
for(int i = 1; i < track.points.Count; ++i) {
Point point = track.points[i];
double length = (point - track.points[i - 1]).len();
sumLength += length;
double weight = Geometry.logNormalDistribuitionUnscaled(sumLength, snapLenght, snapScale);
sumWeight += weight;
double deviation = (transformPoint(point) - point).len();
sumDeviation += weight*deviation;
}
return sumDeviation/sumWeight;
}
public Track modifyTrack(Track track) {
Track t = new Track();
foreach(Point p in track.points)
t.points.Add( transformPoint(p) );
return t;
}
public static Guideline findBest(List<Guideline> guidelines, Track track) {
double bestWeight = double.PositiveInfinity;
Guideline best = null;
foreach(Guideline guideline in guidelines) {
double weight = guideline.calcTrackWeight(track);
if (weight < bestWeight) {
bestWeight = weight;
best = guideline;
}
}
return best;
}
}
}