VTK- PointLocator

news2025/1/11 2:32:25

欢迎大家加入VTK社区雪易VTK社区-CSDN社区云

小结:本博文主要针对VTK中的PointLocator的分类及各接口的用途进行讲解,PointLocator主要用途为点的位置计算,希望能为各位小伙伴有所帮助。

vtk中关于Locator的关系图

目录

 vtkLocator

vtkAbstractPointLocator

vtkIncrementalPointLocator

vtkIncrementalOctreePointLocator

vtkPointLocator

vtkMergePoints

vtkNonMergingPointLocator

vtkKdTreePointLocator

vtkOctreePointLocator

vtkStaticPointLocator

vtkStaticPointLocator2D


vtkLocator

描述:vtkLocator是空间搜索对象或定位对象的基类。vtkLocator的工作原理是将三维空间切分为很多小区域,这样在点定位、线相交和对象之间的相交的问题求解时,可以快速给出响应。

vtkLocator作为基类,为所有的Locator接口提供数据成员和方法。

Locator的工作原理如下:

1. 在Locator划分的区域中插入一个或多个“entities”,比如Point或者Cell。这些“entities”占一个或多个区域。

2. 执行几何操作时,先对区域进行操作,若结果为正,则对区域中的“entities”进行操作。例如在碰撞测试时,首先碰撞定位器识别相交的区域,若发现交集,在对区域中的"entities"进行相交计算。

为了提高速度,Locator采用树形结构。

vtkAbstractPointLocator

描述:vtkAbstractPointLocator是一个在3D中快速定位点的基类。它将3D空间划分为规则的区域,将将Points放置在这些区域中。一个典型的操作就是找出给定点的最近点。

三个常用的虚函数

//@{
  /**
   * Given a position x, return the id of the point closest to it. Alternative
   * method requires separate x-y-z values.
   * These methods are thread safe if BuildLocator() is directly or
   * indirectly called from a single thread first.
   */
  virtual vtkIdType FindClosestPoint(const double x[3]) = 0;
  vtkIdType FindClosestPoint(double x, double y, double z);
  //@}

  /**
   * Given a position x and a radius r, return the id of the point
   * closest to the point in that radius.
   * dist2 returns the squared distance to the point.
   */
  virtual vtkIdType FindClosestPointWithinRadius(
    double radius, const double x[3], double& dist2) = 0;

  //@{
  /**
   * Find the closest N points to a position. This returns the closest
   * N points to a position. A faster method could be created that returned
   * N close points to a position, but necessarily the exact N closest.
   * The returned points are sorted from closest to farthest.
   * These methods are thread safe if BuildLocator() is directly or
   * indirectly called from a single thread first.
   */
  virtual void FindClosestNPoints(int N, const double x[3], vtkIdList* result) = 0;
  void FindClosestNPoints(int N, double x, double y, double z, vtkIdList* result);
  //@}

  //@{
  /**
   * Find all points within a specified radius R of position x.
   * The result is not sorted in any specific manner.
   * These methods are thread safe if BuildLocator() is directly or
   * indirectly called from a single thread first.
   */
  virtual void FindPointsWithinRadius(double R, const double x[3], vtkIdList* result) = 0;
  void FindPointsWithinRadius(double R, double x, double y, double z, vtkIdList* result);
  //@}

vtkIncrementalPointLocator

描述:vtkIncreamentalPointLocator是一个既支持点定位也支持点插入的基类。

该Filter可支持点插入功能,搜索结构保持动态增加。以下是两个支持插入点的Filter。vtkIncrementalOctreePointLocator是vtkPointLocator所有功能的基于八叉树的加速实现。

vtkPointLocator

描述:vtkPointLocator是一个在3D中快速定位点的类。它将3D空间划分为规则的区域,将将Points放置在这些区域中。一个典型的操作就是找出给定点的最近点。

vtkPointLocator有两种不同的交互方法。在第一种方法中,您为它提供一个数据集,它对数据集中的点进行操作。在第二种方法中,为它提供一个点数组,对象对数组进行操作。

vtkMergePoints

描述:vtkMergePoints是一个定位器对象,用于快速定位3D中的点。

vtkMergePoints与其父类vtkPointLocator之间的主要区别是vtkMergePoints精确地合并重合点,因此要快得多。

  //@{
  /**
   * Determine whether point given by x[3] has been inserted into points list.
   * Return id of previously inserted point if this is true, otherwise return
   * -1.
   * 判断点x是否被插入到点列表中,若插入则但会id,若没有插入则返回-1
   */
  vtkIdType IsInsertedPoint(const double x[3]) override;
  vtkIdType IsInsertedPoint(double x, double y, double z) override
  {
    return this->vtkPointLocator::IsInsertedPoint(x, y, z);
  }
  //@}
//实现步骤
//定位点x所在的Bucket的id
//查看id是否在Table表中,若不在,则表示该点不在点列表中
//若存在,则获取Bucket中的点,并于点下进行比较,返回一致点的Id
vtkIdType vtkMergePoints::IsInsertedPoint(const double x[3])
{
  //
  //  Locate bucket that point is in.
  //
  vtkIdType idx = this->GetBucketIndex(x);

  vtkIdList* bucket = this->HashTable[idx];

  if (!bucket)
  {
    return -1;
  }
  else // see whether we've got duplicate point
  {
    //
    // Check the list of points in that bucket.
    //
    vtkIdType ptId;
    vtkIdType nbOfIds = bucket->GetNumberOfIds();

    // For efficiency reasons, we break the data abstraction for points
    // and ids (we are assuming and vtkIdList
    // is storing ints).
    vtkDataArray* dataArray = this->Points->GetData();
    vtkIdType* idArray = bucket->GetPointer(0);
    if (dataArray->GetDataType() == VTK_FLOAT)
    {
      float f[3];
      f[0] = static_cast<float>(x[0]);
      f[1] = static_cast<float>(x[1]);
      f[2] = static_cast<float>(x[2]);
      vtkFloatArray* floatArray = static_cast<vtkFloatArray*>(dataArray);
      float* pt;
      for (vtkIdType i = 0; i < nbOfIds; i++)
      {
        ptId = idArray[i];
        pt = floatArray->GetPointer(0) + 3 * ptId;
        if (f[0] == pt[0] && f[1] == pt[1] && f[2] == pt[2])
        {
          return ptId;
        }
      }
    }
    else
    {
      // Using the double interface
      double* pt;
      for (vtkIdType i = 0; i < nbOfIds; i++)
      {
        ptId = idArray[i];
        pt = dataArray->GetTuple(ptId);
        if (x[0] == pt[0] && x[1] == pt[1] && x[2] == pt[2])
        {
          return ptId;
        }
      }
    }
  }

  return -1;
}

 

  /**
   * Determine whether point given by x[3] has been inserted into points list.
   * Return 0 if point was already in the list, otherwise return 1. If the
   * point was not in the list, it will be ADDED.  In either case, the id of
   * the point (newly inserted or not) is returned in the ptId argument.
   * Note this combines the functionality of IsInsertedPoint() followed
   * by a call to InsertNextPoint().
   * 判断点x是否加入到点列表中,若已加入则返回0,否则返回1。
   * 若点x未在点列表中,则会将其加入。加入的id将会在ptId中返回。
   */
  int InsertUniquePoint(const double x[3], vtkIdType& ptId) override;
//实现步骤
//定位点x所在的Bucket的id
//查看id是否在Table表中
//若存在,则获取Bucket中的点,并于点下进行比较,若存在一致点则返回0,Id为一致点的Id
//若不存在,则通过InsertNextId和InsertPoint将该点添加,并Id设为一致点的Id
int vtkMergePoints::InsertUniquePoint(const double x[3], vtkIdType& id)
{
  //
  //  Locate bucket that point is in.
  //
  vtkIdType idx = this->GetBucketIndex(x);
  vtkIdList* bucket = this->HashTable[idx];

  if (bucket) // see whether we've got duplicate point
  {
    //
    // Check the list of points in that bucket.
    //
    vtkIdType ptId;
    vtkIdType nbOfIds = bucket->GetNumberOfIds();

    // For efficiency reasons, we break the data abstraction for points
    // and ids (we are assuming vtkPoints stores a vtkIdList
    // is storing ints).
    vtkDataArray* dataArray = this->Points->GetData();
    vtkIdType* idArray = bucket->GetPointer(0);

    if (dataArray->GetDataType() == VTK_FLOAT)
    {
      float f[3];
      f[0] = static_cast<float>(x[0]);
      f[1] = static_cast<float>(x[1]);
      f[2] = static_cast<float>(x[2]);
      float* floatArray = static_cast<vtkFloatArray*>(dataArray)->GetPointer(0);
      float* pt;
      for (vtkIdType i = 0; i < nbOfIds; ++i)
      {
        ptId = idArray[i];
        pt = floatArray + 3 * ptId;
        if (f[0] == pt[0] && f[1] == pt[1] && f[2] == pt[2])
        {
          // point is already in the list, return 0 and set the id parameter
          id = ptId;
          return 0;
        }
      }
    }
    else
    {
      // Using the double interface
      double* pt;
      for (vtkIdType i = 0; i < nbOfIds; ++i)
      {
        ptId = idArray[i];
        pt = dataArray->GetTuple(ptId);
        if (x[0] == pt[0] && x[1] == pt[1] && x[2] == pt[2])
        {
          // point is already in the list, return 0 and set the id parameter
          id = ptId;
          return 0;
        }
      }
    }
  }
  else
  {
    // create a bucket point list and insert the point
    bucket = vtkIdList::New();
    bucket->Allocate(this->NumberOfPointsPerBucket / 2, this->NumberOfPointsPerBucket / 3);
    this->HashTable[idx] = bucket;
  }

  // point has to be added
  bucket->InsertNextId(this->InsertionPointId);
  this->Points->InsertPoint(this->InsertionPointId, x);
  id = this->InsertionPointId++;

  return 1;
}

 

vtkNonMergingPointLocator

描述:作为vtkPointLocator的一个特殊子类,vtkNonMergingPointLocator用于直接/无检查地将点插入到vtkPoints对象中。换句话说,任何给定的点总是直接插入的。这个名字强调了这个类与其兄弟类vtkMergePoints之间的区别,后者通过利用父类vtkPointLocator使用的统一bin机制来执行基于检查的零容忍点插入(或“合并”完全重复/重合的点)。vtkPointLocator允许一般(零和非零)公差点插入以及点定位。

vtkIncrementalOctreePointLocator

vtkKdTreePointLocator

vtkOctreePointLocator

vtkStaticPointLocator

vtkStaticPointLocator2D

 

 

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

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

相关文章

软件测试基础理论体系学习4-单元测试的目的?概念是什么?过程是什么?

4-单元测试的目的&#xff1f;概念是什么&#xff1f;过程是什么&#xff1f;1 单元测试目的1.1 单元测试的错误认识1.2 单元测试的重要性1.2.1 时间方面1.2.2 测试效果1.2.3 测试成本1.2.4 产品质量1.3 单元测试的优点1.3.1 它是一种验证行为1.3.2 它是一种设计行为1.3.3 它是…

CPU是什么

CPU&#xff08;Central Processing Unit&#xff09;是计算机系统的运算和控制核心&#xff0c;是信息处理、程序运行的最终执行单元&#xff0c;相当于系统的“大脑”。当 CPU 过于繁忙&#xff0c;就像“人脑”并发处理过多的事情&#xff0c;会降低做事的效率&#xff0c;严…

Postman安装和运行

下载安装 Postman是一个方便用于构造请求的软件.可以以简单的方式来构造请求. 要下载软件,还是同样的话,要去官网下载.这里我们直接将官网地址放在这里. https://www.postman.com/downloads/ 进入官网以后,点击windows 64-bit(图中圈起来的部分)即可下载. 下载好以后双击安…

java小技能:JWT认证实现

文章目录 引言I. 预备知识1.1 关键字去空格处理II token组成2.1 头部(Header)2.2 有效载荷(Playload)2.3 签名(Signature)2.4 代码实现:生成tokenIII 验证token3.1 网关验证token3.2 使用拦截器验证token引言 认证流程 I. 预备知识 1.1 关键字去空格处理

前端复制粘贴方式上传图片

最近在做一个论坛的项目&#xff0c;发布评论的时候&#xff0c;很多时候会用到截图上传的功能&#xff0c;通过微信截图&#xff0c;QQ截图&#xff0c;直接将截取的图片通过Ctrlv 复制到输入框里&#xff0c;自动上传将图片渲染到页面上&#xff0c;今天就来实现一个这样的功…

BOS金蝶云星空:表单插件设置单据体背景色

一.效果图&#xff1a; 备注&#xff1a;只适用于只读列 二.代码案例&#xff1a; 自定义单据提附加背景色方法&#xff1a; /// /// 设置单据体背景颜色 /// /// 实体 /// 行 /// 字段 /// 颜色代码 private void SetEntityBackgoundColor(string entityKey, int row, st…

【面试题】大厂面试题分享:如何让(a===1a===2a===3)的值为true?

大厂面试题分享 面试题库 前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 当我第一次看到这一题目的时候&#xff0c;我是比较震惊的&#xff0c;分析了下很不合我们编程的常理&#xff0c;并认为不大可能&#…

面试官:断网了,还能 ping 通 127.0.0.1 吗?

你女神爱不爱你&#xff0c;你问她&#xff0c;她可能不会告诉你。 ‍ 但网通不通&#xff0c;你 ping 一下就知道了。 可能看到标题&#xff0c;你就知道答案了&#xff0c;但是你了解背后的原因吗&#xff1f; 那如果把 127.0.0.1 换成 0.0.0.0 或 localhost 会怎么样呢&…

Win10用命令行编译带有cuda的opencv

0. 环境 笔记本win10 NVIDIA GeForce GTX 1660 Ti 1. 准备x64 Native Tools Command Prompt 1.1 准备Visual Studio Installer 需要安装visual studio 2019 1.2 安装工作负荷 为了安装x64 Native Tools Command Prompt&#xff0c;勾上使用C的桌面开发 安装完毕后&#xf…

Latent Class Modeling lca

潜类别模型&#xff08;Latent Class Modeling&#xff09; 潜在类别分析&#xff08;LCA&#xff09;数据分析流程&#xff08;详细版&#xff09; - 简书 (jianshu.com) R数据分析&#xff1a;用R语言做潜类别分析LCA - 知乎 (zhihu.com) About Latent Class Modeling -…

Postman(六): postman定义公共函数

Postman(11): postman定义公共函数 postman定义公共函数 在postman中&#xff0c;如下面的代码&#xff1a; 1、返回元素是否与预期值一致 var assertEqual(name,actual,expected)>{tests[${name}&#xff1a;实际结果&#xff1a; ${actual} &#xff0c; 期望结果&…

PDF转Excel怎么转?这些方法值得收藏

在我们的工作生活中&#xff0c;避免不了Excel表格的使用&#xff0c;当我们遇到想要将PDF文件中的信息转换制作成表格的时候&#xff0c;要怎么做呢&#xff1f;毕竟&#xff0c;PDF文件是一个不易编辑的格式&#xff0c;我们想复制其中的内容就较为的麻烦。一般这种时候&…

何止一个惨字形容,水滴 Java 面试一轮游,壮烈了,问啥啥不会,数据库血崩

static 关键字是用来干什么的&#xff0c;static 修饰的方法里面可以使用非静态的成员变量吗&#xff0c;为什么呢 private 修饰的方法是否可以被子类覆盖 覆盖和重载有什么区别 进程跟线程的区别 Java 中创建线程有几种方式 a. 反思&#xff1a;讲完三种方式之后&#xff…

Python——文件

文件 概念 我们常见的txt,jpg,mp4等等都是文件&#xff0c;存储在硬盘中的内容&#xff0c;就是文件&#xff0c;而文件夹是一种特殊的文件——目录文件 路径 一层一层文件夹组成的字符串就是路径&#xff0c;每一个文件的路径都是唯一的&#xff0c;相当于身份证号&#x…

卷积、自相关函数、功率谱密度

文章目录1、自相关函数和卷积2、自相关函数的傅里叶变换最近我在思考为什么&#xff1a; 为什么随机过程的自相关函数和其功率谱密度是一对傅里叶变换&#xff1f;1、自相关函数和卷积 这俩跟孪生兄弟似的&#xff0c;经常一起出现&#xff0c;我们先来看看自相关函数和卷积的…

【读书笔记】曾国藩的正面与侧面(二)

本书为全集的第二册&#xff0c;针对曾国藩的整个家族进行了介绍。包括他的兄弟&#xff0c;父母&#xff0c;和子女。 曾国藩的兄弟&#xff1a; 曾国潢&#xff1a;比曾国藩小9岁 是几个兄弟中读书天分最差的一个&#xff0c;但是有一个优点就是勤奋实在&#xff0c;所以在…

案例故事丨老虎国际 x TiDB ,降低架构复杂性,保障全球用户安全可靠投资

券商是一个古老的行业&#xff0c;发展至今已经历了三个时代&#xff1a;第一代券商为传统券商&#xff0c;在线下交易大厅进行买卖&#xff1b;第二代券商开始了电子化进程&#xff0c;从线下到线上进行了浅层服务的转移&#xff0c;改善了用户体验&#xff0c;提高了金融服务…

复习计算机网络——第四章习题记录

1、一台交换机具有24个100Mbps的全双工端口和2个1000Mbps的全双工端口&#xff0c;如果所有的端口都工作在全双工状态&#xff0c;那么交换机总带宽等于: 交换机知识点&#xff1a; &#xff08;1&#xff09;交换机具有24个10或者100Mbps全双工端口连接一般的用户计算机&…

python脚本系列——批量下载清华开源依赖包

一、脚本展示 1.流水线编译过程&#xff0c;执行apk --update add --no-cache xxx 2.报错ERROR&#xff1a; xxx package mentioned in index not found (try apk update) 3.内网环境缺依赖包&#xff0c;需要从清华源下载对应的包&#xff0c;但是需要根据报错一个个找&#x…

[附源码]计算机毕业设计教学辅助系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…