BambuStudio学习笔记:MarchingSquares类
# Marching Squares算法头文件分析## 文件结构概览
```cpp
#ifndef MARCHINGSQUARES_HPP
#define MARCHINGSQUARES_HPP
// 包含标准库头文件
// 命名空间定义
namespace marchsq {// 基础数据结构struct Coord;using Ring = std::vector<Coord>;// 栅格适配器模板template<class T, class Enable> struct _RasterTraits;template<class ExecutionPolicy, class Enable> struct _Loop;namespace __impl {// 核心算法实现enum class SquareTag : uint8_t; // 单元格状态标记enum class Dir: uint8_t; // 遍历方向template<class Rst> class Grid; // 网格处理核心类}// 对外接口函数template<class Raster> std::vector<Ring> execute(...);
}
#endif
核心数据结构
坐标表示
struct Coord {long r = 0, c = 0; // 行/列坐标size_t seq(const Coord &res) const; // 序列化坐标// 运算符重载...
};
闭合轮廓环
using Ring = std::vector<Coord>; // 由坐标点组成的闭合环
算法实现原理
单元格状态标记(SquareTag)
enum class SquareTag : uint8_t {none, a, b, ab, c, ..., full // 16种可能状态
};
表示2x2像素单元格的四种顶点组合状态,对应Marching Squares的16种基础情况
方向控制(Dir)
enum class Dir: uint8_t { left, down, right, up, none };
用于控制等值线在单元格之间的遍历方向
核心类设计
Grid模板类
template<class Rst> class Grid {// 成员变量const Rst* m_rst; // 栅格数据指针Coord m_cellsize; // 单元格尺寸std::vector<uint8_t> m_tags; // 单元格状态标记集合// 关键方法uint8_t get_tag_for_cell(...); // 计算单元格标记std::vector<Ring> scan_rings(); // 扫描生成轮廓环void interpolate_rings(...); // 精确插值坐标
};
算法流程
执行步骤
关键阶段说明
-
单元格标记:
- 遍历每个2x2单元格
- 根据顶点值与等值阈值比较生成4bit标记
- 处理栅格边界特殊情况
-
环扫描算法:
- 使用深度优先搜索遍历相邻单元格
- 处理16种基础情况及2种模糊情况
- 记录遍历方向防止重复访问
-
坐标插值:
Edge e = edge(ringvertex); CellIt found = std::lower_bound(e.from, e.to, isoval);- 在单元格边界上进行二分查找
- 确定等值线与边界的精确交点
设计亮点
栅格数据适配
template<class T> struct _RasterTraits {static size_t rows(const T&);static size_t cols(const T&);static ValueType get(const T&, size_t, size_t);
};
允许适配任意类型的栅格数据,包括:
- 内存数组
- 图像缓冲区
- 稀疏数据结构
并行处理支持
template<class ExecutionPolicy>
void tag_grid(ExecutionPolicy&& policy, ...)
{for_each(policy, m_tags.begin(), m_tags.end(), ...);
}
通过策略模式实现:
- 单线程顺序执行
- OpenMP并行
- TBB并行等多种执行策略
性能优化
内存布局优化
- 使用紧凑的uint8_t存储单元格标记(4bit标记+4bit访问状态)
- 坐标计算完全基于整型运算
搜索优化
size_t search_start_cell(size_t i = 0) const
{while ((i < m_tags.size()) && (is_visited(i) || is_ambiguous(i))) ++i;return i;
}
- 跳过已处理单元格
- 延迟处理模糊情况
使用示例
基本调用
std::vector<marchsq::Ring> contours = marchsq::execute(image_data, 128);
自定义栅格适配
struct MyRaster {using ValueType = uint8_t;// 实现数据访问接口...
};template<> struct marchsq::_RasterTraits<MyRaster> {// 特化适配方法...
};
注意事项
-
栅格边界处理:
- 自动限制坐标在有效范围内
- 处理部分覆盖的边界单元格
-
模糊情况处理:
- 对ac和bd两种模糊情况特殊处理
- 通过方向追踪避免歧义
-
精度控制:
- 使用整数坐标运算避免浮点误差
- 插值时采用精确的二分查找
扩展接口
执行策略选择
// 使用OpenMP并行
marchsq::execute_with_policy(omp_policy{}, data, isoval);// 单线程执行
marchsq::execute_with_policy(seq_policy{}, data, isoval);
高级参数调节
marchsq::execute(data, isoval, {2, 2}, // 单元格尺寸{1, 1} // 重叠像素
);
潜在优化方向
-
多分辨率处理:
- 动态调整单元格尺寸
- 层次化轮廓生成
-
GPU加速:
- 将标记阶段移植到GPU
- 使用CUDA/OpenCL加速
-
增量更新:
- 局部区域重新计算
- 动态等值线更新
相关文章:
BambuStudio学习笔记:MarchingSquares类
# Marching Squares算法头文件分析## 文件结构概览 cpp #ifndef MARCHINGSQUARES_HPP #define MARCHINGSQUARES_HPP // 包含标准库头文件 // 命名空间定义 namespace marchsq {// 基础数据结构struct Coord;using Ring std::vector<Coord>;// 栅格适配器模板template<…...
重生之我在 CSDN 学习 KMP 算法
深入理解 KMP 算法:高效字符串匹配的利器 一、KMP 算法的由来及其解决的问题 在计算机科学领域,字符串处理是一项极为常见且基础的任务。其中,字符串匹配问题更是频繁出现,例如在文本编辑器中查找特定单词、在生物信息学中搜索 D…...
文献学习——考虑混合储能系统选择的基于改进蜂群算法的热电联产微网多目标经济优化调度
摘要:在考虑混合储能系统模型选择的基础上,基于改进的人工蜂群算法(ABC),建立了冷热电联产微电网经济优化的多目标调度模型。为了对以往研究中的单目标模型进行升级,将模型的优化目标设定为微电网的日发电调…...
GPTQ - 生成式预训练 Transformer 的精确训练后压缩
GPTQ - 生成式预训练 Transformer 的精确训练后压缩 flyfish 曾经是 https://github.com/AutoGPTQ/AutoGPTQ 现在是https://github.com/ModelCloud/GPTQModel 对应论文是 《Accurate Post-Training Quantization for Generative Pre-trained Transformers》 生成式预训练Tr…...
nnMamba:基于状态空间模型的3D生物医学图像分割、分类和地标检测
摘要 本文提出了一种基于状态空间模型(SSMs)的创新架构——nnMamba,用于解决3D生物医学图像分割、分类及地标检测任务中的长距离依赖建模难题。nnMamba结合了卷积神经网络(CNN)的局部特征提取能力与SSMs的全局上下文建…...
安科瑞新能源充电桩解决方案:驱动绿色未来,赋能智慧能源
安科瑞顾强 引言 在“双碳”目标与新能源汽车产业高速发展的双重驱动下,充电基础设施正成为能源转型的核心环节。安科瑞电气股份有限公司凭借在电力监控与能效管理领域20余年的技术积淀,推出新一代新能源充电桩解决方案,以智能化、高兼容性…...
使用开源OPUS-MT模型进行文本翻译(python)
1. 环境准备 pip install transformers 2. 下载机器翻译模型: 2.1 代码从hugging face平台下载 from transformers import MarianMTModel, MarianTokenizer# 指定模型名称 model_name "Helsinki-NLP/opus-mt-zh-en" # 中译英模型# 下载并保存分词器到…...
通过 Docker openssl 容器生成生成Nginx证书文件
使用 alpine/openssl 镜像生成证书 1. 拉取容器 [rootlocalhost ~]# docker run --rm alpine/openssl version OpenSSL 3.3.3 11 Feb 2025 (Library: OpenSSL 3.3.3 11 Feb 2025)2. 运行 alpine/openssl 生成证书(Nginx) # 生成1个.key私钥文件&#…...
Elastic如何获取当前系统时间
文章目录 1. 使用 _ingest.timestamp 在 Ingest Pipeline 中获取当前时间2. 使用 Painless Script 获取当前时间3. 使用 now 关键字在查询中获取当前时间4. 使用 date 类型字段的默认值5. 使用 Kibana 的 Dev Tools 查看当前时间6. 使用 date 聚合获取当前时间7. 使用 Elastics…...
MLT媒体程序框架03:滤镜——loudness
EBU R.128协议 引用链接 EBU的全称为European Broadcasting Union ,既欧洲广播联盟,为欧洲与北非各广播业者(包含广播电台与电视台)的合作组织,成立于1950年2月12日,有五十多个正式加盟国,总部位于瑞士日内瓦,目前中国…...
jenkins配置连接k8s集群
jenkins配置连接k8s集群 前言 我这边jenkins是在一个服务器里面,k8s集群在其他服务器,实现连接 首先jenkins下载有k8s插件 进入配置页面 获取k8s-api-server地址 对应k8s服务器执行 kubectl config view --minify -o jsonpath{.clusters[0].cluste…...
如何选择缓存模式?
如何选择缓存模式 当一个系统引入缓存后,最大的挑战之一便是如何确保缓存与后端数据库的一致性。目前,常见的解决方案主要有Cache Aside、Read/Write Throught和Write Back这三种缓存更新策略。 Read/Write Throught策略 读操作方面,如果缓…...
机器学习常见面试题
常见基模型 1. 线性模型(Linear Models) 特点:通过线性组合特征进行预测,适合处理线性关系。常见类型: 线性回归(Linear Regression)逻辑回归(Logistic Regression)岭回…...
网络安全配置截图 网络安全i
网络安全概念及规范 1.网络安全定义 网络安全的概述和发展历史 网络安全 广义的网络安全:Cyber Security(网络空间安全) 网络空间有独立且相互依存的信息基础设施和网络组成,包括互联网、电信网、计算机系统、嵌入式处理器和控…...
k8s概念及k8s集群部署(Centos7)
Centos7部署k8s集群 部署之前,先简单说下k8s是个啥: 一、k8s简介: k8s,全称:kubernetes,它可以看作是一个分布式系统支撑平台。k8s的作用: 1、故障自愈: k8s这个玩意可以监控容器…...
Manus详细介绍,Manus核心能力介绍
文章目录 前言Manus产品定位与核心理念:Manus产品特性与未来体验战略:Manus商业价值与创新指标:Manus技术特点与竞争优势:Manus用户反馈与展望:Manus市场竞争优势与团队战略:Manus深度总结与启发: 前言 这是一篇关于Manus智能体产品的用户体验评价报告,主要介绍了M…...
Apache XTable:在数据湖仓一体中推进数据互作性
Apache XTable 通过以多种开放表格式提供对数据的访问,在增强互作性方面迈出了一大步。移动数据很困难,在过去,这意味着在为数据湖仓一体选择开放表格式时,您被锁定在该选择中。一个令人兴奋的项目当在数据堆栈的这一层引入互作性…...
Java直通车系列14【Spring MVC】(深入学习 Controller 编写)
目录 基本概念 编写 Controller 的步骤和要点 1. 定义 Controller 类 2. 映射请求 3. 处理请求参数 4. 调用业务逻辑 5. 返回响应 场景示例 1. 简单的 Hello World 示例 2. 处理路径变量和请求参数 3. 处理表单提交 4. 处理 JSON 数据 5. 异常处理 基本概念 Cont…...
36-Openwrt wifi命令工具iwconfig、iwinfo、iwpriv、iwlist
增对wifi的调试命令有很多,这边列出我们常用的命令提供参考,方便查看信息定位问题。 1、iwconfig 查看当前 WIFI 的工作信道以及工作带宽模式: root@openwrt:/# iwconfig ra0 ra0 mt7603e ESSID:"openwrt" Mode:Managed Channel:8 Access Point: DC:4B…...
tauri加载网页处理点击a链接默认浏览器打开问题
添加click事件,当点击了a标签,就阻止默认事件,然后自己处理,在自己窗口中打开这个页面。将这个js注入到页面中就可以了 const hookClick (e) > {console.log(hookClick, e)e.preventDefault()const origin e.target.closest…...
openharmony 软总线-设备发现流程
6.1 设备发现流程 6.1.1 Wi-Fi设备发现 6.1.1.1 Wi-Fi设备发现流程 Wi-Fi设备在出厂状态或者恢复出厂状态下,设备上电默认开启SoftAP模式,SoftAP的工作信道在1,6,11中随机选择,SoftAP的Beacon消息中携带的SSID eleme…...
大白话CSS 优先级计算规则的详细推导与示例
大白话CSS 优先级计算规则的详细推导与示例 答题思路 引入概念:先通俗地解释什么是 CSS 优先级,让读者明白为什么要有优先级规则,即当多个 CSS 样式规则作用于同一个元素时,需要确定哪个规则起作用。介绍优先级的分类࿱…...
【GoTeams】-4:为项目引入etcd
本文目录 1. 书接上回2. 引入etcddiscoverystruct{}{} resolverserver 3. 将服务注册到etcd中4. 梳理下etcd调用逻辑 1. 书接上回 本节是为项目引入etcd这个环节,然后我们来看看具体该怎么实现。 首先来谈谈为什么要引入服务发现? 动态服务注册与发现…...
DeepSeek + Kimi:高效制作PPT实战详解
在快节奏的职场环境中,制作高质量的PPT已成为许多人的日常任务。然而,从零开始构思、设计、撰写并优化一份精美的PPT往往耗时费力。幸运的是,AI技术的飞速发展为我们提供了全新的解决方案。本文将详细介绍如何利用DeepSeek与Kimi智能助手的高…...
计算机基础:二进制基础06,用八进制来计数
专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 (一)WIn32 专栏导航 上一篇:计算机基础:二进制基础05,八进制简介 回…...
OSCP最新备考攻略:迎接2024改版后的OSCP+认证
OSCP(Offensive Security Certified Professional)是渗透测试领域一块金字招牌,由Offensive Security打造,因其硬核实战和高门槛备受推崇。2024年11月1日,OSCP迎来了一次重量级改版,推出了OSCP认证…...
Jmeter使用介绍
文章目录 前言Jmeter简介安装与配置JDK安装与配置JMeter安装与配置 打开JMeter方式一方式二 设置Jmeter语言为中文方法一(仅一次性)方法二(永久设置成中文) Jmeter文件常用目录 元件与组件元件组件元件的作用域元件的执行顺序第一个案例添加线程组添加 H…...
hooks useModule自定义hooks (二次封装AgGridReact ag-table)自定义表头,自定义表头搜索
场景业务: 多次运用AgGridReact的table 列表 思路: 运用自定义hooks进行二次封装: 通用配置例如:传参的参数,传参的url,需要缓存的key这些键值类 定制化配置例如:需要对table 的一些定制化传…...
Android Studio 配置国内镜像源
Android Studio版本号:2022.1.1 Patch 2 1、配置gradle国内镜像,用腾讯云 镜像源地址:https\://mirrors.cloud.tencent.com/gradle 2、配置Android SDK国内镜像 地址:Index of /AndroidSDK/...
OFA:通过简单的序列到序列学习框架统一架构、任务和模态
【摘要】 摘要总结 本文介绍了一种新的统一框架OFA(One For All),旨在通过一个简单的序列到序列学习框架来实现跨模态和单模态任务的统一预训练。OFA框架支持任务无关性和模态无关性,并能实现任务全面性。OFA统一了包括图像生成、视觉定位、图像字幕、图像分类、语言建模…...
