VTK|类似CloudCompare的比例尺实现2-vtk实现

news2025/5/19 4:14:15

文章目录

  • 实现类头文件
  • 实现类源文件
  • 调用逻辑
  • 关键问题
    • 缩放限制问题
    • 投影模式
  • 项目git链接

实现类头文件

以下是对你提供的 ScaleBarController.h 头文件添加详细注释后的版本,帮助你更清晰地理解每个成员和方法的用途,尤其是在 VTK 中的作用:


#ifndef SCALEBARCONTROLLER_H
#define SCALEBARCONTROLLER_H

#include <vtkSmartPointer.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkTextActor.h>
#include <vtkLineSource.h>
#include <vtkPolyDataMapper2D.h>
#include <vtkActor2D.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkCallbackCommand.h>

// 管理并绘制屏幕固定像素长度的比例尺控制器
class ScaleBarController
{
   
public:
    // 构造函数,初始化渲染器、窗口和交互器
    ScaleBarController(vtkSmartPointer<vtkRenderer> renderer,
                       vtkSmartPointer<vtkRenderWindow> renderWindow,
                       vtkSmartPointer<vtkRenderWindowInteractor> interactor);

    // 更新比例尺显示内容(长度、位置、标签等)
    void UpdateScaleBar();

    // 当比例尺需要重新添加回 renderer 时调用(如清空或重建渲染场景后)
    void ReAddToRenderer();

private:
    // 交互事件的静态回调函数,用于处理缩放限制、比例尺更新等逻辑
    static void OnInteractionEvent(vtkObject *caller, unsigned long eid,
                                   void *clientdata, void *calldata);

    // 创建比例尺的 VTK 对象,包括线段和文字
    void CreateScaleBarActors();

    // 获取当前屏幕下 1 像素对应多少 world 单位(单位:world units / pixel)
    double GetCurrentScaleFactor();

    // 根据传入的真实比例长度,计算美观的跳变长度(如:0.5 → 1 → 5 → 10...)
    double ComputeRoundedLength(double length);

    // -------------------------
    // VTK 渲染相关对象
    // -------------------------
    vtkSmartPointer<vtkRenderer> renderer_;               // 场景渲染器
    vtkSmartPointer<vtkRenderWindow> renderWindow_;       // 渲染窗口
    vtkSmartPointer<vtkRenderWindowInteractor> interactor_; // 用户交互器

    // -------------------------
    // 比例尺的绘制元素
    // -------------------------
    vtkSmartPointer<vtkLineSource> lineSource_;           // 比例尺的线段
    vtkSmartPointer<vtkPolyDataMapper2D> lineMapper_;     // 2D 映射器
    vtkSmartPointer<vtkActor2D> lineActor_;               // 2D 绘制 actor

    vtkSmartPointer<vtkTextActor> scaleText_;             // 比例尺文字标签(显示数值)

    vtkSmartPointer<vtkCallbackCommand> interactionCallback_; // 鼠标缩放事件监听回调

    // -------------------------
    // 状态控制参数
    // -------------------------
    const int pixelLength_ = 200; // 比例尺在屏幕上固定显示的像素长度(单位 px)

    double lastValidParallelScale_ = 1.0;  // 上一次合法 Parallel 投影的相机缩放值
    double lastValidCameraDistance_ = 1.0; // 上一次合法 Perspective 投影的相机距离
};

#endif // SCALEBARCONTROLLER_H

实现类源文件

以下是你提供的 ScaleBarController.cpp 文件的完整代码分析版,我已逐行添加关键注释,帮助你清晰理解每段逻辑的作用,特别是与 VTK 比例尺渲染、缩放监听、状态回退控制 相关的部分:


#include "ScaleBarController.h"
#include <vtkTextProperty.h>
#include <vtkCoordinate.h>
#include <vtkCamera.h>
#include <sstream>
#include <iomanip>

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

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

相关文章

阿里巴巴开源移动端多模态LLM工具——MNN

MNN 是一个高效且轻量级的深度学习框架。它支持深度学习模型的推理和训练&#xff0c;并在设备端的推理和训练方面具有行业领先的性能。目前&#xff0c;MNN 已集成到阿里巴巴集团的 30 多个应用中&#xff0c;如淘宝、天猫、优酷、钉钉、闲鱼等&#xff0c;覆盖了直播、短视频…

【漫话机器学习系列】256.用 k-NN 填补缺失值

用 k-NN 填补缺失值&#xff1a;原理、实现与应用 在实际的数据科学项目中&#xff0c;我们经常会遇到数据缺失&#xff08;Missing Values&#xff09;的问题。缺失值如果处理不当&#xff0c;不仅会影响模型训练&#xff0c;还可能导致最终结果偏差。 今天&#xff0c;我们…

金格iWebOffice控件在新版谷歌Chrome中不能加载了怎么办?

金格iWebOffice控件是由江西金格网络科技有限责任公司开发的中间件软件&#xff0c;主要用于在浏览器中直接编辑Word、Excel、PowerPoint等Office文档&#xff0c;曾经是一款优秀国产的WebOffice插件。 由于2022年Chrome等浏览器取消支持PPAPI接口&#xff0c;导致这款金格iWe…

实验6分类汇总

设计性实验 (1)查询每门课程的平均分,包括课程号和平均分。 SELECT Cno AS 课程号, AVG(Degree) AS 平均分 FROM Score065 GROUP BY Cno;(2)查询每门课程的平均分,包括课程号、课程名和平均分。 SELECT c.Cno AS 课程号, c.Cname AS 课程名, AVG(sc.Degree) AS 平均分 FROM …

如何通过交流沟通实现闭环思考模式不断实现自身强效赋能-250517

感谢一直以来和我交流沟通的朋友们。 闭环思考 文字部分(25-05-04)这一天是青年节,在这一天与青年朋友交流这个是事先规划好的: “可以猜一猜,博士会被撤销吗?导师会被处理吗?千万不要回复,放心里,过段时间看结果,看看自己预估社会能力如何。 观察社会新闻,可以用…

Python 3.11详细安装步骤(包含安装包)Python 3.11详细图文安装教程

文章目录 前言Python 3.11介绍Python 3.11安装包下载Python 3.11安装步骤 前言 作为当前最热门的编程语言之一&#xff0c;Python 3.11 不仅拥有简洁优雅的语法&#xff0c;还在性能上实现了飞跃&#xff0c;代码运行速度提升显著。无论是初入编程的小白&#xff0c;还是经验丰…

一个指令,让任意 AI 快速生成思维导图

大家好&#xff0c;我是安仔&#xff0c;一个每天都在压榨 AI 的躺平打工人。 今天分享一个 AI 办公小技巧&#xff0c;让你用一个指令让 AI 生成思维导图。 DeepSeek、Kimi、豆包都可以哈 &#xff5e; KimiXMind 安仔经常用 XMind 来绘制思维导图&#xff0c;但是 AI 是没…

FPGA图像处理(六)------ 图像腐蚀and图像膨胀

默认迭代次数为1&#xff0c;只进行一次腐蚀、膨胀 一、图像腐蚀 1.相关定义 2.图像腐蚀效果图 3.fpga实现 彩色图像灰度化&#xff0c;灰度图像二值化&#xff0c;图像缓存生成滤波模块&#xff08;3*3&#xff09;&#xff0c;图像腐蚀算法 timescale 1ns / 1ps // // Des…

LVDS系列12:Xilinx Ultrascale系可编程输入延迟(二)

本节讲解Ultrascale IDELAYE3的参数&#xff1b;  IDELAYE3参数&#xff1a; REFCLK_FREQUENCY&#xff1a;如果使用COUNT模式&#xff0c;保持300MHz的默认值即可&#xff1b; 如果使用TIME模式&#xff0c;则该值与IDELAYCTRL参考时钟要匹配&#xff1b; DELAY_SRC&#…

ARM (Attention Refinement Module)

ARM模块【来源于BiSeNet】&#xff1a;细化特征图的注意力&#xff0c;增强重要特征并抑制不重要的特征。 Attention Refinement Module (ARM) 详解 ARM (Attention Refinement Module) 是 BiSeNet 中用于增强特征表示的关键模块&#xff0c;它通过注意力机制来细化特征图&…

国产免费工作流引擎star 6.5k,Warm-Flow升级1.7.2(新增案例和修复缺陷)

文章目录 主要更新内容项目介绍功能思维导图设计器流程图演示地址官网Warm-Flow视频 主要更新内容 [feat] 开启流程实例&#xff0c;新增流程定义是否存在校验[feat] 新增合同签订流程案例[feat] 新增企业采购流程案例[update] mybatis-plus逻辑删除&#xff0c;删除值和未删除…

前端二进制数据指南:从 ArrayBuffer 到高级流处理

前端开发中&#xff0c;二进制数据是处理文件、图像、音视频、网络通信等场景的基础。以下是核心概念和用途的通俗解释&#xff1a; 前端二进制数据介绍 1. 什么是前端二进制数据&#xff1f; 指计算机原始的 0 和 1 格式的数据&#xff08;比如一张图片的底层代码&#xff…

如何选择高性价比的 1T 服务器租用服务​

选择高性价比的 1T 服务器租用服务​&#xff0c;可参考以下内容&#xff1a; 1、根据需求选配置​ 明确自身业务需求是关键。若为小型网站或轻量级应用&#xff0c;数据存储与处理需求不高&#xff0c;选择基础配置服务器即可。如个人博客网站&#xff0c;普通的 Intel Xeon …

一个可拖拉实现列表排序的WPF开源控件

从零学习构建一个完整的系统 推荐一个可通过拖拉&#xff0c;来实现列表元素的排序的WPF控件。 项目简介 gong-wpf-dragdrop是一个开源的.NET项目&#xff0c;用于在WPF应用程序中实现拖放功能&#xff0c;可以让开发人员快速、简单的实现拖放的操作功能。 可以在同一控件内…

AI-02a5a6.神经网络-与学习相关的技巧-批量归一化

批量归一化 Batch Normalization 设置合适的权重初始值&#xff0c;则各层的激活值分布会有适当的广度&#xff0c;从而可以顺利的进行学习。那么&#xff0c;更进一步&#xff0c;强制性的调整激活值的分布&#xff0c;是的各层拥有适当的广度呢&#xff1f;批量归一化&#…

SVGPlay:一次 CodeBuddy 主动构建的动画工具之旅

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 背景与想法 我一直对 SVG 图标的动画处理有浓厚兴趣&#xff0c;特别是描边、渐变、交互等效果能为图标增添许…

自己手写tomcat项目

一&#xff1a;Servlet的原理 在Servlet(接口中)有&#xff1a; 1.init():初始化servlet 2.getServletConfig()&#xff1a;获取当前servlet的配置信息 3.service():服务器&#xff08;在HttpServlet中实现&#xff0c;目的是为了更好的匹配http的请求方式&#xff09; 4.g…

2025年渗透测试面试题总结-安恒[实习]安全工程师(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 安恒[实习]安全工程师 一面 1. 自我介绍 2. 前两段实习做了些什么 3. 中等难度的算法题 4. Java的C…

生成对抗网络(Generative Adversarial Networks ,GAN)

生成对抗网络是深度学习领域最具革命性的生成模型之一。 一 GAN框架 1.1组成 构造生成器&#xff08;G&#xff09;与判别器&#xff08;D&#xff09;进行动态对抗&#xff0c;实现数据的无监督生成。 G&#xff08;造假者&#xff09;&#xff1a;接收噪声 ​&#xff0c…

在WSL中的Ubuntu发行版上安装Anaconda、CUDA、CUDNN和TensorRT

在Windows 11的WSL&#xff08;Windows Subsystem for Linux&#xff09;环境中安装Anaconda、CUDA、CUDNN和TensorRT的详细步骤整理&#xff1a; 本文是用cuda12.4与CuDNN 8.9.7 和 TensorRT 9.1.0 及以上对应 一、前言&#xff08;准备&#xff09; 确保电脑上有NVIDIA GPU…