public override double IntervalPositioning(ValueSection section, IVariable variable, int step) { var variable_data = (variable as Value <DateTime>).Data; variable = new Value <DateTime>(variable_data.AddMilliseconds(MinUnit * step)); var data = (variable as Value <DateTime>).Data; var left = (section.Left as Value <DateTime>).Data; var right = (section.Right as Value <DateTime>).Data; if (data < left || data > right) { return(double.NaN); } List <ValueSection> total = GetSectionsExcept(section); var totalMilliseconds = 0.0; var index = 0; var data_index = -1; foreach (var item in total) { if (item.Contains(variable)) { data_index = index; } var left_except = (item.Left.ValueData("") as Value <DateTime>).Data; var right_except = (item.Right.ValueData("") as Value <DateTime>).Data; totalMilliseconds += (right_except - left_except).TotalMilliseconds; index++; } if (total.Count == 1 && total[0].Equals(section)) { return((data - left).TotalMilliseconds / totalMilliseconds); } else if (total.Count == 0) { return(double.NaN); } else { var sum = total.Take(data_index).Select(it => ((it.Right.ValueData("") as Value <DateTime>).Data - (it.Left.ValueData("") as Value <DateTime>).Data).TotalMilliseconds / totalMilliseconds).Sum(); var current_left = (total[data_index].Left.ValueData("") as Value <DateTime>).Data; var current_right = (total[data_index].Right.ValueData("") as Value <DateTime>).Data; return((data - current_left).TotalMilliseconds / totalMilliseconds + sum); } }
public static List <RatioSection> GetSectionsFromRatioCroodAndSection(ValueSection range_section, DiscreteAxis xAxis, bool isInterregional, List <double> ratios, List <IVariable> data) { List <RatioSection> list = new List <RatioSection>(); ratios = new List <double>(ratios); var ratios_temp = ratios; var last = data.Last(); if (data.Count == 1 && range_section.Contains(last)) { var position = xAxis.IntervalPositioning(range_section, last, 1); ratios.Add(position); } if (isInterregional) { ratios.Insert(0, 0); for (int i = 0; i < ratios.Count - 1; i++) { var item = ratios[i]; RatioSection section = new RatioSection(); section.Left = item; section.Right = ratios[i + 1]; section.Current = (section.Left + section.Right) / 2; section.CurrentData = i < data.Count ? data[i] : Value.Bad; list.Add(section); } } else { for (int i = 0; i < ratios_temp.Count; i++) { var item = ratios[i]; RatioSection section = new RatioSection(); section.Current = item;// section.Left + section.Right - section.Left / 2; section.CurrentData = i < data.Count ? data[i] : Value.Bad; section.Left = i - 1 >= 0 ? (ratios[i - 1] + item) / 2 : item - ratios[i + 1] / 2; section.Right = i + 1 < ratios.Count ? (ratios[i + 1] + item) / 2 : item + ratios[i - 1] / 2; list.Add(section); } } return(list); }
public List <ValueSection> GetSectionsExcept(ValueSection section) { var total = new List <ValueSection>(); if (ExceptSections != null && ExceptSections.Count > 0) { foreach (var item in ExceptSections) { total.AddRange(section.Except(item)); } } else { return(new List <ValueSection>() { section }); } return(total); }
public override double IntervalPositioning(ValueSection section, IVariable variable, int step) { return(double.NaN); }