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

VTK 判断一个 点 是否在一个模型 stl 内部 vtk 点是否在内部 表面 寻找最近点

判断 一个点 ,判断是否在风格 stl 模型内部,或表面:

目录

1.方案一:使用vtkCellLocator  FindClosestPoint 找到模型上距离给定点最近的一点,计算两点的距离 ,小于某一阈值 则认为此点在模型上;

2.方案二 使用 vtkKdTreePointLocator

3.方案三 使用 vtkSelectEnclosedPoints


1.方案一:使用vtkCellLocator  FindClosestPoint 找到模型上距离给定点最近的一点,计算两点的距离 ,小于某一阈值 则认为此点在模型上;

vtkCellLocator本身是一个octree。典型的用法就是求最近的单元或者点

bool CheckPointInsidePolyData(vtkPolyData * poly, double* pt)
{bool inside=false; auto cellLocator = vtkSmartPointer<vtkCellLocator>::New();cellLocator->SetDataSet(poly);cellLocator->BuildLocator();auto assistCell = vtkSmartPointer<vtkGenericCell>::New();double closestPoint[3];//the coordinates of the closest point will be returned heredouble closestPointDist2; //the squared distance to the closest point will be returned herevtkIdType cellId; //the cell id of the cell containing the closest point will be returned hereint subId=-1;cellLocator->FindClosestPoint(point, closestPoint, assistCell, cellId, subId, closestPointDist2);if (-1!= subId&&closestPointDist2 < 0.001){return true;}return inside;
}

2.方案二 使用 vtkKdTreePointLocator

但这个只能找到最新的点,还需要自己判断一下距离

官方样例:

#include <vtkIdList.h>
#include <vtkKdTreePointLocator.h>
#include <vtkNew.h>
#include <vtkPoints.h>
#include <vtkPolyData.h>int main(int, char*[])
{// Setup point coordinatesdouble x[3] = {1.0, 0.0, 0.0};double y[3] = {0.0, 1.0, 0.0};double z[3] = {0.0, 0.0, 1.0};vtkNew<vtkPoints> points;points->InsertNextPoint(x);points->InsertNextPoint(y);points->InsertNextPoint(z);vtkNew<vtkPolyData> polydata;polydata->SetPoints(points);// Create the treevtkNew<vtkKdTreePointLocator> kDTree;kDTree->SetDataSet(polydata);kDTree->BuildLocator();double testPoint[3] = {2.0, 0.0, 0.0};// Find the closest points to TestPointvtkIdType iD = kDTree->FindClosestPoint(testPoint);std::cout << "The closest point is point " << iD << std::endl;// Get the coordinates of the closest pointdouble closestPoint[3];kDTree->GetDataSet()->GetPoint(iD, closestPoint);std::cout << "Coordinates: " << closestPoint[0] << " " << closestPoint[1]<< " " << closestPoint[2] << std::endl;return EXIT_SUCCESS;
}

3.方案三 使用 vtkSelectEnclosedPoints

vtkSelectEnclosedPoints类可以判断标记点是否在封闭表面内。
vtkSelectEnclosedPoints是一个Filter,它计算所有输入点以确定它们是否位于封闭曲面中。过滤器生成一个(0,1)掩码(以vtkDataArray的形式),指示点是在提供的曲面的外部(掩码值=0)还是内部(掩码值=1)(输出vtkDataArray的名称是“SelectedPoints”。)
运行过滤器后,可以通过调用IsInside(ptId)方法来查询点是否在内部/外部。

样例:判断三个点是否在立方体内

注意:在立方体边上的点,不属于在立方体内部;

 CODE

#include <vtkVersion.h>
#include <vtkPolyData.h>
#include <vtkPointData.h>
#include <vtkCubeSource.h>
#include <vtkSmartPointer.h>
#include <vtkSelectEnclosedPoints.h>
#include <vtkIntArray.h>
#include <vtkDataArray.h>
#include <vtkProperty.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>
#include <vtkRenderWindowInteractor.h>int main(int, char*[])
{vtkNew<vtkCubeSource> cubeSource;cubeSource->Update();vtkPolyData* cube = cubeSource->GetOutput();double testInside[3] = { 0.0, 0.0, 0.0 };double testOutside[3] = { 0.7, 0.0, 0.0 };double testBorderOutside[3] = { 0.5, 0.0, 0.0 };vtkNew<vtkPoints> points;points->InsertNextPoint(testInside);points->InsertNextPoint(testOutside);points->InsertNextPoint(testBorderOutside);vtkNew<vtkPolyData> pointsPolydata;pointsPolydata->SetPoints(points);//Points inside testvtkNew<vtkSelectEnclosedPoints> selectEnclosedPoints;selectEnclosedPoints->SetInputData(pointsPolydata);selectEnclosedPoints->SetSurfaceData(cube);selectEnclosedPoints->Update();for (unsigned int i = 0; i < 3; i++) {std::cout << "Point " << i << ": " << selectEnclosedPoints->IsInside(i) << std::endl;}vtkDataArray* insideArray = vtkDataArray::SafeDownCast(selectEnclosedPoints->GetOutput()->GetPointData()->GetArray("SelectedPoints"));for (vtkIdType i = 0; i < insideArray->GetNumberOfTuples(); i++) {std::cout << i << " : " << insideArray->GetComponent(i, 0) << std::endl;}//Cube mapper, actorvtkNew<vtkPolyDataMapper> cubeMapper;cubeMapper->SetInputConnection(cubeSource->GetOutputPort());vtkNew<vtkActor> cubeActor;cubeActor->SetMapper(cubeMapper);cubeActor->GetProperty()->SetOpacity(0.5);//First, apply vtkVertexGlyphFilter to make cells around points, vtk only render cells.vtkNew<vtkVertexGlyphFilter> vertexGlyphFilter;vertexGlyphFilter->AddInputData(pointsPolydata);vertexGlyphFilter->Update();vtkNew<vtkPolyDataMapper> pointsMapper;pointsMapper->SetInputConnection(vertexGlyphFilter->GetOutputPort());vtkNew<vtkActor> pointsActor;pointsActor->SetMapper(pointsMapper);pointsActor->GetProperty()->SetPointSize(5); pointsActor->GetProperty()->SetColor(1.0, 0.0, 0);//Create a renderer, render window, and interactorvtkNew<vtkRenderer> renderer;vtkNew<vtkRenderWindow> renderWindow;renderWindow->AddRenderer(renderer);vtkNew<vtkRenderWindowInteractor> renderWindowInteractor;renderWindowInteractor->SetRenderWindow(renderWindow);// Add the actor to the scenerenderer->AddActor(cubeActor);renderer->AddActor(pointsActor);renderer->SetBackground(.0, 1, .0);renderWindow->Render();renderWindowInteractor->Start();return EXIT_SUCCESS;
}

输出:

Point 0: 1
Point 1: 0
Point 2: 0
0 : 1
1 : 0
2 : 0

相关文章:

VTK 判断一个 点 是否在一个模型 stl 内部 vtk 点是否在内部 表面 寻找最近点

判断 一个点 ,判断是否在风格 stl 模型内部&#xff0c;或表面&#xff1a; 目录 1.方案一&#xff1a;使用vtkCellLocator FindClosestPoint 找到模型上距离给定点最近的一点&#xff0c;计算两点的距离 &#xff0c;小于某一阈值 则认为此点在模型上&#xff1b; 2.方案二…...

【数据结构OJ题】链表的回文结构

原题链接&#xff1a;https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId49&&tqId29370&rp1&ru/activity/oj&qru/ta/2016test/question-ranking 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 在做这道…...

Nginx常见的三个漏洞

目录 $uri导致的CRLF注入漏洞 两种常见场景 表示uri的三个变量 案例 目录穿越漏洞 案例 Http Header被覆盖的问题 案例 $uri导致的CRLF注入漏洞 两种常见场景 用户访问http://example.com/aabbcc&#xff0c;自动跳转到https://example.com/aabbcc 用户访问http://exa…...

爬虫逆向实战(十六)--某建筑市场平台

一、数据接口分析 主页地址&#xff1a;某建筑市场平台 1、抓包 通过抓包可以发现数据接口是list 2、判断是否有加密参数 请求参数是否加密&#xff1f; 无请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 通过查看“响应”模块可以发现&#xff0c;返回的响应是…...

用Python做一个滑雪小游戏

游戏是让人娱乐和放松的好方式&#xff0c;而编写和玩自己的游戏则是一种特别有趣的体验。在本文中&#xff0c;我们将使用Python和pygame库来创建一个简单的滑雪小游戏。通过这个小游戏项目&#xff0c;我们将学习如何使用Python编程语言来制作自己的游戏&#xff0c;并且享受…...

EXCEL按列查找,最终返回该列所需查询序列所对应的值,VLOOKUP函数

EXCEL按列查找&#xff0c;最终返回该列所需查询序列所对应的值 示例&#xff1a;国标行业分类汉字&#xff0c;匹配id 使用VLOOKUP函数 第一参数&#xff1a;拿去查询的值。 第二参数&#xff1a;匹配的数据。 Ps&#xff1a;Sheet1!$C 21 : 21: 21:E 117 &#xff0c;需要…...

java编译报错,get方法报错

java编译报错&#xff0c;get方法报错 处理方式&#xff1a; 在空间中&#xff0c;将 buid 文件夹删除 再不行的话&#xff0c;重启电脑&#xff0c;删除各种缓存 试试...

可以降低CPU负载的网络传输技术——LSO

LSO 是个啥&#xff1f; Large Send Offload&#xff08;LSO&#xff09;是一种网络传输协议技术&#xff0c;旨在提高网络传输的性能和效率。它通过将大型数据包拆分成小型数据包&#xff0c;降低网络传输负载&#xff0c;提高传输速度。 在传统的网络传输协议中&#xff0c…...

[管理与领导-25]:IT基层管理者 - 团队管理 - 如何留人, 如何留住关键人才

目录 一、离职前的五大信号&#xff0c;你读懂了吗&#xff1f; 二、员工为什么会离职 三、如何留住关键人才 一、离职前的五大信号&#xff0c;你读懂了吗&#xff1f; 离职前的信号是指员工可能在准备离职之前表现出的一些迹象或行为。 这些信号可以帮助雇主或同事们察觉…...

【Redis】Redis 的学习教程(二)之 Jedis

仅仅知道 Redis 服务端的操作知识&#xff0c;还是远远不够的&#xff0c;如果想要真正在项目中得到应用&#xff0c;我们还需要一个 Redis 的客户端&#xff0c;然后将其集成到项目中&#xff0c;让程序自动根据我们的业务需要自动处理。 基于 Redis 开放的通信协议&#xff…...

VB+SQL银行设备管理系统设计与实现

摘要 随着银行卡的普及,很多地方安装了大量的存款机、取款机和POS机等银行自助设备。银行设备管理系统可以有效的记录银行设备的安装和使用情况,规范对自助设备的管理,从而为用户提供更加稳定和优质的服务。 本文介绍了银行设备管理系统的设计和开发过程,详细阐述了整个应…...

Python系统学习1-9-类一之类语法

一、类之初印象 1、类就是空表格&#xff0c;将变量&#xff08;列名&#xff09;和函数&#xff08;行为&#xff09;结合起来 2、创建对象&#xff0c;表达具体行 3、创建类就是创建数据的模板 --操作数据时有提示 --还能再组合数据的行为 --结构更加清晰 4、类的内存分配…...

PHP“深入浅出”淘宝商品详情数据接口获取方法,淘宝API申请指南

获取淘宝商品详情数据的方法如下&#xff1a; 确定监控对象&#xff0c;通常是与自己店铺的商品相似的竞品&#xff0c;通过在淘宝商品详情页的URL中获取商品ID&#xff0c;进而获取商品的详情数据。通过API接口获取商品详情数据&#xff0c;申请开发者账号并获取授权访问&…...

线性代数再回顾

最近&#xff0c;在深度学习线性代数&#xff0c;之前大一的时候学过线性代数&#xff0c;但那纯属于是应试用的&#xff0c;考试一考完&#xff0c;啥都忘了&#xff0c;也说出不出个所以然&#xff0c;所以&#xff0c;在B站的MIT的线性代数以及3blue1brown线性代数的本质中去…...

(白帽黑客)自学笔记

一、前言&#xff1a; 1.这是一条坚持的道路,三分钟的热情可以放弃往下看了. 2.多练多想,不要离开了教程什么都不会了.最好看完教程自己独立完成技术方面的开发. 3.有时多 google,baidu,我们往往都遇不到好心的大神,谁会无聊天天给你做解答. 4.遇到实在搞不懂的,可以先放放,以…...

基于长短期神经网络的客流量预测,基于长短期神经网络的超短期客流量预测,lstm详细原理

目录 背影 摘要 LSTM的基本定义 LSTM实现的步骤 基于长短期神经网络LSTM的客流量预测 完整代码: 基于长短期神经网络LSTM的公交站客流量预测资源-CSDN文库 https://download.csdn.net/download/abc991835105/88184734 效果图 结果分析 展望 参考论文 背影 碳排放越来越受到重…...

前端文件下载通用方法

zip文件和xlsx文件 import axios from axios import { getToken } from /utils/authconst mimeMap {xlsx: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,zip: application/zip }const baseUrl process.env.VUE_APP_BASE_API // zip下载 export functi…...

htmlCSS-----案例展示

目录 前言 作品效果 html代码 CSS代码 图片资源 前言 在学习html过程中我们要试着去写写一些案例&#xff0c;通过这些案例让我们更加熟悉代码以及丰富我们的经验&#xff0c;下面是我个人写的一个案例&#xff0c;代码和图片也给出了大家&#xff0c;你们可以参考参考。…...

Android进阶之路 - 去除EditText内边距

正如题名&#xff0c;在Android中的EditText是自带内边距的&#xff0c;常规而言设置背景为null即可&#xff0c;但是因为使用了并不熟悉的声明式框架&#xff0c;本是几分钟解决的事儿&#xff0c;却花费了小半天~ 其实这只是一个很简单的小需求&#xff0c;不想却遇到了一些小…...

ModStartCMS v7.0.0 多语言开发优化,多个常用组件升级

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议&#xff0c;免费且不限制商业使用。 功能特性 丰富的模块市…...

提示内容用户体验优化框架:提示工程架构师的实战指南

提示内容用户体验优化框架&#xff1a;提示工程架构师的实战指南 一、引言&#xff1a;为什么“提示内容”是AI产品的“用户体验咽喉”&#xff1f; 1. 一个真实的痛点&#xff1a;用户与AI的“对话困境” 上周&#xff0c;我在某知名AI写作平台上看到一条用户评论&#xff1a;…...

革命性智能求职助手:AI驱动的多平台简历投递解决方案

革命性智能求职助手&#xff1a;AI驱动的多平台简历投递解决方案 【免费下载链接】get_jobs &#x1f4bc;【找工作最强助手】全平台自动投简历脚本&#xff1a;(boss、前程无忧、猎聘、拉勾、智联招聘) 项目地址: https://gitcode.com/gh_mirrors/ge/get_jobs 你是否还…...

言语主旨题和细节判断题

由于气温上升、降雨改变和极端气候事件&#xff0c;热带森林正频繁遭受干旱。气候压力对亚马孙雨林尤为明显&#xff0c;反复发生的干旱事件增加了树木的死亡率。根据《自然》杂志发表的一项研究&#xff0c;亚马孙森林树木对干旱的耐受取决于不同物种&#xff0c;这影响到它们…...

python numpy包的使用

文章目录比较常用的功能计算相似度计算矩阵有人问 求平均数还不简单&#xff0c;还用的着mean()方法吗?np.sum()方法计算矩阵的行和与列和keepdims求和后保持结果的维度不变示例np.sum()的内置参数非常强的一个包&#xff0c;在数组、矩阵、向量计算方面极具优势。比较常用的功…...

C1083编译错误:解决‘xxx.h‘文件缺失问题的实战指南

1. 遇到C1083编译错误时的心态调整 第一次看到"C1083 无法打开包括文件: xxx.h: No such file or directory"这个错误提示时&#xff0c;我正熬夜赶一个Qt界面开发项目。当时整个人都懵了&#xff0c;明明昨天还能正常编译的代码&#xff0c;怎么突然就报错了&#x…...

3步搞定电子课本下载,效率提升80%:教师与家长的教育资源获取神器

3步搞定电子课本下载&#xff0c;效率提升80%&#xff1a;教师与家长的教育资源获取神器 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具 项目地址: https://gitcode.com/GitHub_Trending/tc/tchMaterial-parser 在数字化教学日益普及的今…...

掌握Agentic RAG:动态智能代理,提升大模型学习与实战效率,CSDN小白程序员必收藏!

掌握Agentic RAG&#xff1a;动态智能代理&#xff0c;提升大模型学习与实战效率&#xff0c;CSDN小白程序员必收藏&#xff01; Agentic RAG技术通过引入自主AI代理&#xff0c;解决了传统RAG系统依赖静态数据的局限性&#xff0c;实现实时检索最新数据&#xff0c;灵活调整策…...

bge-large-zh-v1.5在RAG中的应用:提升问答系统准确率

bge-large-zh-v1.5在RAG中的应用&#xff1a;提升问答系统准确率 1. RAG系统与Embedding模型的关系 1.1 什么是RAG系统 RAG&#xff08;Retrieval-Augmented Generation&#xff09;系统是现代问答系统的核心技术架构&#xff0c;它通过两个关键步骤回答用户问题&#xff1a…...

深入解析MCU Systick:从基础配置到精准延时与系统时间获取实战

1. Systick定时器基础解析 Systick是Cortex-M内核内置的24位递减计数器&#xff0c;堪称MCU的"心跳发生器"。我第一次在STM32项目中使用它时&#xff0c;就像发现了一个隐藏的瑞士军刀——简单却功能强大。这个看似简单的定时器&#xff0c;实际上承担着三大核心功能…...

车载相机升级指南:美信MAX9295/96717串行器搭配MAX96712解串器调试MIPI相机实录

车载相机升级指南&#xff1a;美信MAX9295/96717串行器搭配MAX96712解串器调试MIPI相机实录 随着智能驾驶系统对图像识别精度要求的提升&#xff0c;8M像素车载相机正逐步成为行业标配。这次我们团队在升级某高端车型环视系统时&#xff0c;就遇到了从传统2M相机切换到8M MIPI…...