#pragma once #ifdef _WIN32 #define INTERSECTION_API __declspec(dllexport) #else #define INTERSECTION_API #endif #include "Geometry.h" #include #include #include #include #include // std::cerr #include // std::length_error extern "C" struct INTERSECTION_API TriangleSegmentIntersectRes { bool hit; float t; TriangleSegmentIntersectRes(bool h, float tt); }; INTERSECTION_API TriangleSegmentIntersectRes triangleSegmentIntersection(const LineSegment &segment, const Vec3f &a, const Vec3f &b, const Vec3f &c); extern "C" class INTERSECTION_API BVHNode { public: size_t left; size_t right; size_t parent; AABB boundingBox; BVHNode(size_t l, size_t r, size_t p, const AABB &aabb); BVHNode(); }; extern "C" class INTERSECTION_API BVH_intersection { public: const Mesh &mesh; std::vector faceCenters; std::vector nodes; BVH_intersection(const Mesh &mesh_); size_t dfsBuild(std::vector &indicesList, AABB aabb, size_t &nowIdx); bool intersectWithLineSegment(const LineSegment &lineSegment) const; private: AABB computeAABB(const std::vector &indices); bool recursiveLineSegIntersection(const LineSegment &lineSegment, size_t nodeIdx) const; void nth(std::vector &indicesList, size_t kth, int longAxis); void recursiveChoose(std::vector &indicesList, size_t begin, size_t end, size_t kth, int longAxis); };