(10)VTK C++开发示例 --- 点和线之间的距离
文章目录
- 1. 概述
- 2. CMake链接VTK
- 3. main.cpp文件
- 4. 演示效果
更多精彩内容 |
---|
👉内容导航 👈 |
👉VTK开发 👈 |
1. 概述
头文件
#include<vtkLine.h>
;位于模块
CommonDataModel
;
vtkLine::DistanceToLine()
是 VTK 库中用于计算三维点到直线最短距离的方法,其核心原理基于向量投影计算。以下是详细说明:
函数
static double vtkLine::DistanceToLine(const double x[3], // 待计算的点坐标 (三维)const double p1[3], // 直线起点坐标const double p2[3], // 直线终点坐标double &t, // 输出参数:投影点在线段上的参数化位置 [0,1]double closestPoint[3] // 输出参数:直线上距离x最近的垂足点坐标 );
关键行为
- 返回值
返回点x
到直线的 平方距离(非实际距离),需调用sqrt()
获取实际距离。- 参数
t
的意义
t ∈ [0,1]
: 垂足点位于线段p1-p2
内部t < 0
: 垂足点靠近p1
外侧t > 1
: 垂足点靠近p2
外侧- 特殊情况处理
当直线退化成点(p1 == p2
)时,直接计算x
到p1
的距离。
数学原理
- 计算向量
v = p2 - p1
(直线方向向量)- 计算向量
w = x - p1
(点到直线起点的向量)- 投影参数
t = (w · v) / (v · v)
- 根据
t
的范围调整垂足点坐标closestPoint
- 最终距离平方 = ||
x - closestPoint
||²典型应用场景
- 三维几何碰撞检测
- 点云数据处理(如计算点到中心线的偏差)
- 医学图像处理中测量解剖结构距离
环境 | 说明 |
---|---|
系统 | ubuntu22.04、windows11 |
cmake | 3.22、3.25 |
Qt | 5.14.2 |
编译器 | g++11.4、msvc2017 |
VTK | 9.4.1 |
2. CMake链接VTK
cmake_minimum_required(VERSION 3.20 FATAL_ERROR) # 设置CMake最低版本
project(vtk2) # 设置项目名称
# 查找VTK库
find_package(VTK COMPONENTS
CommonCore
CommonDataModel
)
if(NOT VTK_FOUND)
message("VTK not found")
return()
endif()add_executable(vtk2 main.cpp) # 添加可执行文件target_link_libraries(vtk2 PRIVATE ${VTK_LIBRARIES}) # 链接VTK库
vtk_module_autoinit(TARGETS vtk2 MODULES ${VTK_LIBRARIES}) # 初始化VTK模块
3. main.cpp文件
/********************************************************************************
* 文件名: main.cpp
* 创建时间: 2025-03-12 21:02:35
* 开发者: MHF
* 邮箱: 1603291350@qq.com
* 功能:
*********************************************************************************/
#include<iostream>
#include<vtkNew.h>
#include<vtkLine.h>
using namespace std;int main()
{// 创建一条直线double lineP0[3] = {0, 0, 0};double lineP1[3] = {2.0, 0, 0};double p0[3] = {0.5, 0, 0}; // 创建一个点double p1[3] = {1.0, 2.0, 0}; // 创建一个点double dis0 = vtkLine::DistanceToLine(p0, lineP0, lineP1); // 计算点到直线的距离double dis1 = vtkLine::DistanceToLine(p1, lineP0, lineP1); // 计算点到直线的距离cout << "距离为:" << dis0 << ", " << dis1 << endl;double t = 0; // 表示最近点在直线上的参数化位置(取值范围:0 ≤ t ≤ 1 时为线段内部)double closestPt0[3] = {0}; // 输出参数,直线上距离最近的物理坐标(线段内部)dis0 = vtkLine::DistanceToLine(p0, lineP0, lineP1, t, closestPt0); // 计算点到直线的距离cout << "距离为:" << dis0 << ", 线上位置:" << t << ", 直线上距离最近的点坐标:" << closestPt0[0] << ", " << closestPt0[1] << ", " << closestPt0[2] << endl;dis1 = vtkLine::DistanceToLine(p1, lineP0, lineP1, t, closestPt0); // 计算点到直线的距离cout << "距离为:" << dis1 << ", 线上位置:" << t << ", 直线上距离最近的点坐标:" << closestPt0[0] << ", " << closestPt0[1] << ", " << closestPt0[2] << endl;return 0;
}
4. 演示效果
距离为:0, 4
距离为:0, 线上位置:0.25, 直线上距离最近的点坐标:0.5, 0, 0
距离为:4, 线上位置:0.5, 直线上距离最近的点坐标:1, 0, 0