public static Tuple <double, double> GetOptimalRange([CanBeNull] Lut lut) { if (lut == null) { return(null); } lut.UpdateBoundingBox(); var threshold = Math.Min(lut.MaxY, 1d) * (1d - OptionRangeThreshold); double?fromX = null, toX = null; lut.ForEach((x, y) => { if (y >= threshold) { if (!fromX.HasValue) { fromX = x; } toX = x; } }); return(fromX.HasValue && toX.HasValue ? new Tuple <double, double>(fromX ?? 0d, toX ?? 0d) : null); }
public static Lut TorqueToPower(Lut torque, int detalization = 100) { torque.UpdateBoundingBox(); var startFrom = torque.MinX; var limit = torque.MaxX; var result = new Lut(); var previousTorquePoint = 0; var previousRpm = 0d; for (var i = 0; i <= detalization; i++) { var rpm = detalization == 0 ? limit : (limit - startFrom) * i / detalization + startFrom; for (var j = previousTorquePoint; j < torque.Count; j++) { var p = torque[j]; if (p.X > rpm) { previousTorquePoint = j > 0 ? j - 1 : 0; break; } if ((i == 0 || p.X > previousRpm) && p.X < rpm) { result.Add(new LutPoint(p.X, TorqueToPower(p.Y, p.X))); } } result.Add(new LutPoint(rpm, TorqueToPower(torque.InterpolateLinear(rpm), rpm))); previousRpm = rpm; } return result.Optimize(); }
public void CubicInterpolationExtra() { var lut = new Lut { new LutPoint(-0.009994, 1.059), new LutPoint(-0.004998, 1.059), new LutPoint(0, 1.060), new LutPoint(0.005002, 1.063), new LutPoint(0.010007, 1.065), new LutPoint(0.015014, 1.068), new LutPoint(0.020024, 1.073), new LutPoint(0.025039, 1.078), new LutPoint(0.030057, 1.083), new LutPoint(0.03508, 1.089), new LutPoint(0.040106, 1.095), }; lut.UpdateBoundingBox(); var minX = lut.MinX; var sizeX = lut.MaxX - lut.MinX; var minY = lut.MinY; var sizeY = lut.MaxY - lut.MinY; lut = new Lut(lut.Select(x => new LutPoint((x.X - minX) / sizeX, (x.Y - minY) / sizeY))); lut.UpdateBoundingBox(); BuildChart(s => { var min = lut.MinX; var size = lut.MaxX - lut.MinX; for (var i = 0d; i <= 1d; i += 0.003) { var x = lut.MinX + size * i; s.Points.Add(new DataPoint(x, lut.InterpolateLinear(x))); } s.Color = Color.Black; }, s => { var min = lut.MinX; var size = lut.MaxX - lut.MinX; for (var i = 0d; i <= 1d; i += 0.003) { var x = lut.MinX + size * i; s.Points.Add(new DataPoint(x, lut.InterpolateCubic(x))); } s.Color = Color.Green; }); // interpolation itself #if !DEBUG Assert.IsTrue(lut.InterpolateCubic(0.003) < lut.InterpolateCubic(0.001)); #endif }
public void MinMax() { var lut = new Lut(); lut.UpdateBoundingBox(); Assert.AreEqual(double.NaN, lut.MinX); Assert.AreEqual(double.NaN, lut.MinY); Assert.AreEqual(double.NaN, lut.MaxX); Assert.AreEqual(double.NaN, lut.MaxY); lut.Add(new LutPoint(1d, 1d)); lut.UpdateBoundingBox(); Assert.AreEqual(1d, lut.MinX); Assert.AreEqual(1d, lut.MinY); Assert.AreEqual(1d, lut.MaxX); Assert.AreEqual(1d, lut.MaxY); lut.Add(new LutPoint(-1d, 2d)); lut.UpdateBoundingBox(); Assert.AreEqual(-1d, lut.MinX); Assert.AreEqual(1d, lut.MinY); Assert.AreEqual(1d, lut.MaxX); Assert.AreEqual(2d, lut.MaxY); }
public GraphData(Lut points) { _points = points; if (Points.Count == 0) { MinX = MaxX = MinY = MaxY = 0.0; _normalizedValuesArray = new List<Point>(); return; } _points.UpdateBoundingBox(); MinX = _points.MinX; MaxX = _points.MaxX; MinY = _points.MinY; MaxY = _points.MaxY; _normalizedValuesArray = Points.Select(x => new Point((x.X - MinX) / (MaxX - MinX), (x.Y - MinY) / (MaxY - MinY))).ToList(); }
public GraphData([NotNull] Lut points) { _points = points; if (Points.Count == 0) { MinX = MaxX = MinY = MaxY = 0.0; _normalizedValuesArray = new List <Point>(); return; } _points.UpdateBoundingBox(); MinX = _points.MinX; MaxX = _points.MaxX; MinY = _points.MinY; MaxY = _points.MaxY; }