Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2019
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.13 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Soccer.API;
  5. using Soccer.Commons;
  6.  
  7. namespace DefensiveSucces
  8. {
  9.     public class CentroidHandler
  10.     {
  11.         // class variables
  12.         private MatchData md;
  13.  
  14.         // Centroide
  15.         List<Tuple<double, double>> centroidHome = new List<Tuple<double, double>>();
  16.         List<Tuple<double, double>> centroidAway = new List<Tuple<double, double>>();
  17.         List<double> centroidPosDiff = new List<double>();
  18.         List<double> centroidVelo = new List<double>();
  19.         List<double> centroidAcc = new List<double>();
  20.         List<double> centroidHomeVelo = new List<double>();
  21.         List<double> centroidAwayVelo = new List<double>();
  22.         List<double> centroidVeloDiff;
  23.         List<double> centroidHomeAcc;
  24.         List<double> centroidAwayAcc;
  25.         List<double> centroidAccDiff;
  26.  
  27.  
  28.         public CentroidHandler(MatchData md)
  29.         {
  30.             this.md = md;
  31.             calculateCentroid();
  32.             calculateCentroidSpeed();
  33.             calculateCentroidAcceleration();
  34.            
  35.             centroidPositionalDifference();
  36.             centroidVeloDifference();
  37.             centroidAccDifference();
  38.  
  39.             Exporter.writeSimpleListWithTime(centroidPosDiff, "diff.csv", "Frame;m");
  40.             Exporter.writeSimpleListWithTime(MovingAverage(150, centroidVeloDiff.ToArray()).ToList(), "velo.csv", "Frame;v");
  41.             Exporter.writeSimpleListWithTime(centroidAccDiff, "acc.csv", "Frame;a");
  42.         }
  43.  
  44.         public void centroidVeloDifference()
  45.         {
  46.             List<double> temp = new List<double>();
  47.             for (int i = 0; i < centroidAwayVelo.Count; i++)
  48.             {
  49.                 double dif = centroidHomeVelo[i] - centroidAwayVelo[i];
  50.                 temp.Add(md.Moments[i].gamesection == GameSection.FirstHalf
  51.                     ? dif
  52.                     : -1 * dif); // Werte für 2. Spielhälfte umdrehen wegen Richtungswechsel
  53.             }
  54.  
  55.             //centroidVeloDiff = MovingAverage(150, temp.ToArray()).ToList();
  56.             centroidVeloDiff = temp;
  57.         }
  58.  
  59.         public void centroidAccDifference()
  60.         {
  61.             List<double> temp = new List<double>();
  62.  
  63.             for (int i = 0; i < centroidAwayAcc.Count; i++)
  64.             {
  65.                 double dif = centroidHomeAcc[i] - centroidAwayAcc[i];
  66.                 temp.Add(dif);
  67.             }
  68.            
  69.             //centroidAccDiff = MovingAverage(50, temp.ToArray()).ToList();
  70.             centroidAccDiff = temp;
  71.         }
  72.  
  73.         public void calculateCentroid()
  74.             // erstellt die Centroide beider Mannschaften
  75.         {
  76.             for (int i = 0; i < md.Moments.Length; i++)
  77.                 // Alle Frames durchgehen
  78.             {
  79.                 // Berechnungen Heimmannschaft
  80.                 int counter = 0;
  81.                 double sum_x = 0;
  82.                 double sum_y = 0;
  83.  
  84.                 foreach (Player p in md.Players)
  85.                     // Koords für Heimspieler rechnen
  86.                 {
  87.                     if (p.isOnField(i) && p.ishome && p.playingPosition != "TW")
  88.                     {
  89.                         counter++;
  90.                         sum_x += p.Positions[i].X;
  91.                         sum_y += p.Positions[i].Y;
  92.                     }
  93.                 }
  94.  
  95.                 double cent_x = Math.Round(sum_x / counter, 2);
  96.                 double cent_y = Math.Round(sum_y / counter, 2);
  97.  
  98.                 centroidHome.Add(new Tuple<double, double>(cent_x, cent_y));
  99.  
  100.                 // Berechnungen Auswärtsmannschaft
  101.                 counter = 0;
  102.                 sum_x = 0;
  103.                 sum_y = 0;
  104.  
  105.                 foreach (Player p in md.Players)
  106.                     // Koords für Heimspieler rechnen
  107.                 {
  108.                     if (p.isOnField(i) && !p.ishome && p.playingPosition != "TW")
  109.                     {
  110.                         counter++;
  111.                         sum_x += p.Positions[i].X;
  112.                         sum_y += p.Positions[i].Y;
  113.                     }
  114.                 }
  115.  
  116.                 cent_x = Math.Round(sum_x / counter, 2);
  117.                 cent_y = Math.Round(sum_y / counter, 2);
  118.  
  119.                 centroidAway.Add(new Tuple<double, double>(cent_x, cent_y));
  120.             }
  121.         }
  122.  
  123.         public void centroidPositionalDifference()
  124.             // erstellt die X-Differenz zwischen beiden Centroiden
  125.             // immer Home - Away rechnen
  126.         {
  127.             List<double> temp = new List<double>();
  128.  
  129.             for (int i = 0; i < md.Moments.Length; i++)
  130.             {
  131.                 // 1. Half
  132.                 if (md.Moments[i].gamesection == GameSection.FirstHalf)
  133.                 {
  134.                     if (md.Match.playingdirection_home_1half < 0)
  135.                     {
  136.                         temp.Add(centroidHome[i].Item1 - centroidAway[i].Item1);
  137.                     }
  138.                     else
  139.                     {
  140.                         temp.Add(-1 * (centroidHome[i].Item1 - centroidAway[i].Item1));
  141.                     }
  142.                 }
  143.                 else
  144.                 {
  145.                     if (md.Match.playingdirection_home_1half < 0)
  146.                     {
  147.                         temp.Add(-1 * (centroidHome[i].Item1 - centroidAway[i].Item1));
  148.                     }
  149.                     else
  150.                     {
  151.                         temp.Add(centroidHome[i].Item1 - centroidAway[i].Item1);
  152.                     }
  153.                 }
  154.             }
  155.  
  156.             //centroidPosDiff = MovingAverage(150, temp.ToArray()).ToList();
  157.             centroidPosDiff = temp;
  158.         }
  159.  
  160.         public void calculateCentroidSpeed()
  161.         {
  162.             // LINQ Shortcut um nur das erste Element des Tuples pro Listeneintrag als neue Liste zu erhalten
  163.             List<double> temp_home =
  164.                 derivative(centroidHome.Select(t => t.Item1).ToList());
  165.  
  166.             List<double> temp_away =
  167.                 derivative(centroidAway.Select(t => t.Item1).ToList());
  168.  
  169.             for (int i = 0; i < temp_home.Count; i++)
  170.             {
  171.                 if (md.Moments[i].gamesection == GameSection.FirstHalf)
  172.                 {
  173.                     if (temp_home[i] < 0)
  174.                     {
  175.                         centroidHomeVelo.Add(temp_home[i]);
  176.                         centroidAwayVelo.Add(temp_away[i]);
  177.                     }
  178.                 }
  179.                 else
  180.                 {
  181.                     if (temp_home[i] > 0)
  182.                     {
  183.                         centroidHomeVelo.Add(temp_home[i]);
  184.                         centroidAwayVelo.Add(temp_away[i]);
  185.                     }
  186.                 }
  187.             }
  188.            
  189.         }
  190.  
  191.         public void calculateCentroidAcceleration()
  192.         {
  193.             // LINQ Shortcut um nur das erste Element des Tuples pro Listeneintrag als neue Liste zu erhalten
  194.             this.centroidHomeAcc =
  195.                 derivative(centroidHomeVelo);
  196.  
  197.             this.centroidAwayAcc =
  198.                 derivative(centroidAwayVelo);
  199.         }
  200.  
  201.         public List<double> derivative(List<double> sourceList)
  202.             // gibt die Ableitung der Liste zurück
  203.         {
  204.             List<double> temp = new List<double>();
  205.             for (int i = 0; i < sourceList.Count - 1; i++)
  206.             {
  207.                 temp.Add((sourceList[i] - sourceList[i + 1]) / 0.04);
  208.             }
  209.  
  210.             return temp;
  211.         }
  212.  
  213.         private static double[] MovingAverage(int frameSize, double[] data)
  214.         {
  215.             double sum = 0;
  216.             double[] avgPoints = new double[data.Length - frameSize + 1];
  217.             for (int counter = 0; counter <= data.Length - frameSize; counter++)
  218.             {
  219.                 int innerLoopCounter = 0;
  220.                 int index = counter;
  221.                 while (innerLoopCounter < frameSize)
  222.                 {
  223.                     sum = sum + data[index];
  224.  
  225.                     innerLoopCounter += 1;
  226.  
  227.                     index += 1;
  228.                 }
  229.  
  230.                 avgPoints[counter] = sum / frameSize;
  231.  
  232.                 sum = 0;
  233.             }
  234.  
  235.             return avgPoints;
  236.         }
  237.     }
  238. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement