distancing.cu 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #include <pybind11/stl.h>
  2. #include <thread>
  3. #include <vector>
  4. #include <cmath>
  5. using namespace std;
  6. namespace py = pybind11;
  7. typedef tuple<float, float, float> centroid;
  8. float compute_dist(centroid& p1, centroid& p2)
  9. {
  10. float x1, y1, h1, x2, y2, h2;
  11. std::tie(x1, y1, h1) = p1;
  12. std::tie(x2, y2, h2) = p2;
  13. float dx = x2 - x1;
  14. float dy = y2 - y1;
  15. float lx = dx * 170 * (1/h1 + 1/h2) / 2;
  16. float ly = dy * 170 * (1/h1 + 1/h2) / 2;
  17. float l = sqrt(lx*lx + ly*ly);
  18. return l;
  19. }
  20. float compute_min_dist(int p, centroid& point, vector<centroid>& points)
  21. {
  22. vector<float> distances;
  23. for (auto & p2 : points) {
  24. distances.push_back(compute_dist(point, p2));
  25. }
  26. distances[p] = 1000000.0;
  27. float min_dist = *std::min_element(distances.begin(), distances.end());
  28. return min_dist;
  29. }
  30. vector<float> get_min_distances(vector<centroid>& points)
  31. {
  32. vector<float> out;
  33. for (int p = 0; p < points.size(); p++) {
  34. float min_dist = compute_min_dist(p, points[p], points);
  35. out.push_back(min_dist);
  36. }
  37. return out;
  38. }
  39. PYBIND11_MODULE(distancing, m) {
  40. m.def("get_min_distances", &get_min_distances, "Get min distances");
  41. }