Free cookie consent management tool by TermsFeed Policy Generator

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

File:
1 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}
Note: See TracChangeset for help on using the changeset viewer.