博客
关于我
VTK:Utilities之BoundingBoxIntersection
阅读量:540 次
发布时间:2019-03-09

本文共 3119 字,大约阅读时间需要 10 分钟。

VTK:Utilities之BoundingBoxIntersection

VTK:Utilities之BoundingBoxIntersection

代码

BoundingBoxIntersection.cxx

#include        int main(int,

不完全是代码示例,但涉及到VTK框mgrs的交点 UClass。

VTK是动态计算机几何图形库,powerful用途之一在于其强大的绘制与数据处理功能。其中,Utilities类中的BoundingBoxIntersection工具可能是用于计算多个矩形或者box的交点。我大概搞了下,让你了解一下这_block。

你听说过VTK框mgrs的交点 ComputeIntersection 命令吗?它确实是处理盒子交点的一种高效方式。在VTK 9.0及以上版本中,ComputeIntersection已经从被移除了,所以我决定研究下它的内部实现逻辑,即BoundingBoxIntersection类。

为了学习这个,我需要看看它的头文件,找到对应的定义,在本地的project中找到#include <vtkBoundingBox.h>。

为了让你更方便理解,我会附上一些代码片段。比如:

#include "vtkBoundingBox.h"...int main(int* argc, char** argv) {  try {    vtkSmartPointer
box1 = vtkSmartPointer
::New(); vtkSmartPointer
box2 = vtkSmartPointer
::New(); // 初始化两个box box1->SetBounds(0, 1, 0, 1); box2->SetBounds(1, 3, 0, 1); // 计算交点 double* inter = box1->ComputeIntersection(box2); std::cout << "交点为:" << inter[0] << ", " << inter[1] << std::endl; } catch (const std::exception& e) { std::cerr << e.what(); }}

这段代码对吗?我发现可能有问题,因为ComputeIntersection可能已经是被移除的功能。抱歉,可能哪里写错了。

我得了一个错误提示,说ComputeIntersection已经不在vtkInteraction.h中。我应该检查或者换用其他函数,比如GetBounds*/ComputeIntersection等方式?

我回去查看官方文档,发现似乎确实不支持ComputeIntersection了。那么,这意味着我的最初想法有误。

或许kvchi我应该去学习Box的交点算法本身,而不是依赖VTK的现成函数。毕竟,理解算法本身会更有意义。

那么,我应该怎么做呢?我需要再找一些资料。网上有个项目好像实现过类似的功能,叫做BoxIntersection。让它在头文件中声明。

原来,VTK并不支持ComputeIntersection了。根据官方文档,推荐迁移到用GetBounds()方法,然后手动计算交点。听起来有点麻烦,但或许可行。

比如,我可以这样做:

  • 对两个box,调用GetBounds()获取各自的x、y、z范围。
  • 两边比较,看看每个轴上是覆盖与不交。
  • 如果有交点,则交点必须落在两个box的共同区域内。
  • 好的,有了想法,现在我来尝试写代码。

    代码示例:

    #include "vtk(env.h)"#include "vtkнити.h"using namespace std;int main(int* argc, char** argv) {  try {    vtkSmartPointer
    box1 = vtkSmartPointer
    ::New(); vtkSmartPointer
    box2 = vtkSmartPointer
    ::New(); // 标识box1的范围 box1->SetBounds(0.0, 2.0, 0.0, 0.0); // 标识box2的范围 box2->SetBounds(1.0, 3.0, 0.5, 1.5); // 获取两个box的界限 double* bounds1 = box1->GetBounds(); double* bounds2 = box2->GetBounds(); // 计算交点 double x1_start = bounds1[0]; double x1_end = bounds1[1]; double x2_start = bounds2[0]; double x2_end = bounds2[1]; double x_low = max(x1_start, x2_start); double x_high = min(x1_end, x2_end); double y_low = max(boundss1[2], bounds2[2]); double y_high = min(boundss1[3], bounds2[3]); double z_low = max(boundss1[4], bounds2[4]); double z_high = min(boundss1[5], bounds2[5]); // 生成交点新box vtkSmartPointer
    resultBox = vtkSmartPointer
    ::New(); resultBox->SetBounds(x_low, x_high, y_low, y_high, z_low, z_high); resultBox->safeDelete(); } catch (const std::exception& e) { cerr << "错误:" << e.what(); } return EXIT_SUCCESS;}

    这样,我就用手动计算的方法实现了box之间的交点。这个方法虽然不够高效,但对理解逻辑是很有帮助。

    这可能就是VTK中BoundingBoxIntersection的思想方式。当然,你可以改进它,添加到一个更通用的库中,但这已经是个不错的开始了。

    如果你需要优化这个代码,比如让它工作更快,可能需要加一些线程化处理或者利用一些数学优化算法。但那可能超出我们的当前范围。对于学习性质来说,这样的代码已经足够了。

    别担心,你可以找到更多资料来学习vtkbox的交点算法。毕竟,每个人的实现方式可能不同,但思路是相似的。希望你在这个过程中学到了其中的关键思路和实现方法。

    如果你遇到问题,不妨查阅相关的VTK教程或者在开发者论坛寻求帮助。毕竟,开放源代码的力量就在于它的社区支持。

    转载地址:http://pfliz.baihongyu.com/

    你可能感兴趣的文章
    MySQL 数据类型和属性
    查看>>
    mysql 敲错命令 想取消怎么办?
    查看>>
    Mysql 整形列的字节与存储范围
    查看>>
    mysql 断电数据损坏,无法启动
    查看>>
    MySQL 日期时间类型的选择
    查看>>
    Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度)
    查看>>
    MySQL 是如何加锁的?
    查看>>
    MySQL 是怎样运行的 - InnoDB数据页结构
    查看>>
    mysql 更新子表_mysql 在update中实现子查询的方式
    查看>>
    MySQL 有什么优点?
    查看>>
    mysql 权限整理记录
    查看>>
    mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
    查看>>
    MYSQL 查看最大连接数和修改最大连接数
    查看>>
    MySQL 查看有哪些表
    查看>>
    mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
    查看>>
    MySql 查询以逗号分隔的字符串的方法(正则)
    查看>>
    MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
    查看>>
    mysql 查询,正数降序排序,负数升序排序
    查看>>
    MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
    查看>>
    mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
    查看>>