private static void Finish(Lut values, string data, int index, int line, ref double key, ref int started, ref int malformed) { if (started != -1) { if (double.IsNaN(key)) { if (malformed == -1) malformed = line; } else { double value; if (FlexibleParser.TryParseDouble(data.Substring(started, index - started), out value)) { values.Add(new LutPoint(key, value)); } else { if (malformed == -1) malformed = line; } key = double.NaN; } started = -1; } else if (!double.IsNaN(key)) { key = double.NaN; } }
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(); }
private static void Finish(Lut values, string data, int index, int line, ref double key, ref int started, ref int malformed) { if (started != -1) { if (double.IsNaN(key)) { if (malformed == -1) { malformed = line; } } else { double value; if (FlexibleParser.TryParseDouble(data.Substring(started, index - started), out value)) { values.Add(new LutPoint(key, value)); } else { if (malformed == -1) { malformed = line; } } key = double.NaN; } started = -1; } else if (!double.IsNaN(key)) { key = double.NaN; } }
private static void Finish(Lut values, string data, int index, int line, ref double key, ref int started, ref int malformed) { if (started != -1) { if (double.IsNaN(key)) { if (malformed == -1) { AcToolsLogging.Write($@"Key is NaN at {line}"); malformed = line; } } else { if (FlexibleParser.TryParseDouble(data.Substring(started, index - started), out var value)) { values.Add(new LutPoint(key, value)); } else { if (malformed == -1) { AcToolsLogging.Write($@"Failed to parse key “{data.Substring(started, index - started)}” at {line}"); malformed = line; } } key = double.NaN; } started = -1; } else if (!double.IsNaN(key)) { key = double.NaN; } }
private static Lut ConvertToValues(JArray obj) { var values = new Lut(); if (obj == null) return values; foreach (var entry in obj.OfType<JArray>()) { double x, y; if (FlexibleParser.TryParseDouble(Convert.ToString(entry[0], CultureInfo.InvariantCulture), out x) && FlexibleParser.TryParseDouble(Convert.ToString(entry[1], CultureInfo.InvariantCulture), out y)) { values.Add(new LutPoint(x, y)); } } return values; }
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); }
private static Lut ConvertToValues(JArray obj) { var values = new Lut(); if (obj == null) { return(values); } foreach (var entry in obj.OfType <JArray>().Where(x => x.Count == 2)) { if (FlexibleParser.TryParseDouble(Convert.ToString(entry[0], CultureInfo.InvariantCulture), out var x) && FlexibleParser.TryParseDouble(Convert.ToString(entry[1], CultureInfo.InvariantCulture), out var y)) { values.Add(new LutPoint(x, y)); } } return(values); }
public static Lut LoadCarTorque(IDataWrapper data, bool considerLimiter = true, int detalization = 100) { /* read torque curve and engine params */ var torqueFile = data.GetLutFile("power.lut"); if (torqueFile.IsEmptyOrDamaged()) throw new FileNotFoundException("Cannot load power.lut", "data/power.lut"); var engine = data.GetIniFile("engine.ini"); if (engine.IsEmptyOrDamaged()) throw new FileNotFoundException("Cannot load engine.ini", "data/engine.ini"); /* prepare turbos and read controllers */ var turbos = ReadTurbos(engine); for (var i = 0; i < turbos.Count; i++) { turbos[i].Controllers = ReadControllers(data.GetIniFile($"ctrl_turbo{i}.ini")); } /* prepare torque curve and limits */ var torque = torqueFile.Values; torque.UpdateBoundingBox(); var limit = considerLimiter && engine.ContainsKey("ENGINE_DATA") ? engine["ENGINE_DATA"].GetDouble("LIMITER", torque.MaxX) : torque.MaxX; var startFrom = considerLimiter ? 0d : torque.MinX; /* build smoothed line */ 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 && p.X >= 0) { result.Add(new LutPoint(p.X, ConsiderTurbo(turbos, p.X, p.Y))); } } var baseTorque = torque.InterpolateLinear(rpm); result.Add(new LutPoint(rpm, ConsiderTurbo(turbos, rpm, baseTorque))); previousRpm = rpm; } return result.Optimize(); }