当前位置: 首页 > backend >正文

(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最近的垂足点坐标
);

关键行为

  1. 返回值
    返回点 x 到直线的 平方距离(非实际距离),需调用 sqrt() 获取实际距离。
  2. 参数 t 的意义
    • t ∈ [0,1]: 垂足点位于线段 p1-p2 内部
    • t < 0: 垂足点靠近 p1 外侧
    • t > 1: 垂足点靠近 p2 外侧
  3. 特殊情况处理
    当直线退化成点(p1 == p2)时,直接计算 xp1 的距离。

数学原理

  1. 计算向量 v = p2 - p1(直线方向向量)
  2. 计算向量 w = x - p1(点到直线起点的向量)
  3. 投影参数 t = (w · v) / (v · v)
  4. 根据 t 的范围调整垂足点坐标 closestPoint
  5. 最终距离平方 = ||x - closestPoint||²

典型应用场景

  • 三维几何碰撞检测
  • 点云数据处理(如计算点到中心线的偏差)
  • 医学图像处理中测量解剖结构距离
环境说明
系统ubuntu22.04、windows11
cmake3.22、3.25
Qt5.14.2
编译器g++11.4、msvc2017
VTK9.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


http://www.xdnf.cn/news/543.html

相关文章:

  • 【入门】数字之和为13的整数
  • Doris,新一代实时数仓核心基础设施
  • 数据防泄漏:企业信息安全的重要防线
  • Datawhale AI春训营学习
  • PHP框架在大规模分布式系统中的适用性如何?
  • deekseak 本地windows 10 部署步骤
  • ACM ICPC算法基础包括哪几类
  • Withholding Tax(预扣所得税)-前台操作 Part 1
  • System.in 详解
  • 【笔记】网络安全管理
  • 嵌入式单片机开发 - Keil MDK 编译与烧录程序
  • c++中的类有关概念
  • 精益数据分析(6/126):深入理解精益分析的核心要点
  • 五分钟学会如何基本使用JJWT!!!
  • Java虚拟机面试题:垃圾收集(下)
  • 3.基础开发工具
  • CLIP赋能视频分析:时空侧网络调优,行人属性识别效率革命
  • Java—— 常见API介绍 第二期
  • C++/Python实现RGB和HSI相互转换
  • Linux——firewalld防火墙(笔记)
  • 深度学习语音识别
  • bat脚本转换为EXE应用程序文件
  • 案例驱动的 IT 团队管理:创新与突破之路:第六章 组织进化:从案例沉淀到管理体系-6.1 案例库建设方法论-6.1.2案例分级与标签体系
  • OpenStack Yoga版安装笔记(23)Swift安装
  • QML中的3D功能--模型导入与修改
  • LRU Java实现
  • 五、小白如何用Pygame制作一款跑酷类游戏(主角跳跃和滑行动作的实现)
  • Linux | I.MX6ULL 使用 Yocto 文件系统开发 QT
  • 015-C语言字符函数和字符串函数
  • java蓝桥杯b组