private void CalculateTimes(double s, int trajectoryInstance, out double tj, out double ta, out double tv)
        {
            switch (trajectoryInstance)
            {
            case 1:
            case 3:
                tj = Math.Sqrt(VelocityMax / JerkMax);
                ta = tj;
                tv = s / VelocityMax;
                return;

            case 2:
            case 4:
                tj = MathematicTools.GetCubeRoot(s / (2 * JerkMax));
                ta = tj;
                tv = 2 * tj;
                return;

            case 5:
                tj = AccelerationMax / JerkMax;
                ta = VelocityMax / AccelerationMax;
                tv = s / VelocityMax;
                return;

            case 6:
                tj = AccelerationMax / JerkMax;
                ta = 0.5 * (Math.Sqrt((4 * s * JerkMax * JerkMax + AccelerationMax * AccelerationMax * AccelerationMax) / (AccelerationMax * JerkMax * JerkMax)) - AccelerationMax / JerkMax);
                tv = ta + tj;
                return;

            default:
                throw new ArgumentOutOfRangeException($"TrajectoryInstance must be between 1 and 6");
            }
        }
Example #2
0
        public void CubeRootWorking()
        {
            var random = new Random((int)DateTime.Now.Ticks);

            for (var i = 0; i < 10; i++)
            {
                var number = random.NextDouble() * 1e6;
                var root   = MathematicTools.GetCubeRoot(Math.Pow(number, 3));

                Assert.Equal(number, root, 5);
            }
        }
        private static double SolveCubicEquation(double A, double B, double C, double D)
        {
            var p             = (9 * A * C - 3 * B * B) / (9 * A * A);
            var q             = (2 * B * B * B - 9 * A * B * C + 27 * A * A * D) / (27 * A * A * A);
            var diskriminante = (27 * A * A * D * D + 4 * B * B * B * D - 18 * A * B * C * D + 4 * A * C * C * C - B * B * C * C) / (108 * A * A * A * A);
            var d1Mats        = double.NaN;

            if (true) // p < 0
            {
                var h1 = Math.Sqrt(-p * 4 / 3);
                var h2 = -q / 2 * Math.Sqrt(-27.0 / (p * p * p));
                if (Math.Abs(h2) > 1)
                {
                    // ERROR!
                }
                var h3 = 1.0 / 3 * Math.Acos(h2);
                var h4 = B / (3 * A);
                if (diskriminante < 0)
                {
                    var x2 = -h1 *Math.Cos(h3 + Math.PI / 3) - h4;

                    var x1 = h1 * Math.Cos(h3) - h4;
                    var x3 = -h1 *Math.Cos(h3 - Math.PI / 3) - h4;

                    if (Math.Abs(x1) < Math.Abs(x2) && Math.Abs(x1) < Math.Abs(x3))
                    {
                        d1Mats = x1;
                    }
                    else if (Math.Abs(x2) < Math.Abs(x1) && Math.Abs(x2) < Math.Abs(x3))
                    {
                        d1Mats = x2;
                    }
                    else
                    {
                        d1Mats = x3;
                    }
                }
                else if (diskriminante == 0 && p == 0)
                {
                    d1Mats = -B / (3 * A);
                }
                else if (diskriminante == 0 && p != 0)
                {
                    var x1 = (B * B * B - 4 * A * B * C + 9 * A * A * D) / (3 * A * A * C - A * B * B);
                    var x2 = (A * B * C - 9 * A * A * D) / (6 * A * A * C - 2 * A * B * B);
                    if (Math.Abs(x1) < Math.Abs(x2))
                    {
                        d1Mats = x1;
                    }
                    else
                    {
                        d1Mats = x2;
                    }
                }
                else if (diskriminante > 0)
                {
                    var u = -(q / 2) + Math.Sqrt(diskriminante);
                    if (u >= 0)
                    {
                        u = MathematicTools.GetCubeRoot(u);
                    }
                    else
                    {
                        u = -MathematicTools.GetCubeRoot(-u);
                    }
                    var v = -(q / 2) - Math.Sqrt(diskriminante);
                    if (v >= 0)
                    {
                        v = MathematicTools.GetCubeRoot(v);
                    }
                    else
                    {
                        v = -MathematicTools.GetCubeRoot(-v);
                    }

                    d1Mats = u + v - B / (3 * A);
                }
            }

            return(d1Mats);
        }