热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WPF折线/坐标点绘制LargestTriangleThreeBuckets算法

本文算法来自https:skemman.isbitstream1946153433SS_MSthesis.pdf作者对比了几个算法,主要突出的是 Largest-Triangle-

本文算法来自

https://skemman.is/bitstream/1946/15343/3/SS_MSthesis.pdf

作者对比了几个算法,主要突出的是  Largest-Triangle-Three-Buckets算法,我个人翻译为最大三点【三角】面积特征。同样作者给出了代码,我也找到了C#代码,适当改了下。主要是说说算法

主要说说几点:

1:算法的主要源于Visvalingam-Whyatt,也就是基于点与前后点形成的面积是否大于阈值,小于阈值则删除点。

   简单说一下Visvalingam-Whyatt,

  ①当节点从首位开始,连接前两个(因为是首位,没有后面),紧接着是第二点,2点连接首点,连接三点,依次向下,末位点参考首点

  ②当形成全部的三角后删除面积最小的结点,并由移至附近两点,重新形成三角形【或者从头重新连接~~】

  ③重复①,确定所有三角形的面积都小于阈值

 

2:LTTB是可以控制返回点的数量(亮点!!)

    基本操作:点集排除首尾点后的 数量与输出点的数量(同样减去首尾点,也就是-2)的比值,然后每比值的一个点集,默认第一个点是独立的一个点集,最后一个点也是独立的一个点集

      理论上第二步是选择点与下两个点集中的点所形成的最大的三角形的面积的点,实际上,算法中是 点1确定,点集3通过计算按照第几个点集,然后计算这个点集中所有的点的平均值(X,Y两个值的平均值)所创造的点,不一定存在。

     这样子就可以确定点1,点集2,然后不断筛选点集2的点,经行计算面积来比较大小。最后 依次重复上述步骤到下一个点,直至结束。

     同样,不用平均值,也可以枚举点集3与点集2的点与点1 所形成的每个三角形的面积。论文中 作者指出 差不多的效果~~(水啊????)

     最后 视觉效果上真的不错! 不过论文中说,当波峰值较大时,也有可能表现不好~

 

代码实现的步骤:

  零 初始点1为首点

  ① 计算比值(除去首尾,每个点集的数量)

  ② 计算点集3中点的平均点

  ③ 枚举点集2与点集3的平均和点1形成最大的三角形面积,并加入输出点集

  ④ 点1设置位点集2的最大面积点,并进入下一次循环步骤②

 

截图 

  WPF 折线/坐标点绘制     Largest-Triangle-Three-Buckets算法

 

 

代码 来自https://github.com/cgddrd/CSharp-LargestTriangleThreeBuckets(略微改造)

  public static List Get(List data, int threshold)
            {
                int dataLength = data.Count;
                if (threshold >= dataLength || threshold == 0)
                    return data; // Nothing to do

                List sampled = new List (threshold);

                // 点集大小,排除首尾点,阈值减2, 
                double every = (double)(dataLength - 2) / (threshold - 2);

                int a = 0;
                Point maxAreaPoint = new Point();
                int nextA = 0;

                sampled.Add(data[a]); //默认添加首点

                for (int i = 0; i 2; i++)
                {
                    // 假设第三个点是此前区间的平均值,大概率不存在,凭空捏造一个????
                    double avgX = 0;
                    double avgY = 0;
                    int avgRangeStart = (int)(((i + 1) * every) + 1);
                    int avgRangeEnd = (int)(((i + 2) * every) + 1);
                    avgRangeEnd = avgRangeEnd  avgRangeEnd : dataLength;

                    int avgRangeLength = avgRangeEnd - avgRangeStart;

                    for (; avgRangeStart )
                    {
                        avgX += data[avgRangeStart].X; // * 1 enforces Number (value may be Date)
                        avgY += data[avgRangeStart].Y;
                    }
                    avgX /= avgRangeLength;

                    avgY /= avgRangeLength;

                    // +1是为了排除当前点
                    int rangeOffs = (int)(Math.Floor((i + 0) * every) + 1);
                    int rangeTo = (int)(Math.Floor((i + 1) * every) + 1);

                    // Point a
                    double pointAx = data[a].X; // enforce Number (value may be Date)
                    double pointAy = data[a].Y;

                    double maxArea = -1;

                    for (; rangeOffs )
                    {
                        //计算面积 点1  点集2  虚拟的点3~~
                        double area = Math.Abs((pointAx - avgX) * (data[rangeOffs].Y - pointAy) -
                                               (pointAx - data[rangeOffs].X) * (avgY - pointAy)
                                          ) * 0.5;
                        if (area > maxArea)
                        {
                            maxArea = area;
                            maxAreaPoint = data[rangeOffs];
                            nextA = rangeOffs; //设置下一个点
                        }
                    }

                    sampled.Add(maxAreaPoint);  
                    a = nextA; // 进入下一次循环
                }

                sampled.Add(data[dataLength - 1]);  //默认添加尾点

                return sampled;
            }

 

   

 


推荐阅读
  • 深入解析ESFramework中的AgileTcp组件
    本文详细介绍了ESFramework框架中AgileTcp组件的设计与实现。AgileTcp是ESFramework提供的ITcp接口的高效实现,旨在优化TCP通信的性能和结构清晰度。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 本文详细介绍了如何在Ubuntu系统中下载适用于Intel处理器的64位版本,涵盖了不同Linux发行版对64位架构的不同命名方式,并提供了具体的下载链接和步骤。 ... [详细]
  • 汇编语言等号伪指令解析:探究其陡峭的学习曲线
    汇编语言以其独特的特性和复杂的语法结构,一直被认为是编程领域中学习难度较高的语言之一。本文将探讨汇编语言中的等号伪指令及其对初学者带来的挑战,并结合社区反馈分析其学习曲线。 ... [详细]
  • 作者:守望者1028链接:https:www.nowcoder.comdiscuss55353来源:牛客网面试高频题:校招过程中参考过牛客诸位大佬的面经,但是具体哪一块是参考谁的我 ... [详细]
  • 本文详细介绍了福昕软件公司开发的Foxit PDF SDK ActiveX控件(版本5.20),并提供了关于其在64位Windows 7系统和Visual Studio 2013环境下的使用方法。该控件文件名为FoxitPDFSDKActiveX520_Std_x64.ocx,适用于集成PDF功能到应用程序中。 ... [详细]
  • Coursera ML 机器学习
    2019独角兽企业重金招聘Python工程师标准线性回归算法计算过程CostFunction梯度下降算法多变量回归![选择特征](https:static.oschina.n ... [详细]
  • 历经三十年的开发,Mathematica 已成为技术计算领域的标杆,为全球的技术创新者、教育工作者、学生及其他用户提供了一个领先的计算平台。最新版本 Mathematica 12.3.1 增加了多项核心语言、数学计算、可视化和图形处理的新功能。 ... [详细]
  • 在尝试使用C# Windows Forms客户端通过SignalR连接到ASP.NET服务器时,遇到了内部服务器错误(500)。本文将详细探讨问题的原因及解决方案。 ... [详细]
  • 使用Vultr云服务器和Namesilo域名搭建个人网站
    本文详细介绍了如何通过Vultr云服务器和Namesilo域名搭建一个功能齐全的个人网站,包括购买、配置服务器以及绑定域名的具体步骤。文章还提供了详细的命令行操作指南,帮助读者顺利完成建站过程。 ... [详细]
  • 从零开始构建完整手机站:Vue CLI 3 实战指南(第一部分)
    本系列教程将引导您使用 Vue CLI 3 构建一个功能齐全的移动应用。我们将深入探讨项目中涉及的每一个知识点,并确保这些内容与实际工作中的需求紧密结合。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 图数据库中的知识表示与推理机制
    本文探讨了图数据库及其技术生态系统在知识表示和推理问题上的应用。通过理解图数据结构,尤其是属性图的特性,可以为复杂的数据关系提供高效且优雅的解决方案。我们将详细介绍属性图的基本概念、对象建模、概念建模以及自动推理的过程,并结合实际代码示例进行说明。 ... [详细]
  • 本文将详细探讨 Java 中提供的不可变集合(如 `Collections.unmodifiableXXX`)和同步集合(如 `Collections.synchronizedXXX`)的实现原理及使用方法,帮助开发者更好地理解和应用这些工具。 ... [详细]
  • 本文探讨了如何在Java中使用JAXB解组两个具有相同名称但不同结构的对象。我们将介绍一个抽象类Bar及其具体实现,并展示如何正确地解析XML文档以获取正确的对象实例。 ... [详细]
author-avatar
穆羽默然
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有