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 LinearInterpolation() { var lut = new Lut { new LutPoint(1d, 1d), new LutPoint(2d, 1d), new LutPoint(4d, 5d), new LutPoint(5d, 3d), }; // points Assert.AreEqual(1d, lut.InterpolateLinear(1d)); Assert.AreEqual(1d, lut.InterpolateLinear(2d)); Assert.AreEqual(3d, lut.InterpolateLinear(5d)); // clamping Assert.AreEqual(1d, lut.InterpolateLinear(-1d)); Assert.AreEqual(3d, lut.InterpolateLinear(5.7d)); // interpolation itself Assert.AreEqual(1d, lut.InterpolateLinear(1.5d)); Assert.AreEqual(2d, lut.InterpolateLinear(2.5d)); Assert.AreEqual(3d, lut.InterpolateLinear(3d)); Assert.AreEqual(4d, lut.InterpolateLinear(4.5d)); }