Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
12/09/13 22:42:34 (11 years ago)
Author:
ascheibe
Message:

#1886 added a wrapper for calculating the convex hull using qhull

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/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers-3.3.csproj

    r10208 r10211  
    2222    <ErrorReport>prompt</ErrorReport>
    2323    <WarningLevel>4</WarningLevel>
     24    <AllowUnsafeBlocks>true</AllowUnsafeBlocks>
    2425  </PropertyGroup>
    2526  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
  • branches/HeuristicLab.Analysis.AlgorithmBehavior/HeuristicLab.Analysis.AlgorithmBehavior.Analyzers/3.3/QhullWrapper.cs

    r10208 r10211  
    2020#endregion
    2121
     22using System;
    2223using System.Collections.Generic;
    2324using System.Linq;
     
    4243    }
    4344
     45    public unsafe static List<int> CalculateConvexHull(List<double[]> points) {
     46      int dimension = points.First().Length;
     47      int numPoints = points.Count();
     48      List<int> convexHullIndices = new List<int>();
     49
     50      double[] data = new double[dimension * numPoints];
     51      for (int i = 0; i < numPoints; i++) {
     52        for (int j = 0; j < dimension; j++) {
     53          data[i * dimension + j] = points[i][j];
     54        }
     55      }
     56
     57      IntPtr result = IntPtr.Zero;
     58      Int32 nrOfFacets = -1;
     59      Int32 retCode = 0;
     60
     61      result = qhull_convex_hull(dimension, numPoints, data, &retCode, &nrOfFacets);
     62      if (result != IntPtr.Zero && retCode == 0) {
     63        try {
     64          var faces = new int[nrOfFacets * dimension];
     65          Marshal.Copy(result, faces, 0, nrOfFacets * dimension);
     66          convexHullIndices.AddRange(faces.Distinct());
     67        }
     68        finally {
     69          qhull_free(result);
     70        }
     71      }
     72      return convexHullIndices;
     73    }
     74
    4475    [System.Runtime.InteropServices.DllImportAttribute("HeuristicLab.qhull.dll", EntryPoint = "qhull_volume", CallingConvention = CallingConvention.Cdecl)]
    4576    public static extern double qhull_volume(int dim, int numpoints, [In]double[] data);
     77
     78    [System.Runtime.InteropServices.DllImportAttribute("HeuristicLab.qhull.dll", EntryPoint = "qhull_convex_hull", CallingConvention = CallingConvention.Cdecl)]
     79    public unsafe static extern IntPtr qhull_convex_hull(int dim, int numpoints, [In]double[] data, [Out] Int32* retCode, [Out] Int32* nrOfFacets);
     80
     81    [System.Runtime.InteropServices.DllImportAttribute("HeuristicLab.qhull.dll", EntryPoint = "qhull_free", CallingConvention = CallingConvention.Cdecl)]
     82    public static extern void qhull_free(IntPtr data);
    4683  }
    4784}
Note: See TracChangeset for help on using the changeset viewer.