Free cookie consent management tool by TermsFeed Policy Generator

Changeset 10274


Ignore:
Timestamp:
01/03/14 01:17:02 (10 years ago)
Author:
ascheibe
Message:

#1886 added calculation of the centroid of a convex hull and measures for motion characteristics

Location:
branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/ConvexHullMeasures.cs

    r10272 r10274  
    8989      return result;
    9090    }
     91
     92    public static double[] CalculateCentroid(List<double[]> convexHull) {
     93      int n = convexHull.Count;
     94      int dim = convexHull.First().Length;
     95      double[] centroid = new double[dim];
     96
     97      for (int i = 0; i < dim; i++) {
     98        for (int j = 0; j < n; j++) {
     99          centroid[i] += convexHull[j][i];
     100        }
     101        centroid[i] /= n;
     102      }
     103      return centroid;
     104    }
     105
     106    //measures to calculate: AVG, SUM, STD.DEV
     107    public static double[] CalculateMovementDistances(List<double[]> centroids) {
     108      double[] distances = new double[centroids.Count - 1];
     109
     110      // it is assumed that the centroids are sorted chronological
     111      for (int i = 0; i < centroids.Count - 1; i++) {
     112        distances[i] = centroids[i].EuclideanDistance(centroids[i + 1]);
     113      }
     114
     115      return distances;
     116    }
     117
     118    public static double CalculateOverallMovementDistances(List<double[]> centroids) {
     119      // it is assumed that the centroids are sorted chronological
     120      return centroids[0].EuclideanDistance(centroids[centroids.Count - 1]);
     121    }
     122
     123    //calculate theta from two vectors (dot product)
     124    public static double CalculateTheta(double[] a, double[] b) {
     125      return Math.Acos(a.DotProduct(b) / (a.EuclideanNorm() * b.EuclideanNorm()));
     126    }
     127
     128    //calculate theta using law of cosines
     129    public static double CalculateTheta(double[] a, double[] b, double[] c) {
     130      double ab = a.EuclideanDistance(b);
     131      double bc = b.EuclideanDistance(c);
     132      double ca = c.EuclideanDistance(a);
     133
     134      return Math.Acos((ab * ab + bc * bc - ca * ca) / (2 * ab * bc));
     135    }
     136
     137    //measures to calculate: AVG, SUM, STD.DEV
     138    public static double[] CalculateCentroidsMotion(List<double[]> centroids) {
     139      double[] thetas = new double[centroids.Count - 2];
     140
     141      for (int i = 1; i < centroids.Count - 1; i++) {
     142        thetas[i - 1] = CalculateTheta(centroids[i - 1], centroids[i], centroids[i + 1]);
     143      }
     144
     145      return thetas;
     146    }
    91147  }
    92148}
  • branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/DoubleArrayExtensions.cs

    r10092 r10274  
    3131      return Math.Sqrt(result);
    3232    }
     33
     34    public static double EuclideanNorm(this double[] p) {
     35      double norm = 0.0;
     36      for (int i = 0; i < p.Length; i++) {
     37        norm += p[i] * p[i];
     38      }
     39      return Math.Sqrt(norm);
     40    }
     41
     42    public static double DotProduct(this double[] p1, double[] p2) {
     43      double sum = 0.0;
     44      for (int i = 0; i < p1.Length; i++) {
     45        sum += p1[i] * p2[i];
     46      }
     47      return sum;
     48    }
    3349  }
    3450}
Note: See TracChangeset for help on using the changeset viewer.