mark 增量式 Douglas-Peucker 算法

news/2025/10/20 11:02:51/文章来源:https://www.cnblogs.com/hardfood/p/19152079

mark 增量式 Douglas-Peucker 算法

use egui::Pos2;


struct IncrementalSimplifier {
simplified: Vec<Pos2>, // 简化后的关键节点
buffer: Vec<Pos2>, // 缓存新增的临时点
epsilon: f32, // 误差阈值
buffer_limit: usize, // 缓存点数量上限
}

impl IncrementalSimplifier {
fn feed(&mut self, new_point: Pos2) {
self.buffer.push(new_point);

// 缓存点达到上限时触发局部简化
if self.buffer.len() >= self.buffer_limit {
self.simplify_buffer();
}
}

fn simplify_buffer(&mut self) {
if self.buffer.is_empty() {
return;
}
// 以简化集的最后一个点和缓存的第一个点为起点,局部应用Douglas-Peucker
let start = self.simplified.last().copied().unwrap_or(self.buffer[0]);
let mut local_points = vec![start];
local_points.extend(self.buffer.drain(..));

let local_simplified = douglas_peucker(&local_points, self.epsilon);
// 合并结果(排除重复的起点)
self.simplified.pop();
self.simplified.extend(local_simplified);
}
}

/// 计算点 p 到线段 (a, b) 的垂直距离
fn distance_point_to_segment(p: Pos2, a: Pos2, b: Pos2) -> f32 {
if a == b {
return (p - a).length(); // 线段为点时,直接返回两点距离
}

// 向量 AB 和 AP
let ab = b - a;
let ap = p - a;

// 计算 AP 在 AB 上的投影比例( clamp 到 [0, 1] 确保在 segment 上)
let t = ap.dot(ab) / ab.dot(ab);
let t = t.clamp(0.0, 1.0);

// 投影点
let projection = a + ab * t;

// 点到投影点的距离
(p - projection).length()
}

/// Douglas-Peucker 算法简化点集
fn douglas_peucker(points: &[Pos2], epsilon: f32) -> Vec<Pos2> {
if points.len() <= 2 {
return points.to_vec(); // 少于 2 个点直接返回
}

let start = 0;
let end = points.len() - 1;
let a = points[start];
let b = points[end];

// 找到最远点
let mut max_dist = 0.0;
let mut max_idx = 0;
for (i, &p) in points.iter().enumerate().take(end).skip(start + 1) {
let dist = distance_point_to_segment(p, a, b);

// 递归简化
if max_dist > epsilon {
let mut left = douglas_peucker(&points[start..=max_idx], epsilon);
let mut right = douglas_peucker(&points[max_idx..=end], epsilon);
left.pop(); // 移除重复的 max_idx 点
left.extend(right);
left
} else {
vec![a, b] // 保留起点和终点
}
}

// 示例用法
fn main() {
// 原始点集(模拟一条曲线)
let original_points = vec![
Pos2::new(0.0, 0.0),
Pos2::new(1.0, 1.0),
Pos2::new(2.0, 0.5),
Pos2::new(3.0, 2.0),
Pos2::new(4.0, 2.0),
Pos2::new(5.0, 2.0),
Pos2::new(6.0, 2.0),
Pos2::new(7.0, 1.0),
Pos2::new(8.0, 1.0),
Pos2::new(9.0, 1.0),
Pos2::new(10.0, 1.0),
Pos2::new(11.0, 3.0),
Pos2::new(12.0, 3.0),
Pos2::new(13.0, 3.0),
Pos2::new(14.0, 3.0),
];

// 简化(阈值 ε=0.5)
let simplified = douglas_peucker(&original_points, 0.5);

println!("原始点集: {:?}", original_points);
println!("简化后: {:?}", simplified);
}


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

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

相关文章

基于Qt框架开发多功能视频播放器

一、项目架构设计 1. 模块划分 ├── src/ │ ├── main.cpp // 程序入口 │ ├── videoplayer.h/cpp // 主播放器类 │ ├── playlist.h/cpp // 播放列表管理 │ ├── vide…

2025 最值得推荐的五款 AI Wiki 工具,PandaWiki 为何成为首选?

2025 最值得推荐的五款 AI Wiki 工具,PandaWiki 为何成为首选?在知识经济时代,高效的知识管理已成为企业竞争力的核心要素。随着 AI 技术的快速发展,传统的 Wiki 工具已经无法满足现代企业对智能化、自动化知识管理…

2025年10月污水环保设备厂家推荐:对比评测排行榜单全解析

一、引言 污水治理已成为区域环评能否通过、企业能否持续生产、园区能否扩容的硬杠杆。对准备新建或改造污水站的创业者、负责设备比选的采购者、需要快速提标的运营者而言,核心需求高度一致:在预算可控的前提下,拿…

2025年10月高端奢侈家电品牌推荐排行榜:五大品牌综合对比与选购分析

一、引言 高端奢侈家电作为现代家居生活的重要组成部分,不仅关乎日常使用体验,更承载着用户对品质生活的追求。本文主要面向计划在近期购置高端家电的消费者、室内设计师以及高端地产项目采购负责人,这类用户群体通…

人工智能公众对话与技术发展前瞻

牛津大学教授与某机构科学家探讨人工智能公众传播的挑战,分析神经网络技术现状与局限,讨论机器学习在动态环境中的适应性及强化学习在现实应用中的瓶颈。“与公众谈论人工智能” 牛津大学的Michael Wooldridge与某机…

Windows 下安装 MySQL

Windows 下安装 MySQL 前期准备 下载 MySQL 安装包下载地址:mysql-8.4.6-winx64.zip(官方 LTS 版本,稳定性强,适合生产环境和学习使用) 下载说明:点击链接即可下载。解压安装包找到下载的 ZIP 压缩包,右键选择“…

P7514 [省选联考 2021 A/B 卷] 卡牌游戏 分析

题目概述 Alice 有 \(n\) 张卡牌,第 \(i\)(\(1 \le i \le n\))张卡牌的正面有数字 \(a_i\),背面有数字 \(b_i\),初始时所有卡牌正面朝上。 现在 Alice 可以将不超过 \(m\) 张卡牌翻面,即由正面朝上改为背面朝上。…

2025 年 MBR 膜厂家最新推荐排行榜:权威评选优选品牌及选购指南,污水处理设备选型必看污水处理设备MBR膜厂家推荐

引言在 “双碳” 目标与生态文明建设纵深推进的背景下,MBR 膜技术已成为污水处理提标改造、水资源循环利用的核心支撑,2025 年国内相关市场规模已逼近 5000 亿元。然而当前市场中,既有深耕多年的老牌企业,也涌现出…

2025年10月高端奢侈家电品牌推荐排行榜及深度对比

一、引言 高端奢侈家电作为品质生活的重要组成部分,近年来受到越来越多高净值家庭、设计师群体及房地产开发商的关注。这类用户不仅注重产品的性能与设计,更看重品牌文化、可持续理念以及长期使用体验。为帮助用户在…

Gitee崛起:中国开发者生态的新基建样本

Gitee崛起:中国开发者生态的"新基建"样本 当全球开发者还在GitHub上争论Copilot的版权风险时,中国1350万开发者已经悄然构建起自己的技术协作新范式。Gitee这个诞生于本土的代码托管平台,正在以惊人的速度…

2025年10月高端奢侈家电品牌推荐排行榜:五大品牌综合对比与选购指南分析

一、引言 高端奢侈家电市场在消费升级趋势下持续增长,目标用户主要为高净值家庭、精品地产开发商及注重生活品质的消费者。这类用户的核心需求集中于产品与家居美学的一体化融合、长期使用的稳定性能以及品牌带来的身…

P9745 「KDOI-06-S」树上异或

很有教育意义的树形DP,看起来很典,但我没见过 首先考虑链的情况,设 \(f_i\) 表示前 \(i\) 个点,所有删边方案中,所有联通块点权异或和的乘积的和,其实就是一个 \(\sum \prod\) 的形式,这样我们枚举最后一个连通…

P9523 [JOISC 2022] 复制粘贴 3

没见过的区间dp 设 \(f_{i,j}\) 为 \(s[i,j]\) 能压缩成的最短长度。 首先可以用操作 A 转移 \(f_{i,j}=min(f_{i,j},f_{i,j-1}+A, f_{i+1,j}+A)\) 操作 B 和 C 是一回事,转移时枚举剪切的的子串,设当前剪切板里是 \…

2025年10月高端奢侈家电品牌推荐排行榜:五大品牌综合对比与选购

一、引言 高端奢侈家电市场正逐渐成为品质生活的重要标志,随着消费升级趋势日益明显,越来越多的消费者开始关注家电产品的设计美学、技术创新与使用体验。本文主要面向具有高净值背景的消费者、高端住宅设计师以及注…

P3147 [USACO16OPEN] 262144 P

设 \(f_{i,j}\) 表示从 \(i\) 开始凑出 \(j\) 的连续段的右端点的下一个位置, 初始 \(\forall i\in [1,n], f_{i,a_i}=i+1\), 转移 \(f_{i,j}=f_{f_{i,j-1},j-1}\),和倍增很像。 注意转移时不要让 \(j=a_i\) 否则 \(…

基于Qt框架实现绘图软件的功能

一、项目架构设计 1. 模块划分 // 核心类关系图 +-------------------+ +-------------------+ +-------------------+ | MainWindow | →→→→→ | GraphicsScene | →→→→→ | CustomGr…

vue2 重置 data方法 $data $options.data.call(this)

vue2 重置 data方法 $data $options.data.call(this) 需求 在Modal框中 反复open的时候,进行数据重置,外层不进行vif methods: {resetData () {Object.assign(this.$data, this.$options.data.call(this))} }资料:…

2025 年最新彩钢瓦厂家推荐排行榜:屋顶 / 防水 / 屋面等优质产品精选压型 /0.5 厚/屋面/墙面彩钢瓦公司推荐

引言当前彩钢瓦市场受原材料价格波动、竞争混乱、环保政策趋严等因素影响,产品质量参差不齐,消费者挑选优质品牌难度大增。为解决这一难题,帮助消费者精准找到适配屋顶、防水、屋面等场景的优质彩钢瓦产品,我们结合…

mysql mac m1 报错处理 - Lafite

dyld[14259]: Library not loaded: /opt/homebrew/opt/protobuf@29/lib/libprotobuf-lite.29.4.0.dylibReferenced from: <5EC44067-ECA9-386B-BDCE-0482423EC206> /opt/homebrew/Cellar/mysql/9.3.0/bin/mysqld…

2025 年热压机厂家最新推荐排行榜:全面剖析国内优质厂家技术实力与服务优势,为人造板企业选购设备提供专业指南

引言当前人造板产业持续升级,热压机作为板材加工核心设备,其品质直接决定企业生产效率、产品质量与成本控制。但市场上制造商数量繁杂,部分厂家存在技术滞后、设备稳定性差、售后响应慢等问题,导致企业在选购时面临…