Esempio n. 1
0
        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();
        }
Esempio n. 2
0
        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
        }
Esempio n. 3
0
        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));
        }
Esempio n. 4
0
        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));
        }