summaryrefslogtreecommitdiff
path: root/grapher/Models/Calculations/AccelCalculator.cs
blob: 2d8d89225fd53a2f1c6c9d7f15c00866ca5f350a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace grapher.Models.Calculations
{
    public static class AccelCalculator
    {
        public struct MagnitudeData
        {
            public double magnitude;
            public int x;
            public int y;
        }

        public static ReadOnlyCollection<MagnitudeData> Magnitudes = GetMagnitudes();

        public static void Calculate(AccelData data, ManagedAccel accel, double starter)
        {
            data.Clear();

            double lastInputMagnitude = 0;
            double lastOutputMagnitude = 0;

            foreach (var magnitudeData in Magnitudes)
            {
                var output = accel.Accelerate(magnitudeData.x, magnitudeData.y, 1);

                var outMagnitude = Magnitude(output.Item1, output.Item2);
                var ratio = magnitudeData.magnitude > 0 ? outMagnitude / magnitudeData.magnitude : starter;

                var inDiff = magnitudeData.magnitude - lastInputMagnitude;
                var outDiff = outMagnitude - lastOutputMagnitude;
                var slope = inDiff > 0 ? outDiff / inDiff : starter;

                if (!data.OrderedAccelPoints.ContainsKey(magnitudeData.magnitude))
                {
                    data.OrderedAccelPoints.Add(magnitudeData.magnitude, ratio);
                }

                if (!data.OrderedVelocityPoints.ContainsKey(magnitudeData.magnitude))
                {
                    data.OrderedVelocityPoints.Add(magnitudeData.magnitude, outMagnitude);
                }

                if (!data.OrderedGainPoints.ContainsKey(magnitudeData.magnitude))
                {
                    data.OrderedGainPoints.Add(magnitudeData.magnitude, slope);
                }

                lastInputMagnitude = magnitudeData.magnitude;
                lastOutputMagnitude = outMagnitude;
            }

        }

        public static ReadOnlyCollection<MagnitudeData> GetMagnitudes()
        {
            var magnitudes = new List<MagnitudeData>();
            for (int i = 0; i < 100; i++)
            {
                for (int j = 0; j <= i; j++)
                {
                    MagnitudeData magnitudeData;
                    magnitudeData.magnitude = Magnitude(i, j);
                    magnitudeData.x = i;
                    magnitudeData.y = j;
                    magnitudes.Add(magnitudeData);
                }
            }

            magnitudes.Sort((m1, m2) => m1.magnitude.CompareTo(m2.magnitude));

            return magnitudes.AsReadOnly();
        }

        public static double Magnitude(int x, int y)
        {
            return Math.Sqrt(x * x + y * y);
        }

        public static double Magnitude(double x, double y)
        {
            return Math.Sqrt(x * x + y * y);
        }

    }
}