当前位置: 首页 > news >正文

VTK知识学习(51)- 交互与Widget(二)

1、交互器样式

        前面所讲的观察者/命令模式是 VTK实现交互的方式之一。在前面示例 所示的窗口中可以使用鼠标与柱体进行交互,比如用鼠标滚轮可以对柱体放大、缩小;按下鼠标左键不放,然后移动鼠标,可以转动柱体;按下鼠标左键,同时按下(Shif)键,移动鼠标,可以移动整个柱体;按下〈Ctrl)键时,再按下鼠标左键可以实现旋转功能;鼠标停留在柱体上然后按下(P)键可以实现对象的选取;按下〈E)键可以退出 VTK应用程序等。

2、vtkRenderWindowInteractor

        vtkRenderWindowInteractor 类即渲染窗口交互器,它提供一种平台独立的响应鼠标/按键/时钟事件的交互机制,可将平台相关的鼠标/按键/时钟等消息路由至vtkInteractorObserver 或其子类。也就是说,vkRenderWindowInteractor作为一个基类,其具体的功能是由平台相关的子类(如 vtkWin32RenderWindowInteractor)来完成的。当它从窗口系统中监听到感兴趣的事件(消息)时,通过调用InvokeEvent()函数将平台相关的事件翻译成VTK事件,而这些 VTK 事件是平台独立的,然后再路由至 vtkInteractorObserver 或其子类,再由已经对该事件进行注册的 vtkInteractorObserver 或其子类响应具体的操作。

1)示例代码
private void TestInteraction(){vtkJPEGReader reader = vtkJPEGReader.New();reader.SetFileName("F:\\code\\VTK\\TestActiViz\\data\\VTKBook-TestImage.jpg");reader.Update();vtkImageActor imageActor = vtkImageActor.New();imageActor.SetInputData(reader.GetOutput());vtkRenderer renderer = vtkRenderer.New();renderer.AddActor(imageActor);renderer.SetBackground(1, 1, 1);vtkRenderWindow renWin = new vtkRenderWindow();// renderWindowControl.RenderWindow;renWin.AddRenderer(renderer);renWin.SetSize(640, 480);this.Dispatcher.Invoke(() => renWin.Render());renWin.SetWindowName("InteractionDemo");vtkRenderWindowInteractor iren = vtkRenderWindowInteractor.New();iren.SetRenderWindow(renWin);//该交互模具工预设了针对二维图像的交互功能,如同时按下《Ctrl》键和鼠标左键可以实现图像的旋转等。vtkInteractorStyleImage style = vtkInteractorStyleImage.New();iren.SetInteractorStyle(style);iren.Initialize();//  this.Dispatcher.BeginInvoke(new Action( kkk), null);iren.Start();}
2)效果

3)说明

        示例先读入一幅 JPG 图像,然后用 vtkImageActor、vtkRenderervtkRenderWindow等建立可视化管线。值得注意的是,在以上示例中,使用类vtknteractorStylelmage 作为交互器样式。该交互器样式预设了针对二维图像的交互功能,如同时按下〈Ctrl)键和鼠标左键可以实现图像的旋转;同时按下(Shif)键和鼠标左键可以实现图像平移;按住鼠标左键并移动鼠标可以调节图像的窗宽和窗位;按(R)键可以实现图像的窗宽和窗位的重置;滑动鼠标滚轮可以实现图像的放缩等。

        vkRenderWindowInteractor 是一个基类,具体的操作是由平台相关的子类实现。该示例程序是运行于Win32平台下的,因此,该平台下的消息先由vtkWin32RenderWindowInteractor 类捕获。这里以窗宽和窗位的重置功能为例,跟踪当用户按下〈R)键时,消息是如何传递的。

        首先分析当用户在渲染窗口中按下(R)键时,可能引发的消息有哪些。VTK染窗口在获得焦点的前提下,当用户按下(R〉键,先是触发了“按键按下”的消息,即Windows下的 WM KEYDOWN;然后触发 WM CHAR消息(这里先不考虑 WM KEYUP 消息)。

        主程序中实例化的是vtkRenderWindowInteractor 对象,程序调用的却是 vtkWin32RenderWindowInteractor 对象,VTK里是如何根据具体的平台来调用相关的类的呢?

        代码是调用 vtkGraphicsFactory::CreateInstance()函数来创建 vtkRenderWindowInteractor,从类的名字可以看出,这是从对象工厂中创建所需的对象实例。

        代码先根据对象类名从对象工厂中创建实例,如果成功创建即返回。会发现由 vtkObjectFactory::CreateInstance(vtkclassname)的返回值是0。后面即调用 vtkGraphicsFactory::GetRenderLibrary()来获取当前请求的渲染库类型。再继续,可以看出该返回值为“Win32OpenGL”从 vtkGraphicsFactory.cxx文件里的 vtkGraphicsFactory::CreateInstance()中。

         InteractionDemo 中调用了 vtkRenderWindowInteractor 的 Start()函数,该函数会调用一个名为StartEventLoop的虚函数。vtkWin32RenderWindowInteractor 覆盖了该函数。

在函数的最后就是一个列循环,即不断地调用Windows的APIGetMessage()函数从消息队列中获取消息,并将所获取的消息进行转换,再分发到当前的窗口程序中。

4)总结

        当在主程序中实例化 vkRenderWindowInteractor对象时,VTK 程序内部根据不同平台的渲染库实例化平台相关的 vtkRenderWindowInteractor 子类,由具体的平台相关的子类来响应窗口消息(如 vtkWin32RenderWindowInteractor)。vtkWin32RenderWindowInteractor::StartEventLoop()函数不断地从消息队列中获取消息,并分发给该类的回调函数vtkHandleMessage2(),该回调函数根据不同的消息调用相应的 OnXXXO消息响应函数(XXX指代消息名字),在每个消息响应函数里,通过调用 vtkObiect::InvokeEvent()将平台相关的消息再翻译成 VTK 事件,如按键按下的事件为 vtkCommand::KeyPressEvent。

3、vtkInteractorStyle

        继续以WMKEYDOWN消息为例,当示例程序停留在vtkWin32RenderWindowInteractor::OnKeyDown()函数的 InvokeEvent()处(即该类源文件的第600行)时,按(F11)键进入类vtkObiect的函数InvokeEvent(),代码如下:

        vtkObject::InvokeEvent()实际上调用的是SubjectHelper的同名函数。在变量名SubjectHelper 上右击,从弹出的快捷菜单中选择“Go To Definition”命令,可以看到该变量类型为 vtkSubjectHelper。该类在 vtkObject 内部定义,其主要作用是用于保存观察者(Observer)的列表,并负责注册事件,将事件分发给观察者。而vkSubiectHelper类内部事件的分发,则是由另一个辅助类 vtkObserver 来完成的,这个类也是在 vtkObiect 内部定义的。继续按(F11)键,跳至类vtkSubjectHelper::InvokeEventO函数体中,代码如下:

int vtkSubjectHelper::InvokeEvent(unsigned long event, void *callData,vtkObject *self)
{int focusHandled = 0;int saveListModified = this->ListModified;this->ListModified = 0;typedef std::vector<unsigned long> VisitedListType;VisitedListType visited;vtkObserver *elem = this->Start;const unsigned long maxTag = this->Count;vtkObserver *next;while (elem){next = elem->Next;if (elem->Command->GetPassiveObserver() &&(elem->Event == event || elem->Event == vtkCommand::AnyEvent) &&elem->Tag < maxTag){VisitedListType::iterator vIter =std::lower_bound(visited.begin(), visited.end(), elem->Tag);if (vIter == visited.end() || *vIter != elem->Tag){// Sorted insertion by tag to speed-up future searches at limited// insertion cost because it reuses the search iterator already at the// correct locationvisited.insert(vIter, elem->Tag);vtkCommand* command = elem->Command;command->Register(command);elem->Command->Execute(self,event,callData);command->UnRegister();}}if (this->ListModified){vtkGenericWarningMacro(<<"Passive observer should not call AddObserver or RemoveObserver in callback.");elem = this->Start;this->ListModified = 0;}else{elem = next;}}// 1. Focus loop//if (this->Focus1 || this->Focus2){elem = this->Start;while (elem){next = elem->Next;if (((this->Focus1 == elem->Command) || (this->Focus2 == elem->Command)) &&(elem->Event == event || elem->Event == vtkCommand::AnyEvent) &&elem->Tag < maxTag){VisitedListType::iterator vIter =std::lower_bound(visited.begin(), visited.end(), elem->Tag);if (vIter == visited.end() || *vIter != elem->Tag){// Don't execute the remainder loopfocusHandled = 1;// Sorted insertion by tag to speed-up future searches at limited// insertion cost because it reuses the search iterator already at the// correct locationvisited.insert(vIter, elem->Tag);vtkCommand* command = elem->Command;command->Register(command);command->SetAbortFlag(0);elem->Command->Execute(self,event,callData);// if the command set the abort flag, then stop firing events// and returnif(command->GetAbortFlag()){command->UnRegister();this->ListModified = saveListModified;return 1;}command->UnRegister();}}if (this->ListModified){elem = this->Start;this->ListModified = 0;}else{elem = next;}}}// 2. Remainder loop//if (!focusHandled){elem = this->Start;while (elem){// store the next pointer because elem could disappear due to Commandnext = elem->Next;if ((elem->Event == event || elem->Event == vtkCommand::AnyEvent) &&elem->Tag < maxTag){VisitedListType::iterator vIter =std::lower_bound(visited.begin(), visited.end(), elem->Tag);if (vIter == visited.end() || *vIter != elem->Tag){// Sorted insertion by tag to speed-up future searches at limited// insertion cost because it reuses the search iterator already at the// correct locationvisited.insert(vIter, elem->Tag);vtkCommand* command = elem->Command;command->Register(command);command->SetAbortFlag(0);elem->Command->Execute(self,event,callData);// if the command set the abort flag, then stop firing events// and returnif(command->GetAbortFlag()){command->UnRegister();this->ListModified = saveListModified;return 1;}command->UnRegister();}}if (this->ListModified){elem = this->Start;this->ListModified = 0;}else{elem = next;}}}this->ListModified = saveListModified;return 0;
}

        该函数的实现比较复杂,这里只需关注三个while循环体里的if语句。以上函数在处理事件时,将事件观察者分为三类,分别是被动观察者(Passive)、焦点观察者(Focus)及其他类型。被动观察者是指其所监听的事件或命令是不改变系统状态的,可以通过vtkCommand::GetPassiveObserver()获取该标志的值;焦点观察者是指该观察者所监听的事件可以让窗口获得焦点,比如,用户用鼠标单击窗口后,窗口可以获得焦点,则监听VTK 事件LeftButtonPressEvent(见表8-1)的观察者即为焦点观察者。

        显然,监听WM KEYDOWN 消息所对应的VTK事件KeyPressEvent的观察者是以上两种观察者之外的类型。所以,在以上代码的第三个循环体(第602行代码)放置一个断点,然后按(F5)键运行程序。
        这时,程序会停留在放置的断点位置上(第602行),这时可以在VS2008窗口中将vtkSubjectHelper:InvokeEvent()里的参数event拖至变量的观测窗口中看看该变量的值。该事件的值为20,对照表8-1可知编号为20的事件为KeyPressEvent。继续按(F11〉键,程序跳至类vtkCallbackCommand::Excute()函数中,代码如下:

        变量 Callback 的值是在 vtkSubjectHelper:InvokeEvent()函数里赋值的。继续按(F11)键,程序正如变量 Callback 的值所示,将跳至 vtkInteractorStyle::ProcessEvents(函数中,代码如下:

        

        vtkInteractorStyle::ProcessEvents()函数很长,但并不复杂。从上述代码可以看出,该函数主要就是一个 switch 语句,根据不同的 VTK事件,调用 vtkInteractorStyle 不同的函数进行响应,比如所跟踪的 KeyPressEvent 事件,程序将调用 OnKeyDown()和 OnKeyPress()函数进行响应,而响应 VTK 事件的函数都声明为虚函数,换言之,这些事件都是在 vtkInteractorStyle的子类中实现的。对于KeyPressEvent 事件,vtkInteractorStyle 的子类vtkInteractorStyleTrackballCamera 和 vtkInteractorStylelmage 都没有重载 OnKeyDown()和 OnKeyPress()函数。

        前面提过,当用户在渲染窗口中按下(R)键时,先触发VTK的KeyPressEvent 事件,然后触发 CharEvent 事件。

         OnChar()是虚函数,vtkInteractorStyle 的子类 vtkInteractorStylelmage 已经覆盖了该函数,而且刚好子类vtkInteractorStylelmage::OnChar()函数中有针对(R〉键的响应,所以父类的 OnChar()函数也就不调用了,代码如下:

        从上述代码可以看出,响应用户(R)键消息的OnChar0)函数实际实现的功能就是设置
图像的窗宽和窗位等信息(代码第440~443行)。

        至此,键盘按键按下消息(KeyPressEvent和CharEvent)的传递过程已经比较清晰了。

        总结如下:Windows 消息被 vtkWin32RenderWindowInteractor 捕获以后,先由该类的回调函数 vtkHandleMessage2()分发至各个消息响应函数,在每个消息响应函数的最后,通过调用vtkObject::InvokeEvent()将 Windows 消息翻译成 VTK 事件。

在 vkObject::InvokeEvent()函数里,通过类 vtkSubjectHelper::InvokeEvent()函数再将各个 VTK 事件分发到不同的观察者中,观察者调用回调函数 vtkInteractorStyle::ProcessEvents()处理不同的 VTK事件,再将这些VTK 事件分发至 vtkInteractorStyle 或其子类的消息响应函数中,从而完成整个消息的传递过程。

相关文章:

VTK知识学习(51)- 交互与Widget(二)

1、交互器样式 前面所讲的观察者/命令模式是 VTK实现交互的方式之一。在前面示例 所示的窗口中可以使用鼠标与柱体进行交互&#xff0c;比如用鼠标滚轮可以对柱体放大、缩小;按下鼠标左键不放&#xff0c;然后移动鼠标&#xff0c;可以转动柱体;按下鼠标左键&#xff0c;同时按…...

目标跟踪Deepsort算法学习2025.4.7

一.DeepSORT概述 1.1 算法定义 DeepSORT(Deep Learning and Sorting)是一种先进的多目标跟踪算法,它结合了深度学习和传统的目标跟踪技术,在复杂环境下实现了高精度和鲁棒性的目标跟踪。该算法的核心思想是通过融合目标的外观特征和运动特征,实现对多个目标的持续跟踪,…...

nacos集群启动问题

根据您的描述&#xff0c;Nacos集群只能启动两个节点&#xff0c;可能的原因和解决方法如下&#xff1a; 1. 集群配置问题 • 原因&#xff1a;cluster.conf文件中可能只配置了两个节点的地址&#xff0c;导致第三个节点无法加入集群。 • 解决方法&#xff1a; • 检查每个…...

八大排序——c++版

本次排序都是按照升序排的 冒泡排序 void bubbleSort(vector<int>& nums) {int nnums.size();for(int i0;i<n-1;i){bool swappedfalse;for(int j0;j<n-1-i;j){if(nums[j]>nums[j1]){swap(nums[j],nums[j1]);swappedtrue;}}if(!swapped)break;} } //算法原…...

关于Spring MVC中传递数组参数的详细说明,包括如何通过逗号分隔的字符串自动转换为数组,以及具体的代码示例和总结表格

以下是关于Spring MVC中传递数组参数的详细说明&#xff0c;包括如何通过逗号分隔的字符串自动转换为数组&#xff0c;以及具体的代码示例和总结表格&#xff1a; 1. 核心机制 Spring MVC支持直接通过逗号分隔的字符串将请求参数自动转换为数组&#xff08;String[]、int[]等&…...

VBA之Word应用:利用Range方法进行字体及对齐方式设置

《VBA之Word应用》&#xff08;版权10178982&#xff09;&#xff0c;是我推出第八套教程&#xff0c;教程是专门讲解VBA在Word中的应用&#xff0c;围绕“面向对象编程”讲解&#xff0c;首先让大家认识Word中VBA的对象&#xff0c;以及对象的属性、方法&#xff0c;然后通过实…...

区块链技术:重塑供应链管理的未来

在当今全球化的商业环境中&#xff0c;供应链管理的复杂性和重要性日益凸显。从原材料采购到产品交付&#xff0c;供应链的每一个环节都可能影响企业的运营效率和客户满意度。随着区块链技术的兴起&#xff0c;供应链管理迎来了新的变革机遇。本文将深入探讨区块链技术在供应链…...

请回答集成测试和系统测试的区别,以及它们的应用场景主要是什么?

导语: 深夜收到粉丝私信:"面了5家大厂,4家都问集成测试和系统测试的区别,求大佬支招!" 作为经历过200+项目实战的测试老司机,今天用4个真实项目案例+3张原理图,带你彻底吃透这两个核心测试阶段!(文末送测试用例模板) 一、灵魂三问:到底测什么? 1.1 集成…...

SVT-AV1学习-svt_aom_get_sg_filter_level,svt_av1_selfguided_restoration_c

SVT-AV1学习-svt_aom_get_sg_filter_level,svt_av1_selfguided_restoration_c 一 函数的作用 根据编码模式&#xff0c;输入分辨率和快速解码标志动态计算自引导恢复(Self Guide Restoration)过滤器的启动级别&#xff0c;以下是详细解析&#xff1b; 1 参数说明 EncMode enc_m…...

第七章总结:集合

一、集合简介 Scala集合分为三大类&#xff1a;序列&#xff08;Seq&#xff09;、集&#xff08;Set&#xff09;、映射&#xff08;Map&#xff09;&#xff0c;所有集合都扩展自Iterable特质。集合分为可变集合和不可变集合&#xff1a; 不可变集合&#xff1a;scala.collec…...

玄机靶场:apache日志分析

什么是Apache日志 Apache日志‌是Apache Web服务器在处理HTTP请求时记录的所有事件的详细信息。Apache是全球最受欢迎的Web服务器软件之一&#xff0c;支持约30.2%的所有活跃网站。Apache通过记录每次请求的信息&#xff0c;包括时间、来源IP、请求的资源等&#xff0c;帮助分…...

Laravel 使用 事件和监听器实现 数据状态变更

首先知道事件是什么 1.事件的概念 事件(Event)是 Laravel 中实现观察者模式的一种机制&#xff0c;它允许应用程序中的不同部分进行松耦合的通信。 通俗一点就是&#xff0c;发生在应用程序中的动作或者事情。例如&#xff1a; 用户注册成功后&#xff0c;需要发邮件&#…...

uniapp App页面通过 web-view 调用网页内方法

先是报这个错 A parser-blocking, cross site (i.e. different eTLD1) script, https://api.map.baidu.com/getscript?v3.0&akpgJsRF87Fjia&services&t20250225111334, is invoked via document.write. The network request for this script MAY be blocked by t…...

Daz3D角色UE5材质优化

解决Daz3D人物角色导入UE5后材质不真实的问题 1. 引言&#xff1a;跨平台3D资产传输中的材质保真度挑战 在当今的数字内容创作领域&#xff0c;对高质量3D人物角色的需求日益增长&#xff0c;广泛应用于游戏开发、电影制作、虚拟现实等多种应用场景。Daz3D因其丰富的人物模型…...

Android studio

问题&#xff1a;没有界面可以操作&#xff0c;页面没有hello wolrd 原因&#xff1a;gradle没同步完&#xff0c;依赖项没有下载完整&#xff0c;所以布局预览看不了...

Playwright快照测试:如何让UI回归测试变得轻松高效

引言 使用带有模拟数据的PlaywrightP快照可以显著提高UI回归测试的速度。它能够快速自动化检查三大主流浏览器&#xff08;Chromium、Firefox、Webkit&#xff09;中的 UI 元素。你可以将多个断言绑定到一个快照上&#xff0c;这极大地提高了 UI 测试的效率。在 GUI 应用快速扩…...

控制理论-传递函数

【硬核】终于有人把传递函数和卷积定理讲明白了&#xff01;自动控制原理入门-传递函数 | 卷积定理 | 频率响应 | 喵星考拉...

虚拟世界的AI魔法:AIGC引领元宇宙创作革命

云边有个稻草人-CSDN博客——个人主页 热门文章_云边有个稻草人的博客-CSDN博客——本篇文章所属专栏 ~ 欢迎订阅~ 目录 1. 引言 2. 元宇宙与虚拟世界概述 2.1 什么是元宇宙&#xff1f; 2.2 虚拟世界的构建 3. AIGC在元宇宙中的应用 3.1 AIGC生成虚拟世界环境 3.2 AIGC…...

带QT界面的文件管理系统

下载地址 下载&完整介绍地址&#xff1a;https://www.mcso.top/course-design/qt-filesystem/ 开源地址&#xff1a;https://github.com/mcdudu233/FileSystem.git 软件包含 &#xff08;1&#xff09;设计数据的结构 &#xff08;2&#xff09;设计文件管理系统 &…...

【区块链安全 | 第二十六篇】表达式与控制结构(二)

文章目录 表达式与控制结构赋值结构化赋值与返回多个值数组和结构体的赋值复杂性作用域和声明检查或不检查的算术运算错误处理:Assert、Require、Revert 和异常通过 assert 进行 Panic 和通过 require 进行 Errorreverttry/catch表达式与控制结构 赋值 结构化赋值与返回多个…...

2025年前端框架全景解析:React、Vue、Angular的生态与未来之争

一、市场格局:全球与国内的双重差异12 全球市场React:凭借Facebook的支持和庞大的社区,全球使用率超40%,尤其在数据密集型应用(如金融、社交平台)中占据主导。其跨平台能力(React Native)和灵活生态(Next.js、Redux)是核心竞争力。Vue:亚洲市场占比显著,中国开发者…...

【VScode】C/C++使用教程

编辑器 1. VScode本质上是一款代码编辑器&#xff0c;上面包含了许多插件。 VScode下载 1. 下载链接&#xff1a;Download Visual Studio Code - Mac, Linux, Windowshttps://code.visualstudio.com/download2. 在拓展部分下载汉化包&#xff1a;Chinese。 编译器 1. 我们使用M…...

【Node】如何使用PM2高效部署nodejs前端应用

引言 Node.js 这个服务端 JavaScript 运行时&#xff0c;能帮你打造高性能的实时 Web 和移动应用。不过相比传统的 Apache 或 Nginx 这类 Web 服务器&#xff0c;Node 应用的管理可要多花点心思。 PM2 就是专为生产环境设计的 Node 应用进程管理系统。这篇指南将手把手教你安…...

从零开始的图论讲解(1)——图的概念,图的存储,图的遍历与图的拓扑排序

目录 前言 图的概念 1. 顶点和边 2. 图的分类 3. 图的基本性质 图的存储 邻接矩阵存图 邻接表存图 图的基本遍历 拓扑排序 拓扑排序是如何写的呢? 1. 统计每个节点的入度 2. 构建邻接表 3. 将所有入度为 0 的节点加入队列 4. 不断弹出队头节点&#xff0c;更新其…...

无人机双频技术及底层应用分析!

一、双频技术的核心要点 1. 频段特性互补 2.4GHz&#xff1a;穿透力强、传输距离远&#xff08;可达5公里以上&#xff09;&#xff0c;适合复杂环境&#xff08;如城市、建筑物密集区&#xff09;&#xff0c;但易受Wi-Fi、蓝牙等设备的干扰。 5.8GHz&#xff1a;带宽更…...

基础知识补充篇:认识区块链浏览器

专栏:区块链入门到放弃查看目录-CSDN博客文章浏览阅读218次。为了方便查看将本专栏的所有内容列出目录,按照顺序查看即可。https://blog.csdn.net/qq_22502303/article/details/147022618?spm=1001.2014.3001.5501 前言 在《基础知识补充篇:什么是区块链RPC节点》文中笔者…...

git rebase复杂场景验证

经常面临复杂的分支管理&#xff0c;这里对几种场景的行为做一些验证。 结论总结 git rebase br_name&#xff1a;等价与新建br_name分支&#xff0c;然后找到当前分支与br_name分支的分叉点。然后把分叉点以后的提交&#xff08;当前分支&#xff09;一个一个的cherry-pick过…...

安宝特应用 | 工业AR技术赋能高端制造领域验收流程数字化转型

引言 随着高端制造行业对效率与安全要求的不断提升&#xff0c;传统验收模式正迎来智能化升级。针对特殊行业产品验收过程中存在的跨区域协作难、人工核验效率低等痛点&#xff0c;基于AR增强现实技术的智能验收方案正在成为转型新方向。 01 可视化协同提升验收效能 安宝特AR…...

Spring启示录、概述、入门程序以及Spring对IoC的实现

一、Spring启示录 阅读以下代码&#xff1a; dao package org.example1.dao;/*** 持久层* className UserDao* since 1.0**/ public interface UserDao {/*** 根据id删除用户信息*/void deleteById(); } package org.example1.dao.impl;import org.example1.dao.UserDao;/**…...

Oracle 23ai Vector Search 系列之4 VECTOR数据类型和基本操作

文章目录 Oracle 23ai Vector Search 系列之4 VECTOR数据类型和基本操作VECTOR 数据类型基本语法Vector 维度限制和向量大小向量存储格式&#xff08;DENSE vs SPARSE&#xff09;1. DENSE存储2. SPARSE存储3. 内部存储与空间计算 Oracle VECTOR数据类型的声明格式VECTOR基本操…...

如何用开源工具,把“定制动漫面具”做成柔性制造?

原文链接&#xff1a;https://www.nocobase.com/cn/blog/kigland。 引言 在苏州&#xff0c;有一支团队正在悄悄改变个性化制造的方式。他们不做快消品&#xff0c;也不靠规模取胜&#xff0c;却在全球角色扮演爱好者圈子里收获了不少“忠粉”。 他们叫 KIGLAND&#xff0c;一…...

《命理学》专项探究与研习

基础论调 八字是什么 八字&#xff1a;用天干地支表示一个人的出生时间 例如&#xff1a; 如上图&#xff1a;某人的干支历出生时间&#xff1a;甲申年--己巳月--戊戌日--癸丑时 十天干 甲乙丙丁戊己庚辛壬癸 奇数位为阳&#xff0c;偶数位为阴 十二地支 子丑寅卯辰巳午未申酉…...

Linux 指令初探:开启终端世界的大门

前言 当我们初次接触 Linux&#xff0c;往往会被一串串在黑底屏幕中跳动的字符震撼甚至吓退。然而&#xff0c;正是这些看似晦涩的命令&#xff0c;构建了服务器、嵌入式系统乃至云计算的世界。 本篇将带你从最基础的 Linux 指令开始&#xff0c;逐步揭开命令行的神秘面纱。从…...

CentOS 7 yum 无法安装软件的解决方法

一、解决方法 1、备份原有的 CentOS 7 默认 YUM 源配置文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup2、从阿里云镜像源下载 CentOS 7 的 YUM 源配置文件&#xff0c;并覆盖原有的配置文件 wget -O /etc/yum.repos.d/CentOS-Base.re…...

oracle 游标的管理

8.2.1游标的概念和类型 游标(CURSOR)存储于服务器端&#xff0c;当服务器执行了一个查询后&#xff0c;查询返回的记录集存放在光标中&#xff0c;通过光标上的操作可以把这些记录检索到客户端的应用程序。光标是一种变量&#xff0c;它对应于一个查询语句确定的结果集。它用于…...

深入理解PCA降维:原理、实现与应用

1. 引言 在机器学习与数据科学领域&#xff0c;我们经常会遇到高维数据带来的"维度灾难"问题。随着特征数量的增加&#xff0c;数据稀疏性、计算复杂度等问题会显著加剧。主成分分析(PCA, Principal Component Analysis)作为一种经典的降维技术&#xff0c;能够有效解…...

AI重构农业:从“面朝黄土“到“数字原野“的产业跃迁—读中共中央 国务院印发《加快建设农业强国规划(2024-2035年)》

在东北黑土地的万亩良田上&#xff0c;无人机编队正在执行精准施肥作业&#xff1b;在山东寿光的智慧大棚里&#xff0c;传感器网络实时调控着番茄生长的微环境&#xff1b;在云南的咖啡种植园中&#xff0c;区块链溯源系统记录着每粒咖啡豆的旅程。这场静默的农业革命&#xf…...

当前主流的LLM Agent架构、能力、生态和挑战

一、LLM Agent的基本架构 尽管LLM Agent的具体实现五花八门&#xff0c;但大部分系统在架构层面上可以归纳为以下几个关键模块&#xff1a; 感知&#xff08;Perception&#xff09; Agent需要感知外界的信息。对于文本环境&#xff0c;感知往往是读取输入&#xff08;如用户指…...

网站缓存怎么检查是否生效?

为何选择CDN缓存技术&#xff1f; 部署内容缓存系统可有效提升网页响应效率&#xff0c;降低服务器资源占用与流量消耗&#xff0c;改善访客交互体验&#xff0c;强化系统架构容错能力&#xff0c;促进搜索引擎优化效果&#xff0c;达成资源分配与运行效能的动态平衡。 科学配…...

​‌Qt的稳定版本与下载

​‌Qt的稳定版本主要包括Qt5和Qt6的长期支持&#xff08;LTS&#xff09;版本‌。以下是详细的版本信息&#xff1a; Qt5的稳定版本 ‌Qt5.6 LTS‌&#xff1a;2016年3月15日发布&#xff0c;是一个长期支持版本。 ‌Qt5.9 LTS‌&#xff1a;2017年6月16日发布&#xff0c;也…...

用 OpenCV 给图像 “挑挑拣拣”,找出关键信息!

目录 一、背景 二、OpenCV 关键词提取基础概念 什么是关键词提取 OpenCV 在关键词提取中的作用 三、OpenCV 关键词提取的流程 整体流程概述 详细步骤及作用 流程图 四、OpenCV 关键词提取的代码实现 环境准备 代码演示 代码说明 五、常见问题及解决方法 特征提取不…...

14-Hugging Face 模型微调训练(基于 BERT 的中文评价情感分析(二分类))

1. datasets 库核心方法 1.1. 列出数据集 使用 datasets 库&#xff0c;你可以轻松列出所有 Hugging Face 平台上的数据集&#xff1a; from datasets import list_datasets # 列出所有数据集 all_datasets list_datasets() print(all_datasets)1.2. 加载数据集 你可以通过…...

php-cgi参数注入攻击经历浅谈

起因&#xff1a; 阿里云服务器再次警告出现挖矿程序。上一次服务器被攻击后&#xff0c;怕有恶意程序残留&#xff0c;第一时间重装了系统&#xff0c;也没有详查攻击入口。不过事后还是做了一些防范&#xff0c;这台留作公网访问的服务器上并未保留业务数据&#xff0c;只作…...

istio流量治理——重试

Istio 的重试功能的底层原理主要依赖于其数据平面组件 Envoy 代理&#xff08;Sidecar 或 Gateway&#xff09;的实现。Envoy 是一个高性能的代理服务器&#xff0c;负责处理所有流入和流出的流量&#xff0c;并在 Istio 的服务网格中执行流量管理策略&#xff0c;包括重试逻辑…...

Spring Cloud之服务入口Gateway之Route Predicate Factories

目录 Route Predicate Factories Predicate 实现Predicate接口 测试运行 Predicate的其它实现方法 匿名内部类 lambda表达式 Predicate的其它方法 源码详解 代码示例 Route Predicate Factories The After Route Predicate Factory The Before Route Predicate Fac…...

测试分类篇

文章目录 目录1. 为什么要对软件测试进行分类2. 按照测试目标分类2.1 界面测试2.2 功能测试2.3 性能测试2.4 可靠性测试2.5 安全性测试2.6 易用性测试 3. 按照执行方式分类3.1 静态测试3.2 动态测试 4. 按照测试方法分类4.1 白盒测试4.1.1 语句覆盖4.1.2 判定覆盖4.1.3 条件覆盖…...

Django接入 免费的 AI 大模型——讯飞星火(2025年4月最新!!!)

上文有介绍deepseek接入&#xff0c;但是需要 付费&#xff0c;虽然 sliconflow 可以白嫖 token&#xff0c;但是毕竟是有限的&#xff0c;本文将介绍一款完全免费的 API——讯飞星火 目录 接入讯飞星火&#xff08;免费&#xff09; 测试对话 接入Django 扩展建议 接入讯飞星火…...

使用NVM下载Node.js管理多版本

提示&#xff1a;我解决这个bug跟别人思路可能不太一样&#xff0c;因为我是之前好用&#xff0c;换个项目就不好使了&#xff0c;倦了 文章目录 前言项目场景一项目场景二解决方案&#xff1a;下载 nvm安装 nvm重新下载所需Node 版本nvm常用命令 项目结构说明 前言 提示&…...

下载安装Node.js及其他环境

提示&#xff1a;从Node版本降级到Vue项目运行 文章目录 下载Node.js环境配置配置环境变量 安装 cnpm&#xff08;我需要安装&#xff09;安装脚手架安装依赖安装淘宝镜像&#xff08;注意会更新&#xff09;cnpm vs npm 与新旧版本核心差异包管理器不同功能差异如何选择&#…...

Java 基础-31-枚举-认识枚举

在Java编程语言中&#xff0c;枚举&#xff08;Enum&#xff09;是一种特殊的类&#xff0c;它允许一组固定的常量。它们非常适合用来表示一组固定的值&#xff0c;比如星期几、季节、颜色等。枚举自Java 5开始引入&#xff0c;为定义常量提供了一种更强大和方便的方式。本文将…...