跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
TypeScript大前端算法

LTTB 最大三角形三桶法详解

LTTB(最大三角形三桶法)是一种专为时间序列折线图设计的高效降采样算法。它通过计算前一点、当前候选点与下一点平均位置构成的三角形面积,选取面积最大的点作为代表,能在大幅压缩数据量的同时最大程度保留曲线的峰值、谷值和趋势拐点。相比简单的平均或极值采样,LTTB 基于几何学驱动,视觉失真更小。该算法时间复杂度为 O(n),适合在浏览器中实时处理十万级数据点的渲染需求,常配合 uPlot 等图表库使用。

MongoKing发布于 2026/3/25更新于 2026/9/1028K 浏览
LTTB 最大三角形三桶法详解

LTTB 全称 Largest Triangle Three Buckets(最大三角形三桶法),是一种专为时间序列 / 折线图可视化设计的高效降采样算法。

它能在把 10 万 + 数据点压缩到几百~2000 点的同时,最大程度保留曲线的视觉特征(峰值、谷值、趋势拐点),比'每桶取平均''每桶取最大/最小'效果好得多,常用于 uPlot、Highcharts、TradingView 等大图表库。

为什么需要 LTTB?

  • 直接绘制 10 万点 → Canvas 渲染性能受限(浏览器渲染瓶颈)
  • 简单平均采样 → 容易'平滑处理'导致尖峰抹平,视觉失真严重
  • LTTB 的优势:几何学驱动,优先保留'对整体形状贡献最大'的点

核心思想(Three Buckets)

算法每次同时考虑3 个桶:

  1. 前一个桶 → 用上一次选中的点 prev 代表
  2. 当前桶 → 遍历桶内所有候选点
  3. 下一个桶 → 用平均点(avg)代表

对当前桶的每个点 c,计算三角形 prev — c — avg 的面积,选择面积最大的点作为当前桶的代表点。

数学公式:三角形面积(叉积法)

[ \text{Area} = \frac{1}{2} \left| (x_2 - x_1)(y_3 - y_1) - (x_3 - x_1)(y_2 - y_1) \right| ] 其中:

  • $(x_1, y_1)$ = 前一个已选点 prev
  • $(x_2, y_2)$ = 当前桶候选点 c
  • $(x_3, y_3)$ = 下一个桶的平均点 avg

标准算法流程(伪代码)

function lttb(data: Point[], threshold: number): Point[] {
  const n = data.length;
  if (n <= threshold) return data;

  const sampled: Point[] = [data[0]];           // 永远保留第一个点
  const every = (n - 2) / (threshold - 2);      // 桶大小

  let a = 0;                                    // 上一个选中点的索引

  for (let i = 0; i < threshold - 2; i++) {
    // 计算下一个桶的平均点
    const avgRangeStart = Math.floor((i + 1) * every) + 1;
    const avgRangeEnd = Math.min(Math.floor((i + 2) * every) + 1, n);
    let avgX = 0, avgY = 0;
    for (let j = avgRangeStart; j < avgRangeEnd; j++) {
      avgX += data[j].x;
      avgY += data[j].y;
    }
    const avgRangeLength = avgRangeEnd - avgRangeStart;
    avgX /= avgRangeLength;
    avgY /= avgRangeLength;

    // 在当前桶里找面积最大的点
    let maxArea = -1;
    let nextA = 0;
    const rangeOffs = Math.floor((i + 1) * every) + 1;
    const rangeTo = Math.min(Math.floor((i + 2) * every) + 1, n);

    for (let j = rangeOffs; j < rangeTo; j++) {
      const area = Math.abs(
        (data[a].x - avgX) * (data[j].y - data[a].y) -
        (data[a].x - data[j].x) * (avgY - data[a].y)
      ) * 0.5;

      if (area > maxArea) {
        maxArea = area;
        nextA = j;
      }
    }

    sampled.push(data[nextA]);
    a = nextA;   // 更新为下一次的前驱
  }

  sampled.push(data[n - 1]);  // 永远保留最后一个点
  return sampled;
}

时间复杂度:O(n) —— 非常高效,10 万点在浏览器里 < 10ms 就能完成。

在实际功耗数据点渲染中的应用

  • 功耗曲线 10 万 + 点 → 设置 threshold = 2000
  • 缩放 / 平移时,只对当前 viewport 内的原始数据再跑一次 LTTB(动态重采样)
  • 结合 uPlot 的 setData + requestAnimationFrame,实现流畅交互

目录

  1. 为什么需要 LTTB?
  2. 核心思想(Three Buckets)
  3. 数学公式:三角形面积(叉积法)
  4. 标准算法流程(伪代码)
  5. 在实际功耗数据点渲染中的应用

更多推荐文章

查看全部
  • C++ STL unordered_set/unordered_map 使用介绍
  • 普通 PC 安装 macOS 系统教程
  • 算法性能优化实战策略:从瓶颈突破到效率提升
  • DeepSeek 时代:前端开发者的护城河与转型方向
  • AI 产品经理就业方向与转行指南:核心技能与薪资分析
  • Windows 系统安装与配置 Neo4j 图数据库指南
  • VS Code + GitHub Copilot 实战指南:从配置到高效协作
  • Java 基础入门 (1): Spring Web MVC 核心解析
  • 阿里开源 PageAgent:让 AI 住进网页,用自然语言操控界面
  • Qwen-Image-2512 效果实测:多主体交互与手指动作逻辑
  • DeepSeek-R1-Distill-Llama-8B 优化技巧:提升文本生成质量
  • MiniMax 海螺 AI:基于图片与文本生成高质量视频
  • 解决 Git 下载慢的问题:国内外镜像地址与安装教程
  • 库博(CoBOT):嵌入式 C/C++ 代码质量全流程守护方案
  • 基于 SpringBoot 的美食菜谱与食材商城一体化平台设计
  • jQuery WebUI Popover 插件快速入门与实战
  • 两个半圆转出圆形进度条:纯CSS方案与踩坑全记录
  • Flutter Web 开发:解决跨域(CORS)问题指南
  • 递归算法详解:汉诺塔、链表操作与快速幂
  • Linux 线程池封装与实现详解

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online