点到三角形的距离(三维)-使用Geometric Tools库
教程
以下是使用Geometric Tools库,计算点到三角形面距离的教程。
程序库
已经编译好的库文件
下载地址为:
https://download.csdn.net/download/u011091739/10508026
项目配置
将下载好的资源解压到需要的文件夹,我的是:D:\sources\GeometricTools\GTEngine
debug环境下:
在C++ Include目录中添加:D:\sources\GeometricTools\GTEngine\Include
在C++库目录中添加:D:\sources\GeometricTools\GTEngine\_Output\v120\Win32\Debug
在编译->连接器中添加:GTEngine.v12.lib
release环境下:
在C++ Include目录中添加:D:\sources\GeometricTools\GTEngine\Include
在C++库目录中添加:D:\sources\GeometricTools\GTEngine\_Output\v120\Win32\Release
在编译->连接器中添加:GTEngine.v12.lib
下载编译
源代码下载地址①https://www.geometrictools.com/Downloads/GeometricToolsEngine3p13.zip
②https://download.csdn.net/download/u011091739/10500786
源代码就有对应的visual studio c++解决方案,选择适合的环境(debug/release、win32/x64),然后生成就可以了,就可以在_Output文件夹下面生成需要的库文件。示例代码:
#include "Mathematics/GteDistPointTriangle.h"
#include <iostream>
//=============================DistPointtoTriangle()============================
/// @brief <对函数进行概括说明>
///
/// <对函数进行详细说明>
///
/// @param [in] _point 指向大小为3 的double数组,存放了需要计算的点的坐标
/// @param [in] _triangle 指向大小为9 的double数组,依次存放了三角形三个点的坐标
/// @param [out] closetPt 指向大小为3 的double数组,用于存放计算出来的最近点的坐标
///
/// @return 顶点到三角形的最近距离
///
/// @remark <函数特别说明>
///
/// @code
/// <在此添加示例代码>
/// @endcode
///
/// @sa <可以参考的类或函数,用空格分隔,函数名称后必须加()>
//================================================================================
double DistPointtoTriangle(double * _point,
double * _triangle,
double * closetPt)
{
typedef gte::Vector<3, double> gteVec3;
typedef gte::Triangle<3, double> gteTri;
gteVec3 vecPt, v1, v2, v3;
vecPt[0] = _point[0];
vecPt[1] = _point[1];
vecPt[2] = _point[2];
v1[0] = _triangle[0];
v1[1] = _triangle[1];
v1[2] = _triangle[2];
v2[0] = _triangle[3];
v2[1] = _triangle[4];
v2[2] = _triangle[5];
v3[0] = _triangle[6];
v3[1] = _triangle[7];
v3[2] = _triangle[8];
gteTri tri(v1, v2, v3);
typedef gte::DCPQuery<double, gteVec3, gteTri> gteDCP;
gteDCP solver;
gteDCP::Result result = solver(vecPt, tri);
//std::cout << "distance: " << result.distance << " " << result.sqrDistance << "\n";
//std::cout << "barycentric coordinates: " << result.parameter[0] << " " << result.parameter[1] << " " << result.parameter[2] << "\n";
//std::cout << "closet point: " << result.closest[0] << " " << result.closest[1] << " " << result.closest[2] << "\n";
closetPt[0] = result.closest[0];
closetPt[1] = result.closest[1];
closetPt[2] = result.closest[2];
return result.distance;
}
原文
在处理三维网格的时候,会遇到使用点到点距离、点到面距离、面到面距离(只讨论欧氏距离)等信息。点到点的距离很好计算,后面两者计算就很麻烦。最近在网上找到了一个很强大的几何图形处理库,利用其可以很方便的计算点到三角形的距离。
点到三角形距离文档:https://www.geometrictools.com/Documentation/DistancePoint3Triangle3.pdf
该pdf详细讲解了如何计算点到三角形的距离。
点到三角形距离实现代码:https://www.geometrictools.com/GTEngine/Include/Mathematics/GteDistPointTriangle.h
该头文件实现了计算n维(n>=2)中,点到三角形的距离。
GeometricTools首页:https://www.geometrictools.com/index.html
开源代码下载地址:①https://www.geometrictools.com/Downloads/GeometricToolsEngine3p13.zip
②https://download.csdn.net/download/u011091739/10500786