VTK-vtkSelectPolyDataFilter

news2024/11/26 16:33:55

前言:本博文主要记录vtkSelectPolyDataFilter接口的应用,实现原理,以及与其近似的vtkClipPolyData&vtkImplicitSelectionLoop的应用相比较,帮助小伙伴理解vtkSelectPolyDataFilter接口的实现原理,并且与其它接口进行区分。

结果展示

    

                 SelectPolyData                                                  ImplicitSelectionLoop

vtkSelectPolyDataFilter

描述:vtkSelectPolyData是一个过滤器,它根据定义“循环”并指示循环内的区域来选择多边形数据。循环内的网格由完整的细胞组成(细胞没有被切割)。或者,此过滤器可用于生成标量。这些标量值是到循环的距离测量,可用于剪辑、等高线。或者提取数据(即隐式函数可以做的任何事情)。

循环由x-y-z点坐标数组定义。(坐标应与输入多边形数据在同一坐标空间中。)环可以是凹的,非平面的,但不能自相交。过滤器的输入是一个多边形网格(仅限曲面原语,如三角形条和多边形);输出是a)在选择循环GenerateSelectionScalarsOff内的原始网格铺设的一部分;或b)添加标量值的相同多边形网格(GenerateSelectionScalarsOn)。

算法工作原理如下:对于循环中的每个点坐标,网格中最近的点被找到。结果是一个由距离网格最近的点id组成的循环。然后,在网格中找到连接最近点的边缘(并沿着形成环路的线铺设)。贪心边跟踪过程如下所示。在当前点,选择方向为且端点离直线最近的网格边。沿着边缘走到新的终点,然后重复这个过程。这个过程一直持续到整个循环创建完成。

要确定网格的哪一部分在循环内部和外部,有三种可能的选择。1)最小连通区域,2)最大连通区域,3)最接近用户指定点的连通区域。(设置ivar SelectionMode)

一旦像上面那样计算循环,GenerateSelectionScalars将控制过滤器的输出。如果为on,则基于到环线的距离生成标量值。否则,将输出位于选择循环内的单元格。默认情况下,环路内的网格铺设为输出;然而,如果InsideOut打开了,那么在环路外的网格部分被输出。

过滤器可以配置为通过设置GenerateUnselectedOutput来生成网格的未选择部分作为输出。使用方法GetUnselectedOutput来访问此输出。(注意:这个标志只在enerateSelectionScalars关闭时才相关。)

实例TestSelectPolyData

#include <vtkSmartPointer.h>
#include <vtkProperty.h>
#include <vtkSelectPolyData.h>
#include <vtkSphereSource.h>
#include <vtkClipPolyData.h>
#include <vtkProperty.h>
#include <vtkPolyDataMapper.h>
#include <vtkLODActor.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderWindow.h>
#include <vtkRenderer.h>

#include <vtkNamedColors.h>

int main(int, char *[])
{
  
  vtkSmartPointer<vtkNamedColors> colors =
    vtkSmartPointer<vtkNamedColors>::New();

  vtkSmartPointer<vtkSphereSource> sphereSource = 
    vtkSmartPointer<vtkSphereSource>::New();
  sphereSource->SetPhiResolution(50);
  sphereSource->SetThetaResolution(100);
  sphereSource->Update();
      
  vtkSmartPointer<vtkPoints> selectionPoints =
    vtkSmartPointer<vtkPoints>::New();
    
  selectionPoints->InsertPoint( 0, -0.16553, 0.135971, 0.451972 );
  selectionPoints->InsertPoint( 1, -0.0880123, -0.134952, 0.4747);
  selectionPoints->InsertPoint( 2,  0.00292618, -0.134604, 0.482459 );
  selectionPoints->InsertPoint( 3, 0.0641941, 0.067112, 0.490947);
  selectionPoints->InsertPoint( 4, 0.15577, 0.0734765, 0.469245);
  selectionPoints->InsertPoint( 5, 0.166667, -0.129217, 0.454622 );
  selectionPoints->InsertPoint( 6, 0.241259, -0.123363, 0.420581);
  selectionPoints->InsertPoint( 7,  0.240334, 0.0727106, 0.432555);
  selectionPoints->InsertPoint( 8, 0.308529, 0.0844311, 0.384357 );
  selectionPoints->InsertPoint( 9, 0.32672, -0.121674, 0.359187);
  selectionPoints-> InsertPoint( 10, 0.380721, -0.117342, 0.302527);
  selectionPoints ->InsertPoint( 11, 0.387804, 0.0455074, 0.312375 );
  selectionPoints ->InsertPoint( 12, 0.43943, -0.111673, 0.211707);
  selectionPoints ->InsertPoint( 13, 0.470984, -0.0801913, 0.147919);
  selectionPoints ->InsertPoint( 14, 0.436777, 0.0688872, 0.233021 );
  selectionPoints ->InsertPoint( 15, 0.44874, 0.188852, 0.109882);
  selectionPoints ->InsertPoint( 16, 0.391352, 0.254285, 0.176943);
  selectionPoints ->InsertPoint( 17, 0.373274, 0.154162, 0.294296 );
  selectionPoints ->InsertPoint( 18, 0.274659, 0.311654, 0.276609);
  selectionPoints ->InsertPoint( 19, 0.206068, 0.31396, 0.329702);
  selectionPoints ->InsertPoint( 20, 0.263789, 0.174982, 0.387308 );
  selectionPoints ->InsertPoint( 21, 0.213034, 0.175485, 0.417142);
  selectionPoints ->InsertPoint( 22, 0.169113, 0.261974, 0.390286);
  selectionPoints ->InsertPoint( 23, 0.102552, 0.25997, 0.414814 );
  selectionPoints ->InsertPoint( 24, 0.131512, 0.161254, 0.454705);
  selectionPoints ->InsertPoint( 25, 0.000192443, 0.156264, 0.475307);
  selectionPoints ->InsertPoint( 26, -0.0392091, 0.000251724, 0.499943); 
  selectionPoints ->InsertPoint( 27, -0.096161, 0.159646, 0.46438 );
  
  vtkSmartPointer<vtkSelectPolyData> loop =
    vtkSmartPointer<vtkSelectPolyData>::New();
  loop->SetInputConnection(sphereSource->GetOutputPort());
  loop->SetLoop(selectionPoints);
  loop->GenerateSelectionScalarsOn();
  loop->SetSelectionModeToSmallestRegion(); //negative scalars inside
  
  vtkSmartPointer<vtkClipPolyData> clip = //clips out positive region
    vtkSmartPointer<vtkClipPolyData>::New();
  clip->SetInputConnection(loop->GetOutputPort());

  vtkSmartPointer<vtkPolyDataMapper> clipMapper = 
    vtkSmartPointer<vtkPolyDataMapper>::New();
  clipMapper->SetInputConnection(clip->GetOutputPort());
  clipMapper->ScalarVisibilityOff();

  vtkSmartPointer<vtkProperty> backProp =
    vtkSmartPointer<vtkProperty>::New();
  backProp->SetColor(colors->GetColor3d("tomato").GetData());

  vtkSmartPointer<vtkLODActor> clipActor = 
    vtkSmartPointer<vtkLODActor>::New();
  clipActor->SetMapper(clipMapper);
  clipActor->SetBackfaceProperty(backProp);
  clipActor->GetProperty()->SetColor(colors->GetColor3d("banana").GetData());

  vtkSmartPointer<vtkRenderer> renderer =
    vtkSmartPointer<vtkRenderer>::New();
    
  vtkSmartPointer<vtkRenderWindow> renderWindow =
    vtkSmartPointer<vtkRenderWindow>::New();
  renderWindow->AddRenderer(renderer);
  
  vtkSmartPointer<vtkRenderWindowInteractor> interactor =
    vtkSmartPointer<vtkRenderWindowInteractor>::New();
  interactor->SetRenderWindow(renderWindow);

  // Add the actors to the renderer, set the background and size
  renderer->AddActor (clipActor);
  renderer->SetBackground (colors->GetColor3d("slate_grey").GetData());

  renderWindow->SetSize (500, 500);

  renderWindow->Render();
  interactor->Start();


  return EXIT_SUCCESS;
}

实例2 ImplicitSelectionLoop

原理:采用vtkImplicitSelectionLoop作为vtkImplicitFunction,实现vtkClipPolyData分割,结果如上图ImplicitSelectionLoop所示。

#include <vtkClipPolyData.h>
#include <vtkImplicitSelectionLoop.h>
#include <vtkLODActor.h>
#include <vtkNamedColors.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSmartPointer.h>
#include <vtkSphereSource.h>

int main(int, char*[])
{

  auto colors = vtkSmartPointer<vtkNamedColors>::New();

  auto sphereSource = vtkSmartPointer<vtkSphereSource>::New();
  sphereSource->SetPhiResolution(100);
  sphereSource->SetThetaResolution(100);
  sphereSource->Update();

  auto selectionPoints = vtkSmartPointer<vtkPoints>::New();

  selectionPoints->InsertPoint(0, -0.16553, 0.135971, 0.451972);
  selectionPoints->InsertPoint(1, -0.0880123, -0.134952, 0.4747);
  selectionPoints->InsertPoint(2, 0.00292618, -0.134604, 0.482459);
  selectionPoints->InsertPoint(3, 0.0641941, 0.067112, 0.490947);
  selectionPoints->InsertPoint(4, 0.15577, 0.0734765, 0.469245);
  selectionPoints->InsertPoint(5, 0.166667, -0.129217, 0.454622);
  selectionPoints->InsertPoint(6, 0.241259, -0.123363, 0.420581);
  selectionPoints->InsertPoint(7, 0.240334, 0.0727106, 0.432555);
  selectionPoints->InsertPoint(8, 0.308529, 0.0844311, 0.384357);
  selectionPoints->InsertPoint(9, 0.32672, -0.121674, 0.359187);
  selectionPoints->InsertPoint(10, 0.380721, -0.117342, 0.302527);
  selectionPoints->InsertPoint(11, 0.387804, 0.0455074, 0.312375);
  selectionPoints->InsertPoint(12, 0.43943, -0.111673, 0.211707);
  selectionPoints->InsertPoint(13, 0.470984, -0.0801913, 0.147919);
  selectionPoints->InsertPoint(14, 0.436777, 0.0688872, 0.233021);
  selectionPoints->InsertPoint(15, 0.44874, 0.188852, 0.109882);
  selectionPoints->InsertPoint(16, 0.391352, 0.254285, 0.176943);
  selectionPoints->InsertPoint(17, 0.373274, 0.154162, 0.294296);
  selectionPoints->InsertPoint(18, 0.274659, 0.311654, 0.276609);
  selectionPoints->InsertPoint(19, 0.206068, 0.31396, 0.329702);
  selectionPoints->InsertPoint(20, 0.263789, 0.174982, 0.387308);
  selectionPoints->InsertPoint(21, 0.213034, 0.175485, 0.417142);
  selectionPoints->InsertPoint(22, 0.169113, 0.261974, 0.390286);
  selectionPoints->InsertPoint(23, 0.102552, 0.25997, 0.414814);
  selectionPoints->InsertPoint(24, 0.131512, 0.161254, 0.454705);
  selectionPoints->InsertPoint(25, 0.000192443, 0.156264, 0.475307);
  selectionPoints->InsertPoint(26, -0.0392091, 0.000251724, 0.499943);
  selectionPoints->InsertPoint(27, -0.096161, 0.159646, 0.46438);

  auto loop = vtkSmartPointer<vtkImplicitSelectionLoop>::New();
  loop->SetLoop(selectionPoints);

  auto clip = // clips out positive region
      vtkSmartPointer<vtkClipPolyData>::New();
  clip->SetInputConnection(sphereSource->GetOutputPort());
  clip->SetClipFunction(loop);
  clip->SetValue(0.0);

  auto clipMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
  clipMapper->SetInputConnection(clip->GetOutputPort());
  clipMapper->ScalarVisibilityOff();

  auto backProp = vtkSmartPointer<vtkProperty>::New();
  backProp->SetColor(colors->GetColor3d("tomato").GetData());

  auto clipActor = vtkSmartPointer<vtkLODActor>::New();
  clipActor->SetMapper(clipMapper);
  clipActor->SetBackfaceProperty(backProp);
  clipActor->GetProperty()->SetColor(colors->GetColor3d("banana").GetData());

  auto renderer = vtkSmartPointer<vtkRenderer>::New();

  auto renderWindow = vtkSmartPointer<vtkRenderWindow>::New();
  renderWindow->AddRenderer(renderer);

  auto interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();
  interactor->SetRenderWindow(renderWindow);

  // Add the actors to the renderer, set the background and size
  renderer->AddActor(clipActor);
  renderer->SetBackground(colors->GetColor3d("slate_grey").GetData());

  renderWindow->SetSize(500, 500);

  renderWindow->Render();
  interactor->Start();

  return EXIT_SUCCESS;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/167205.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023新生个人训练赛第08场解题报告

问题 A: Candies 题目描述 We have a 2N grid. We will denote the square at the i-th row and j-th column (1≤i≤2, 1≤j≤N) as (i,j). You are initially in the top-left square, (1,1). You will travel to the bottom-right square, (2,N), by repeatedly moving ri…

鉴源论坛 · 观通丨轨交系统安全性设计

作者 | 刘艳青 上海控安安全测评中心安全测评部测试经理 版块 | 鉴源论坛 观通 引语&#xff1a;第一篇对轨交信号系统从铁路系统分类和组成、城市轨交系统分类和组成、城市轨交系统功能、城市轨交系统发展方面做了介绍&#xff0c;第二篇从信号基础出发&#xff0c;讲述了信…

【蓝桥杯算法 1】AcWing166.飞行员兄弟

本文已收录专栏 &#x1f332;《蓝桥杯周训练》&#x1f332; “飞行员兄弟”这个游戏&#xff0c;需要玩家顺利的打开一个拥有 16 个把手的冰箱。 已知每个把手可以处于以下两种状态之一&#xff1a;打开或关闭。 只有当所有把手都打开时&#xff0c;冰箱才会打开。 把手可…

支持数位板的远程软件,实现远程使用 Wacom 数位板

现在数位板越来越流行了&#xff0c;影视、动漫、游戏、设计等行业经常需要用到。Wacom 是数位板领域的全球领导者&#xff0c;其设备为创意人员带来了真正的纸感绘图体验。 数位板用户需要远程办公的时候&#xff0c;经常会遇到两个问题&#xff1a;远程软件不支持数位板、远…

(考研湖科大教书匠计算机网络)第一章概述-第五节1:计算机网络体系结构之分层思想和举例

文章目录一&#xff1a;计算机网络结构分层的必要性&#xff08;1&#xff09;分层思想&#xff08;2&#xff09;计算机网络分层思想①&#xff1a;如何让两台计算机通过网线传输数据②&#xff1a;如何让分组在单个网络内传输③&#xff1a;如何让分组在网络间传输④&#xf…

SpringBoot项目练习

项目名称&#xff1a;旅游网站后台管理一&#xff1a;项目简介旅游网站后台管理,包括如下用户&#xff1a;旅游线路&#xff1a;线路图片&#xff1a;线路分类&#xff1a;旅行社&#xff1a;后台技术&#xff1a;springboot、mybatis、mybatis plus前台&#xff1a;bootstrap、…

测试开发 | 专项测试技术初识Hook

本文节选自霍格沃兹测试学院内部教材Hook 技术需要预先分析目标应用的源代码和逻辑&#xff0c;根据目标测试场景设置目标、逻辑和数据&#xff0c;然后运行时动态的对目标函数参数值、逻辑或者返回值做修改&#xff0c;达到修改现有函数逻辑、实现目标测试场景的目的。Hook的价…

JavaWeb基础(一) Mybatis使用详解

JavaWeb基础——Mybatis 1&#xff0c;配置文件实现CRUD 如上图所示产品原型&#xff0c;里面包含了品牌数据的 查询 、按条件查询、添加、删除、批量删除、修改 等功能&#xff0c;而这些功能其实就是对数据库表中的数据进行CRUD操作。接下来我们就使用Mybatis完成品牌数据的…

3-2存储系统-主存与CPU的连接外部存储器

文章目录一.主存与CPU的连接&#xff08;一&#xff09;连接原理&#xff08;二&#xff09;主存容量的扩展1.位扩展法2.字扩展法3.字位同时扩展法&#xff08;三&#xff09;存储芯片的地址分配和片选1.线选法2.译码片选法二.外部存储器&#xff08;一&#xff09;磁盘储存器1…

JVM-三色标记

一、什么叫三色标记三色也叫三色抽象&#xff0c;它是所有mutator和collector都必须遵守的定律。它把对象标记为三种颜色&#xff1a;白色&#xff1a;对象还未被垃圾收集器访问&#xff0c;在回收的开始阶段所有的对象均为白色&#xff08;当然了这只是指概念上的&#xff0c;…

PaddleNLP开源UTC通用文本分类技术,斩获ZeroCLUE、FewCLUE双榜第一

飞桨PaddlePaddle 2023-01-12 20:02 发表于湖北 针对产业级分类场景中任务多样、数据稀缺、标签迁移难度大等挑战&#xff0c;百度提出了一个大一统的通用文本分类技术UTC&#xff08;Universal Text Classfication&#xff09;。 UTC在ZeroCLUE和FewCLUE两个榜单上均位居榜首…

css加载会造成阻塞吗?

目录 A.设置网络加载速度 B.css加载会阻塞DOM树的解析渲染吗&#xff1f; 1.css会阻塞DOM树解析&#xff1f; 2.css加载会阻塞DOM树渲染&#xff1f; 3.个人对这种机制的评价 3.css加载会阻塞js运行吗&#xff1f; 4.结论 可以使用以下几种方法解决CSS加载速度的问题: …

曲线曲率介绍和python求法

目录曲率1.1 弧长参数 s参考资料曲率 比如我们想知道曲线 AB\boldsymbol{AB}AB 上任一点处的弯曲程度怎么办呢&#xff1f;这时就需要一个十分重要的概念——曲率。 维基百科&#xff1a; 在数学中&#xff0c;曲率&#xff08;curvature&#xff09;是描述几何体弯曲程度的量…

Octave安装与使用

1. 介绍 Octave是一种编程语言&#xff0c;旨在解决线性和非线性的数值计算问题。Octave为GNU项目下的开源软件&#xff0c;早期版本为命令行交互方式&#xff0c;4.0.0版本发布基于QT编写的GUI交互界面。Octave语法与Matlab语法非常接近&#xff0c;可以很容易的将matlab程序…

机器学习/人工智能 实验二:图像特征自动学习方法实践与分析

写在前面 参考的是https://zh.d2l.ai/index.html 一、实验目的与要求 (1)利用基于深度学习的特征自动学习方法完成图像特征提取的实验方案的设计。 (2)编程并利用相关软件完成实验测试&#xff0c;得到实验结果。 (3)通过对实验数据的分析、整理&#xff0c;得出实验结论&am…

Unity | 序列化(Serialized)和反序列化(NonSerialized)是什么意思

一、什么是序列化 官方叙述&#xff1a;序列化是将对象的状态信息转换为可以存储或传输的形式的过程。 人话叙述&#xff1a;我们平时输入的代码&#xff0c;实际上是不能储存或者传输的&#xff0c;所以我们需要翻译一下&#xff0c;翻译成能储存或者翻译的文字&#xff0c;这…

【SpringBoot 学习】52、SpringBoot 使用 grpc 实现远程服务调用

文章目录一、SpringBoot 使用 grpc 实现远程服务调用1、服务端编写2、客户端编写一、SpringBoot 使用 grpc 实现远程服务调用 gRPC 是一个现代的、开源的、高性能的远程过程调用&#xff08;RPC&#xff09;框架&#xff0c;可以在任何地方运行。gRPC 使客户端和服务器应用程序…

Java-Thread多线程的使用

Java-Thread多线程的使用一、线程&#xff0c;进程&#xff0c;并发&#xff0c;并行的概念1.进程2.线程3.并发和并行二、线程的创建和使用1.通过继承Thread类&#xff0c;重写run方法2.实现Runnable接口&#xff0c;重写run方法3.使用案例三、线程的常用方法四、线程的退出和中…

关于机器人状态估计(11)-VIO单目与双目/雷达Lidar SLAM/未来的机器人

写这篇文章的时候刚发生行业大事件&#xff1a; Google收购ROS 其实一开始还是水&#xff0c;绝对大量文不对题&#xff0c;但是必有干货&#xff0c;毕竟用的是这个关键的系列标题。 最近有几件行业内发生的大小事&#xff0c;让我觉得有必要更一下。 首先是Livox的mid-360…

VueUse(中文)——核心函数:State相关函数

VueUse官方地址 一、createGlobalState 将状态保持在全局范围内&#xff0c;以便跨Vue实例重用 1、没有持久性(存储在内存中) 例如&#xff1a; 或者 2、持久性存储 使用useStorage()存储在localStorage:例如&#xff1a; 组件使用&#xff1a; 二、createInjectionSt…