protected double legibilityScore(Axis data, AxisLabeler.Options options) { return((legibility_format(data, options) + legibility_fontSize(data, options) + legibility_orientation(data, options) + legibility_overlap(data, options)) / 4); }
public override Axis format(List <Axis> list, List <Format> formats, AxisLabeler.Options options, Func <Axis, double> ScoreAxis, double bestScore = double.NegativeInfinity) { Axis result = options.DefaultAxis(); foreach (Axis data in list) { foreach (Format format in formats) { Axis f = data.Clone(); f.formatStyle = format; f.legibility = legibilityScoreMax(f, options); if (ScoreAxis(f) >= bestScore) { Tuple <IEnumerable <string>, string> labels = f.formatStyle.FormalLabels(f.labels.Select(x => (object)(decimal)x.Item1)); f.labels = f.labels.Select(x => x.Item1).Zip(labels.Item1, (a, b) => new Tuple <decimal, string>(a, b)).ToList(); f.axisTitleExtension = labels.Item2; f.legibility = legibilityScore(f, options); f.score = ScoreAxis(f); if (f.score >= bestScore) { bestScore = f.score; result = f; } } } } return(result); }
protected double legibility_fontSize(Axis data, AxisLabeler.Options options) { double fsmin = fontSizes.Min(); return((data.fontSize > options.fontSize || data.fontSize < fsmin) ? double.NegativeInfinity : ((data.fontSize == options.fontSize) ? 1 : 0.2 * ((double)(data.fontSize - fsmin + 1) / (options.fontSize - fsmin)))); }
public AxisLayout(bool yAxis, Vector symbol, Range dataRange, Range visibleRange, Func<string, decimal, Axis, RectangleF> ComputeLabelRect, RectangleF screen) { this.options = new AxisLabeler.Options(); this.options.direction = yAxis ? Axis.Direction.VERTICAL : Axis.Direction.HORIZONTAL; this.options.symbol = symbol; this.options.dataRange = dataRange; this.options.visibleRange = visibleRange; this.options.fontSize = (int)AxisFontSize; this.options.ComputeLabelRect = ComputeLabelRect; this.options.screen = screen; }
protected double legibility_overlap(Axis data, AxisLabeler.Options options) { // compute overlap score double em = ems[data.fontSize]; List <RectangleF> rects = data.labels.Select(s => options.ComputeLabelRect(s.Item2, s.Item1, data)).ToList(); // takes adjacent pairs of rectangles double overlap = rects.Take(rects.Count() - 1).Zip(rects.Skip(1), (a, b) => { double dist = (options.direction == Axis.Direction.HORIZONTAL) ? b.Left - a.Right : a.Top - b.Bottom; return(Math.Min(1, 2 - (1.5 * em) / Math.Max(0, dist))); }).Min(); return(overlap); }
public List <Axis> varyFontSize(List <Axis> list, AxisLabeler.Options options) { List <Axis> possibilities = new List <Axis>(); // Reverse to produce the font sizes in decreasing order of goodness foreach (int size in fontSizes.Where(s => s <= options.fontSize).Reverse()) { foreach (Axis data in list) { Axis option = data.Clone(); option.fontSize = size; possibilities.Add(option); } } return(possibilities); }
public abstract Axis format(List <Axis> list, List <Format> formats, AxisLabeler.Options options, Func <Axis, double> ScoreAxis, double bestScore = double.NegativeInfinity);
protected double legibility_orientation(Axis data, AxisLabeler.Options options) { return(data.labelDirection == Axis.Direction.HORIZONTAL ? 1.0 : -0.5); }
protected double legibility_format(Axis data, AxisLabeler.Options options) { double format = data.formatStyle.Score(data.labels.Select(x => (object)x.Item1)); return(format); }