第01章 22 使用 vtkStructuredGrid 实现一个分形的树枝状几何体

news/2025/1/22 12:01:01/

以下是一个简单的示例,展示如何使用 vtkStructuredGrid 实现一个分形的树枝状几何体。我们将基于递归的分形算法生成树枝结构,并将其存储在 vtkStructuredGrid 中。


示例代码

#include <vtkSmartPointer.h>
#include <vtkPoints.h>
#include <vtkStructuredGrid.h>
#include <vtkPolyDataMapper.h>
#include <vtkActor.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkProperty.h>
#include <vtkCellArray.h>
#include <vtkTubeFilter.h>
#include <vtkLine.h>
#include <vtkLookupTable.h>
#include <vtkStructuredGridGeometryFilter.h>
#include <vtkInteractorStyleTrackballCamera.h>
#include <cmath>
#include <vector>// 递归生成树枝分形
void GenerateBranch(vtkSmartPointer<vtkPoints> points, vtkSmartPointer<vtkCellArray> lines, const double start[3], const double end[3], int level, int maxLevel)
{if (level > maxLevel) return;// 添加线段vtkSmartPointer<vtkLine> line = vtkSmartPointer<vtkLine>::New();vtkIdType startId = points->InsertNextPoint(start);vtkIdType endId = points->InsertNextPoint(end);line->GetPointIds()->SetId(0, startId);line->GetPointIds()->SetId(1, endId);lines->InsertNextCell(line);// 计算分支的偏移方向double dir[3] = {end[0] - start[0], end[1] - start[1], end[2] - start[2]};double length = sqrt(dir[0] * dir[0] + dir[1] * dir[1] + dir[2] * dir[2]);for (int i = 0; i < 3; i++) dir[i] /= length;// 计算分支的旋转矩阵double theta = M_PI / 4.0; // 分支角度double rotX[3][3], rotY[3][3], rotZ[3][3];rotX[0][0] = 1; rotX[0][1] = 0;            rotX[0][2] = 0;rotX[1][0] = 0; rotX[1][1] = cos(theta);    rotX[1][2] = -sin(theta);rotX[2][0] = 0; rotX[2][1] = sin(theta);    rotX[2][2] = cos(theta);rotY[0][0] = cos(theta); rotY[0][1] = 0; rotY[0][2] = sin(theta);rotY[1][0] = 0;          rotY[1][1] = 1; rotY[1][2] = 0;rotY[2][0] = -sin(theta); rotY[2][1] = 0; rotY[2][2] = cos(theta);rotZ[0][0] = cos(theta); rotZ[0][1] = -sin(theta); rotZ[0][2] = 0;rotZ[1][0] = sin(theta); rotZ[1][1] = cos(theta);  rotZ[1][2] = 0;rotZ[2][0] = 0;          rotZ[2][1] = 0;           rotZ[2][2] = 1;// 生成新的分支double newEnd[3];for (int i = 0; i < 3; i++){newEnd[i] = end[i] + 0.5 * dir[i]; // 缩短分支长度}// 生成子分支double branch1[3], branch2[3];for (int i = 0; i < 3; i++){branch1[i] = end[i] + 0.5 * (rotX[i][0] * dir[0] + rotX[i][1] * dir[1] + rotX[i][2] * dir[2]);branch2[i] = end[i] + 0.5 * (rotY[i][0] * dir[0] + rotY[i][1] * dir[1] + rotY[i][2] * dir[2]);}// 递归生成子分支GenerateBranch(points, lines, end, branch1, level + 1, maxLevel);GenerateBranch(points, lines, end, branch2, level + 1, maxLevel);
}int main()
{// 创建点集和线段vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();vtkSmartPointer<vtkCellArray> lines = vtkSmartPointer<vtkCellArray>::New();// 定义树的根节点double start[3] = {0, 0, 0};double end[3] = {0, 1, 0};// 生成树枝分形GenerateBranch(points, lines, start, end, 0, 6);// 创建 vtkStructuredGridvtkSmartPointer<vtkStructuredGrid> grid = vtkSmartPointer<vtkStructuredGrid>::New();grid->SetPoints(points);grid->SetDimensions(points->GetNumberOfPoints(), 1, 1);// 将 vtkStructuredGrid 转换为几何数据vtkSmartPointer<vtkStructuredGridGeometryFilter> geometryFilter = vtkSmartPointer<vtkStructuredGridGeometryFilter>::New();geometryFilter->SetInputData(grid);geometryFilter->Update();// 创建映射器vtkSmartPointer<vtkPolyDataMapper> mapper = vtkSmartPointer<vtkPolyDataMapper>::New();mapper->SetInputConnection(geometryFilter->GetOutputPort());// 创建ActorvtkSmartPointer<vtkActor> actor = vtkSmartPointer<vtkActor>::New();actor->SetMapper(mapper);actor->GetProperty()->SetColor(0.4, 0.2, 0.0); // 树枝颜色// 创建渲染器和渲染窗口vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();vtkSmartPointer<vtkRenderWindow> renderWindow = vtkSmartPointer<vtkRenderWindow>::New();renderWindow->AddRenderer(renderer);vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkSmartPointer<vtkRenderWindowInteractor>::New();interactor->SetRenderWindow(renderWindow);// 添加Actor到渲染器renderer->AddActor(actor);// 设置背景颜色renderer->SetBackground(0.1, 0.2, 0.3);// 启动交互renderWindow->Render();interactor->Start();return 0;
}


代码说明

  1. 递归生成树枝

    • 使用递归函数 GenerateBranch 生成树枝的分形结构。
    • 每次递归生成一个分支,并根据旋转矩阵生成新的子分支。
  2. 存储数据

    • 使用 vtkPoints 存储分形树枝的点。
    • 使用 vtkCellArray 存储线段。
  3. 可视化处理

    • 将生成的点集和线段存储到 vtkStructuredGrid 中。
    • 使用 vtkStructuredGridGeometryFilter 将 vtkStructuredGrid 转换为几何数据。
    • 使用 vtkPolyDataMapper 和 vtkActor 进行可视化。
  4. 运行效果

    • 窗口中会显示一个分形的树枝状几何体。
    • 用户可以通过鼠标交互旋转和缩放视角。

编译和运行

  1. 确保已安装 VTK 库,并配置好开发环境。
  2. 使用 CMake 或直接编译代码:
    g++ -o vtk_fractal_tree vtk_fractal_tree.cpp -lvtkCommonCore -lvtkFiltersCore -lvtkRenderingCore -lvtkInteractionStyle
    
  3. 运行生成的可执行文件:
    ./vtk_fractal_tree
    

结果

  • 窗口中会显示一个分形的树枝状几何体。
  • 用户可以通过鼠标交互查看分形的不同角度。

http://www.ppmy.cn/news/1565212.html

相关文章

【C++】引用(上)

1、引用的基本使用 作用&#xff1a;给变量起别名 语法&#xff1a;数据类型&#xff08;该数据类型要与原名的数据类型一致&#xff09; &别名原名&#xff1b; 示例&#xff1a; #include<iostream> using namespace std; int main() {int a 10;int& …

who w who

https://www.ityww.cn/733.html Linux查看用户登录信息命令-w & who & whoami Linux 基础 yvan 8年前 (2017-02-04) 3633次浏览 已收录 0个评论 显示当前已登录用户会话及动作命令-w 格式&#xff1a;w [options] [rootlocalhost ~]# w 23:46:39 up 8:29, 2 users, lo…

Linux:文件描述符fd、系统调用open

目录 一、文件基础认识 二、C语言操作文件的接口 1.> 和 >> 2.理解“当前路径” 三、相关系统调用 1.open 2.文件描述符 3.一切皆文件 4.再次理解重定向 一、文件基础认识 文件 内容 属性。换句话说&#xff0c;如果在电脑上新建了一个空白文档&#xff0…

场馆预定平台高并发时间段预定实现V2

&#x1f3af; 本文档介绍了场馆预订系统接口V2的设计与实现&#xff0c;旨在解决V1版本中库存数据不一致及性能瓶颈的问题。通过引入令牌机制确保缓存和数据库库存的最终一致性&#xff0c;避免因服务器故障导致的库存错误占用问题。同时&#xff0c;采用消息队列异步处理库存…

通过视觉语言模型蒸馏进行 3D 形状零件分割

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01;对应英文要求比较高&#xff0c;特此说明&#xff01; Abstract This paper proposes a cross-modal distillation framework, PartDistill, which transfers 2D knowledge from vision-language models …

一文玩转生成式AI新星DeepSeek-V3,带你5分钟配置自己的随身AI

前言 在人工智能领域&#xff0c;模型的性能与能力一直是衡量其价值的重要标准。近期&#xff0c;DeepSeek-V3 在多项评测中表现优异&#xff0c;超越了 Qwen2.5-72B 和 Llama-3.1-405B 等其他开源模型&#xff0c;并与世界顶尖的闭源模型 GPT-4o 以及 Claude-3.5-Sonnet 不相…

【优选算法】3----快乐数

这是第三篇算法题&#xff0c;也是十分的不好想&#xff0c;虽然定位在简单&#xff0c;但我感觉还是有些难度的~ -------------------------------------begin----------------------------------------- 题目解析&#xff1a; 同样的&#xff0c;这道算法题&#xff0c;看题…

智能系统的感知和决策

智能系统在感知和决策过程中具备的关键能力表现在智能感知/自主判定上&#xff0c;下面可以从感知的本质、自主判断的含义及其在智能系统中的作用进行深入分析。 1、智能感知&#xff1a;信息获取与理解 智能感知是指智能系统通过传感器或其他数据采集手段获取环境中的信息&…