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

ImGui 学习笔记(三)—— 隐藏主窗口窗口关闭检测

ImGui 的主窗口是平台窗口,默认是可见的,这会影响视觉效果。那么怎么隐藏 ImGui 的主窗口呢?

这很简单,但是需要针对后端做一些修改。

本文仅介绍在 glfw+opengl3 和 win32+dx11 两种实现上如何修改。

在 win32+dx11 实现上,隐藏主窗口首先需要找到 issues 中关于窗口背景透明度的临时解决方案,实施这些方案。我们最好在窗口透明的基础上隐藏平台窗口。

你可以参考:

Add support for transparent backbuffers to GLFW contexts (OpenGL3 and Vulkan) by SageMade · Pull Request #2766 · ocornut/imgui

为 DX12 后端添加 DirectComposition (用于透明度) 作者 Soreepeong ·拉取请求 #7462 ·奥科努特/IMGUI

然后,我们现在可以为 Viewports 开启混合透明(每像素透明度)。然后,设置 clear_color 的Alpha 通道数值为0,也就是完全透明。

这样,主视口(ID: 0x11111111)上面将不会渲染任何颜色。

1)隐藏主视口的平台窗口

随后,我们将 Win32 窗口的设置进行调整,主要是消除任务栏图标、窗口边框、标题栏、以及使得窗口不遮挡任何屏幕内容。

你可能会觉得使用 WS_EX_TRANSPATENT 有用,其实它只在使用分层透明度时候比较合适,而分层透明的效率没有混合透明高,所以我没采用。

然后,我们在平台窗口创建时候,指定 WS_POPUP WS_EX_TOOLWINDOW 以便于不在任务栏显示平台窗口的图标。

设置窗口位置大小为 pos = (0,0) , size = (1,1),矩形大小不能为 0,为 0 会导致 Imgui 的一些异常状态,最终导致界面无法响应。

其实到这里已经实现了隐藏主视口的平台窗口了。但是有一些细节仍需要处理。

接下来在 ImGuiWindow 结构中添加一个字段 bool WindowInitFocused。在 imgui_internal.h 中添加声明:

IMGUI_API void FocusRootPlatformWindow(ImGuiWindow* window);

然后在 imgui.cpp 的最后,添加实现:

void FocusRootPlatformWindow(ImGuiWindow* window)
{ImGuiContext& g = *GImGui;ImGuiWindow* rootWnd = window->RootWindow;if (!rootWnd->WindowInitFocused)   // I don't know why the status was overwritten{// Before updating the platform window data for the first frame, // PlatformUserData may be nullptr, and no actual processing should be performed at this time.if (rootWnd->Viewport->PlatformUserData == nullptr) return;g.PlatformIO.Platform_SetWindowFocus(rootWnd->Viewport);rootWnd->WindowInitFocused = true;}
}

这样在 每次 ImGui::Begin() 后都可以调用一次:

ImGui::FocusRootPlatformWindow(ImGui::GetCurrentWindow());

来触发平台窗口的焦点获取,ImGui 在获取焦点时候才会去检查更新 Viewport 和 Window 的关系。任务栏不显示图标的原因就在这里面,但我还没有具体确定具体原因。强制平台窗口获取焦点暂时解决了任务栏不显示图标的问题。

当前的 WindowSelectViewport(window) 调用(未来可能被重写)会将 ImGui 窗口移动到新的 Viewport。不过存在一个 bug,即使用 Imgui 窗口的 id, pos 和 size 作为 viewport 的相应参数,这会导致什么呢?平台窗口的边框和标题栏占据空间,使得 imgui 窗口不对齐。

WindowSelectViewport(window);
SetCurrentViewport(window, window->Viewport);
window->FontDpiScale = (g.IO.ConfigFlags & ImGuiConfigFlags_DpiEnableScaleFonts) ? window->Viewport->DpiScale : 1.0f;
SetCurrentWindow(window);

目前,一种方法是修复 WindowSelectViewport 中的 AddUpdateViewport 的最后一个参数,由默认标识符改为 NoDecoration 即无平台窗口装饰。

WindowSelectViewport 修复

其实也不能说这里有错,其实并没有错,只是我们在使用的时候需要注意:

需要在 WindowSelectViewport 调用之后为 Viewport 添加 ImGuiViewportFlags_NoDecoration 这个标识符,来正确去除平台窗口的装饰,而不是自己去调用 SetWindowLongPtr 这样的 api:

WindowSelectViewport(window);
window->Viewport->Flags |= ImGuiViewportFlags_NoDecoration;

另一种隐藏平台窗口的实现是使用分层透明,这里我也介绍一下,就是在 Win32 窗口创建时使用纯色画刷,然后使用 SetLayeredWindowAttribute 将背景色去除,将平台窗口设置为无边框全屏窗口(注意不是独占显示器的窗口),然后给窗口添加 WS_EX_TRANSPARENT 样式,这将允许在窗口完全透明的位置穿透鼠标、键盘消息。看上去就像没有窗口了一般。

diff --git a/examples/example_win32_directx11/main.cpp b/examples/example_win32_directx11/main.cpp
index fe462e74..b73f127a 100644
--- a/examples/example_win32_directx11/main.cpp
+++ b/examples/example_win32_directx11/main.cpp
@@ -28,7 +28,7 @@ int main(int, char**)// Create application windowWNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, WndProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, _T("ImGui Example"), NULL };::RegisterClassEx(&wc);
-    HWND hwnd = ::CreateWindow(wc.lpszClassName, _T("Dear ImGui DirectX11 Example"), WS_OVERLAPPEDWINDOW, 100, 100, 1280, 800, NULL, NULL, wc.hInstance, NULL);
+    HWND hwnd = ::CreateWindowEx(WS_EX_LAYERED, wc.lpszClassName, _T("Dear ImGui DirectX11 Example"), WS_POPUP, 0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), NULL, NULL, wc.hInstance, NULL);// Initialize Direct3Dif (!CreateDeviceD3D(hwnd))
@@ -75,7 +75,7 @@ int main(int, char**)// Our statebool show_demo_window = true;bool show_another_window = false;
-    ImVec4 clear_color = ImVec4(0.45f, 0.55f, 0.60f, 1.00f);
+    float clear_color[] = { 0, 0, 0, 0 };// Main loopMSG msg;
@@ -115,7 +115,7 @@ int main(int, char**)ImGui::Checkbox("Another Window", &show_another_window);ImGui::SliderFloat("float", &f, 0.0f, 1.0f);            // Edit 1 float using a slider from 0.0f to 1.0f
-            ImGui::ColorEdit3("clear color", (float*)&clear_color); // Edit 3 floats representing a color
+            ImGui::ColorEdit3("clear color", clear_color); // Edit 3 floats representing a colorif (ImGui::Button("Button"))                            // Buttons return true when clicked (most widgets return true when edited/activated)counter++;
@@ -139,11 +139,28 @@ int main(int, char**)// RenderingImGui::Render();g_pd3dDeviceContext->OMSetRenderTargets(1, &g_mainRenderTargetView, NULL);
-        g_pd3dDeviceContext->ClearRenderTargetView(g_mainRenderTargetView, (float*)&clear_color);
+        g_pd3dDeviceContext->ClearRenderTargetView(g_mainRenderTargetView, clear_color);ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());+
+        BLENDFUNCTION blend = { AC_SRC_OVER, 0, 0, AC_SRC_ALPHA };
+        POINT pt = { 0, 0 };
+        SIZE sz = { 0, 0 };
+        IDXGISurface1 *pSurface = NULL;
+        HDC hDC = NULL;g_pSwapChain->Present(1, 0); // Present with vsync//g_pSwapChain->Present(0, 0); // Present without vsync
+        g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pSurface));
+
+        DXGI_SURFACE_DESC desc;
+        pSurface->GetDesc(&desc);
+        sz.cx = desc.Width;
+        sz.cy = desc.Height;
+
+        pSurface->GetDC(FALSE, &hDC);
+        ::UpdateLayeredWindow(hwnd, nullptr, nullptr, &sz, hDC, &pt, 0, &blend, ULW_COLORKEY);
+        pSurface->ReleaseDC(nullptr);
+        pSurface->Release();}// Cleanup
@@ -162,16 +179,18 @@ int main(int, char**)bool CreateDeviceD3D(HWND hWnd){
+    RECT rcWnd;
+    GetWindowRect(hWnd, &rcWnd);// Setup swap chainDXGI_SWAP_CHAIN_DESC sd;ZeroMemory(&sd, sizeof(sd));sd.BufferCount = 2;
-    sd.BufferDesc.Width = 0;
-    sd.BufferDesc.Height = 0;
-    sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM;
+    sd.BufferDesc.Width = rcWnd.right - rcWnd.left;
+    sd.BufferDesc.Height = rcWnd.bottom - rcWnd.top;
+    sd.BufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;sd.BufferDesc.RefreshRate.Numerator = 60;sd.BufferDesc.RefreshRate.Denominator = 1;
-    sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH;
+    sd.Flags = DXGI_SWAP_CHAIN_FLAG_ALLOW_MODE_SWITCH | DXGI_SWAP_CHAIN_FLAG_GDI_COMPATIBLE;sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT;sd.OutputWindow = hWnd;sd.SampleDesc.Count = 1;

 glfw+opengl3 实现上:

使用 ImGui 的 docking 分支(需要 Multi Viewports 功能(官方描述:Multi-viewports is the feature allowing you to seamlessly extract Dear ImGui windows out of your main rendering context.)

然后使用 glfw 创建一个 offscreen context ,即在创建窗口前加入以下代码即可。

glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);  // 设置 offscreen context 的标志位// 需要在创建窗口前设置标志
// Create window with graphics context
GLFWwindow* window = glfwCreateWindow(200, 1, "Dear ImGui GLFW+OpenGL3 example", NULL, NULL);

同时记得检查代码中的这一部分内容,检查有没有启动 docking 和 viewport 支持,假如这一段编译错误,说明还没有切换到 docking 分支。

// Setup Dear ImGui context
IMGUI_CHECKVERSION();
ImGui::CreateContext();
ImGuiIO& io = ImGui::GetIO();
(void)io;   // 避免 unused 变量的警告
io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard;       // Enable Keyboard Controls
//io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad;      // Enable Gamepad Controls
io.ConfigFlags |= ImGuiConfigFlags_DockingEnable;           // !!! 启用 docking 功能的支持
io.ConfigFlags |= ImGuiConfigFlags_ViewportsEnable;         // !!! 启用 viewport 功能的支持
io.ConfigViewportsNoAutoMerge = true;                       // 参考评论,建议加上这行
//io.ConfigViewportsNoTaskBarIcon = true;

效果图:

glfw+opengl3 实现

此方法来源:https://www.zhihu.com/question/336183356/answer/1948292375。 

最后,貌似还有一种折中的办法,就是把 ImGui Main Window 的大小绘制得和平台窗口一样大即可,并且去除平台窗口的边框装饰,将平台窗口改成背景透明使得拖动时候不会“穿帮”。

例如 dx11 的实现:

主要通过移除 imgui 窗口标题栏并使其填充整个 DirectX11 窗口,将两个窗口“融合”在一起。

要实现此操作,只需在 ImGui::Begin()中将 ImGuiWindowFlags_NoTitleBar 标志传递给 ImGui 窗口(根据需要,可能还需要 ImGuiWindowFlags_NoMove 和 ImGuiWindowFlags_NoResize)

在 ImGui::Begin()之前添加 ImGui::SetNextWindowPos()和 ImGui::SetNextWindowSize()指令,将 imgui 窗口放置在左上角并调整其大小以适应 DirectX11 窗口

最终,你应该有类似下面的东西:

ImGuiWindowFlags window_flags = 0;
window_flags |= ImGuiWindowFlags_NoTitleBar;
window_flags |= ImGuiWindowFlags_NoMove;
window_flags |= ImGuiWindowFlags_NoResize;while(...) {...ImGui::SetNextWindowPos(ImVec2(0.0f, 0.0f)); // place the next window in the top left corner (0,0)ImGui::SetNextWindowSize(ImGui::GetIO().DisplaySize); // make the next window fullscreenImGui::Begin("imgui window", NULL, window_flags) // create a window...
}

该方法来自:

https://stackoverflow.com/questions/74954814/remove-the-parent-default-window-in-imgui。 

2)实现遍历窗口列表,新增窗口关闭检测(模仿 raylib):

添加下面代码,函数名也可以叫 GetWin32WindowShouldClose() / GetXXWindowShouldClose()。glfw 里面有一个叫 glfwSetWindowShouldClose 的实现来着。

namespace ImGui {ImVector<ImGuiWindow*> GetImGuiWindowList(){ImGuiContext& g = *GImGui;return g.Windows;}bool WindowCanShutdownNow(bool* p_open_main){bool window_has_active = false;if (!p_open_main || !(*p_open_main)){ImVector<ImGuiWindow*> windows = GetImGuiWindowList();if (!windows.size()){return false;}for (const auto& window : windows){// The "Debug##Default" window ImGui creates internally in NewFrame()// It is hidden and has no owner Viewport.if (window->Name && !stricmp(window->Name, "Debug##Default"))continue;//if (window->Active && window->ViewportOwned)if (window->Active && !window->Hidden){window_has_active = true;break;}}}else{return false;}return !window_has_active;}
}

GetImGuiWindowList 在 imgui_internal.h 中声明,WindowCanShutdownNow 在 imgui.h 中声明。

窗口关闭检测怎么使用?

在消息循环中添加这样的代码:

while (!done)
{// Poll and handle messages (inputs, window resize, etc.)// See the WndProc() function below for our to dispatch events to the Win32 backend.// 轮询和处理消息(输入、窗口大小调整等)// 请参阅位于此页下方的 WndProc() 函数,了解如何将事件调度到 Win32 后端。MSG msg;while (::PeekMessage(&msg, nullptr, 0U, 0U, PM_REMOVE)){::TranslateMessage(&msg);::DispatchMessage(&msg);if (msg.message == WM_QUIT)done = true;}if (done)break;// 下面是添加的窗口关闭检测,当所有 Imgui 窗口被关闭时,自动关闭平台窗口,并使得消息循环得以正常结束。if (ImGui::WindowCanShutdownNow(&show_main_window))PostMessageW(hwnd, WM_CLOSE, NULL, NULL);......
}

最终的效果:

实现的多视口(隐藏主视口背景窗口)

本文出处链接:https://blog.csdn.net/qq_59075481/article/details/145773493。

相关文章:

ImGui 学习笔记(三)—— 隐藏主窗口窗口关闭检测

ImGui 的主窗口是平台窗口&#xff0c;默认是可见的&#xff0c;这会影响视觉效果。那么怎么隐藏 ImGui 的主窗口呢&#xff1f; 这很简单&#xff0c;但是需要针对后端做一些修改。 本文仅介绍在 glfwopengl3 和 win32dx11 两种实现上如何修改。 在 win32dx11 实现上&#…...

ubuntu磁盘清理垃圾文件

大头文件排查 #先查看是否是内存满了&#xff0c;USER 很高即是满了 du -f#抓大头思想&#xff0c;优先删除大文件#查看文件目录 内存占用量并排序&#xff0c;不断文件递归下去 du --max-depth1 -h /home/ -h | sort du --max-depth1 -h /home/big/ -h | sort 缓存文件清理…...

vue-fastapi-admin 部署心得

vue-fastapi-admin 部署心得 这两天需要搭建一个后台管理系统&#xff0c;找来找去 vue-fastapi-admin 这个开源后台管理框架刚好和我的技术栈所契合。于是就浅浅的研究了一下。 主要是记录如何基于原项目提供的Dockerfile进行调整&#xff0c;那项目文件放在容器外部&#xf…...

大语言模型微调的公开JSON数据

大语言模型微调的公开JSON数据 以下是一些可用于大语言模型微调的公开JSON数据及地址: EmoLLM数据集 介绍:EmoLLM是一系列能够支持理解用户、帮助用户心理健康辅导链路的心理健康大模型,其开源了数据集、微调方法、训练方法及脚本等。数据集按用处分为general和role-play两种…...

C++STL容器之set

1.介绍 set容器是C标准模板库&#xff08;STL&#xff09;中的一个关联容器&#xff0c;用于存储唯一的元素。set中的元素是自动排序的&#xff0c;不允许重复。set通常基于红黑树&#xff08;一种自平衡二叉查找树&#xff09;实现&#xff0c;因此插入、删除和查找操作的时间…...

《微软量子芯片:开启量子计算新纪元》:此文为AI自动生成

量子计算的神秘面纱 在科技飞速发展的今天,量子计算作为前沿领域,正逐渐走进大众的视野。它宛如一把神秘的钥匙,有望开启未来科技变革的大门,而微软量子芯片则是这把钥匙上一颗璀璨的明珠。 量子计算,简单来说,是一种遵循量子力学规律调控量子信息单元进行计算的新型计算…...

使用AI创建流程图和图表的 3 种简单方法

你可能已经尝试过使用 LLMs 生成图像&#xff0c;但你有没有想过用它们来创建 流程图和图表&#xff1f;这些可视化工具对于展示流程、工作流和系统架构至关重要。 通常&#xff0c;在在线工具上手动绘制图表可能会耗费大量时间。但你知道吗&#xff1f;你可以使用 LLMs 通过简…...

从波士顿动力到Figure AI:探寻人工智能驱动的机器人智能化

一、引言 1.1 研究背景与意义 在科技飞速发展的当下,机器人智能化已成为全球科技竞争的关键领域,深刻影响着人类社会的生产与生活方式。从工业制造到日常生活服务,从医疗保健到探索未知领域,机器人正逐步渗透进各个行业,展现出巨大的发展潜力与应用价值。其智能化水平的…...

算法——KMP算法(Knuth-Morris-Pratt算法)

KMP算法&#xff08;Knuth-Morris-Pratt算法&#xff09;是一种高效的字符串匹配算法&#xff0c;用于在主文本字符串中快速查找模式字符串的出现位置。其核心思想是通过预处理模式字符串&#xff0c;利用部分匹配信息&#xff08;即“失败函数”或“next数组”&#xff09;避免…...

一周学会Flask3 Python Web开发-flask3模块化blueprint配置

锋哥原创的Flask3 Python Web开发 Flask3视频教程&#xff1a; 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili 我们在项目开发的时候&#xff0c;多多少少会划分几个或者几十个业务模块&#xff0c;如果把这些模块的视图方法都写在app.py…...

Pytorch实现之统计全局信息的轻量级EGAN

简介 简介:模型在EGAN的基础上改进了一个降维的自注意力机制,并且设计了一个新颖的选择算子,使用轮盘赌来选择个体,如果他们的适配度满足fchild<VALUE,则被选中的个体将被丢弃。需要在进化的初始阶段尽快找到最佳个体,并在后续阶段保持种群的多样性。 论文题目:LGE…...

Java开发实习面试笔试题(含答案)

在广州一家中大公司面试&#xff08;BOSS标注是1000-9999人&#xff0c;薪资2-3k&#xff09;&#xff0c;招聘上写着Java开发&#xff0c;基本没有标注前端要求&#xff0c;但是到场知道是前后端分离人不分离。开始先让你做笔试&#xff08;12道问答4道SQL题&#xff09;&…...

《论模型驱动架构设计方法及其应用》审题技巧 - 系统架构设计师

软件测试工程师软考论文写作框架 一、考点概述 “模型驱动架构设计及其应用”这一论题&#xff0c;主要考察了考生对模型驱动架构设计&#xff08;MDA&#xff09;这一先进软件设计方法的理解与应用能力。论题涵盖了MDA的基本概念、核心要素、实施流程及在实际项目中的应用等…...

【服务器与本地互传文件】远端服务器的Linux系统 和 本地Windows系统 互传文件

rz 命令&#xff1a;本地上传到远端 rz 命令&#xff1a;用于从本地主机上传文件到远程服务器 rz 是一个用于在 Linux 系统中通过 串口 或 SSH 上传文件的命令&#xff0c;它实际上是 lrzsz 工具包中的一个命令。rz 命令可以调用一个图形化的上传窗口&#xff0c;方便用户从本…...

初学者如何设置以及使用富文本编辑器[eclipse版]

手把手教你设置富文本编辑器 参考来源&#xff1a;UEditor Docs 初学者按我的步骤来就可以啦 一、设置ueditor编辑器 1.提取文件[文章最底部有链接提取方式] 2.解压文件并放到自己项目中&#xff0c;在WebContent目录下&#xff1a; 3. 修改jar包位置路径 到--> 注意&a…...

在 Java 中解析 JSON 数据

例子解析以下JSON数据 {"code":0,"msg":"成功","data": [{ "host":"1068222.com", "port":"", "m_token":"490e20e70e7de5f21a24b14c12a393f6", "categ…...

Python爬虫实战:从零到一构建数据采集系统

文章目录 前言一、准备工作1.1 环境配置1.2 选择目标网站 二、爬虫实现步骤2.1 获取网页内容2.2 解析HTML2.3 数据保存 三、完整代码示例四、优化与扩展4.1 反爬应对策略4.2 动态页面处理4.3 数据可视化扩展 五、注意事项六、总结互动环节 前言 在大数据时代&#xff0c;数据采…...

SpringCloud系列教程:微服务的未来(二十五)-基于注解的声明队列交换机、消息转换器、业务改造

前言 在现代分布式系统中&#xff0c;消息队列是实现服务解耦和异步处理的关键组件。Spring框架提供了强大的支持&#xff0c;使得与消息队列&#xff08;如RabbitMQ、Kafka等&#xff09;的集成变得更加便捷和灵活。本文将深入探讨如何利用Spring的注解驱动方式来配置和管理队…...

Opengl常用缓冲对象功能介绍及使用示例(C++实现)

本文整理了常用的opengl缓冲区对象并安排了使用示例 名称英文全称作用简述顶点数组对象Vertex Array Object (VAO)管理 VBO 和 EBO 的配置&#xff0c;存储顶点属性设置&#xff0c;简化渲染流程&#xff0c;避免重复设置状态顶点缓冲区对象Vertex Buffer Object (VBO)存储顶点…...

docker独立部署milvus向量数据库

milvus镜像&#xff1a;国外封锁&#xff0c;国内源也不好用。基本上所有源都不能用 首先想到阿里云服务&#xff0c;但是阿里云国外服务器便宜的300~400呢。 基于成本考虑终于装上心心念念的milvus(*^▽^*) 安装 Milvus 安装 Milvus 独立版 wget https://raw.githubuserco…...

Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器

第一章 引言&#xff1a;语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域&#xff0c;文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量&#xff0c;支撑着搜索引擎、推荐系统、…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序

一、开发环境准备 ​​工具安装​​&#xff1a; 下载安装DevEco Studio 4.0&#xff08;支持HarmonyOS 5&#xff09;配置HarmonyOS SDK 5.0确保Node.js版本≥14 ​​项目初始化​​&#xff1a; ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

MySQL 8.0 事务全面讲解

以下是一个结合两次回答的 MySQL 8.0 事务全面讲解&#xff0c;涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容&#xff0c;并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念&#xff08;ACID&#xff09; 事务是…...

Windows安装Miniconda

一、下载 https://www.anaconda.com/download/success 二、安装 三、配置镜像源 Anaconda/Miniconda pip 配置清华镜像源_anaconda配置清华源-CSDN博客 四、常用操作命令 Anaconda/Miniconda 基本操作命令_miniconda创建环境命令-CSDN博客...

Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合

无论是python&#xff0c;或者java 的大型项目中&#xff0c;都会涉及到 自身平台微服务之间的相互调用&#xff0c;以及和第三发平台的 接口对接&#xff0c;那在python 中是怎么实现的呢&#xff1f; 在 Python Web 开发中&#xff0c;FastAPI 和 Django 是两个重要但定位不…...

向量几何的二元性:叉乘模长与内积投影的深层联系

在数学与物理的空间世界中&#xff0c;向量运算构成了理解几何结构的基石。叉乘&#xff08;外积&#xff09;与点积&#xff08;内积&#xff09;作为向量代数的两大支柱&#xff0c;表面上呈现出截然不同的几何意义与代数形式&#xff0c;却在深层次上揭示了向量间相互作用的…...

Java并发编程实战 Day 11:并发设计模式

【Java并发编程实战 Day 11】并发设计模式 开篇 这是"Java并发编程实战"系列的第11天&#xff0c;今天我们聚焦于并发设计模式。并发设计模式是解决多线程环境下常见问题的经典解决方案&#xff0c;它们不仅提供了优雅的设计思路&#xff0c;还能显著提升系统的性能…...