KDTree.h 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #ifndef KDTREE_H
  2. #define KDTREE_H
  3. #include <vector>
  4. #include "common/utils/Array.h"
  5. #include "common/math/Vector.h"
  6. #include "client/rendering/Lines.h"
  7. struct KDTree final {
  8. class Triangle {
  9. Array<Vector3, 3> v;
  10. Vector3 mid;
  11. public:
  12. Triangle(const Vector3& a, const Vector3& b, const Vector3& c);
  13. const Array<Vector3, 3>& data() const;
  14. const Vector3& operator[](int index) const;
  15. const Vector3& getMid() const;
  16. };
  17. private:
  18. struct Node {
  19. std::vector<Triangle> data;
  20. int splitDim;
  21. float splitValue;
  22. Node* lessEqual;
  23. Node* greater;
  24. Node();
  25. };
  26. Node root;
  27. public:
  28. KDTree();
  29. ~KDTree();
  30. KDTree(const KDTree& other) = delete;
  31. KDTree(KDTree&& other) = delete;
  32. KDTree& operator=(const KDTree& other) = delete;
  33. KDTree& operator=(KDTree&& other) = delete;
  34. void build(std::vector<KDTree::Triangle>& data);
  35. void fillLines(Lines& lines, const std::vector<KDTree::Triangle>& data);
  36. private:
  37. void clean(Node* n);
  38. float median(std::vector<KDTree::Triangle>& data, int dim) const;
  39. void build(Node* n, std::vector<KDTree::Triangle>& data);
  40. void fillLines(Lines& lines, Node* n, const Vector3& min, const Vector3& max);
  41. };
  42. #endif