#pragma once #include "vector3.hpp" #include "CommonStructs.hpp" #include #include struct Triangle { Vector3 a; Vector3 b; Vector3 c; }; using TriangleMesh = std::vector; // ֻ��������� OBJ�� // v x y z // f i j k (�� f i/j/k ��ʽ��1-based ��������) // ����������/���� bool loadObjAsTriangleMesh(const IniInPutStruct* inputData, size_t inputCount, TriangleMesh& mesh); namespace GeometryUtils { // P �����������ε������ void closestPointOnTriangle( const Vector3& p, const Triangle& tri, Vector3& closest, float& dist2); // P �������������������� void closestPointOnMesh( const Vector3& p, const TriangleMesh& mesh, Vector3& closest, float& dist); float signedDistanceToMesh( const Vector3& p, const TriangleMesh& mesh, Vector3* outClosestPoint = nullptr, Vector3* outNormal = nullptr); float signedDistanceToMeshForEndpoint( const Vector3& p, const TriangleMesh& mesh, Vector3* outClosestPoint, Vector3* outNormal); // �� mesh �������ҵ���� k ���������ѡ�㡱 void getSurfaceCandidatesOnMesh( const Vector3& p, const TriangleMesh& mesh, int k, std::vector& outPoints); // �������� void getSurfaceSlideCandidates( const Vector3& p, const TriangleMesh& mesh, int k, const Vector3* pathDir, float slideRadius, std::vector& outPoints); bool findEndpointHitOnMesh( const Vector3& p0, const Vector3& p1, const TriangleMesh& mesh, float maxRayDist, Vector3& hitPoint); bool SegmentCollidesWithMesh( const Vector3& P0, const Vector3& P1, const TriangleMesh& mesh, double safe_epsilon); bool IsSegmentCollides( const Vector3& P0, const Vector3& P1, const TriangleMesh& mesh); }