思考: 从曲线中提取出近似直线的一段

2023-05-16

        这个问题也是别人问我的, 我思考了一些时间, 希望抛砖引玉, 得到更好的方法.

        问题是这样的: 有一些离散的点, 在坐标系中把它们拟合成一条曲线, 其中有一段看上去很像是直线, 现在要求出这段"直线"的起始坐标和结束坐标, 并把这条线的方程求出来. 如下图:

2011082300583973.jpg

        从图中可以用肉眼看出标注的那一段近似一条直线, 问题是如果通过程序求出来.

我的想法

        我的想法是这样的, 假设这条线是存在的, 那么这条线里的点, 它们相邻两两之间Y之差应该是"相似"的, 具体相似要什么程度, 需要有一个"允许误差值". 在这个允许误差值下, 尽可能多的把这条曲线上连续的点拉拢到一条直线上, 最后根据这些点用最小二乘法就可以求得直线方程了.

获取这些连续的点:


static List<Point> GetSequential(List<Point> points, double allowLapse)
{
    var resultList = new List<List<Point>>();
    var currentResult = new List<Point>();

    currentResult.Add(points[0]);
    for (int i = 1; i < points.Count; i++)
    {
        //如果这个点与前一个点的高度差在一个合理的范围内
        if ((points[i].Y - points[i - 1].Y) < allowLapse)
            currentResult.Add(points[i]);
        else
        {
            resultList.Add(currentResult);
            currentResult = new List<Point>();
            currentResult.Add(points[i]);
        }
    }
    resultList.Add(currentResult);
    //从集合中选出点的数量最多的那组数据
    List<Point> result = resultList.OrderByDescending(list => list.Count).First();
    return result;
}  

Point类的定义, 很简单:


internal class Point
{
    public double X { get; private set; }
    public double Y { get; private set; }

    public Point(double x, double y)
    {
        X = x; Y = y;
    }
}  

根据一些点, 用最小二乘法求出直线:


static void LeastSquare(List<Point> points)
{
    double avgX = points.Average(point => point.X);
    double avgY = points.Average(point => point.Y);

    double numerator = points.Sum(point => (point.X - avgX) * (point.Y - avgY));
    double denominator = points.Sum(point => (point.X - avgX) * (point.X - avgX));
    double K = numerator / denominator; //斜率

    double X0 = avgY - K * avgX;
    //为了方便测试, 我直接在这里输出结果
    Console.WriteLine("Y={0} + {1}X\nStart ({2}, {3})\tEnd ({4}, {5})\nPoints Count: {6}", X0, K, points.First().X, points.First().Y, points.Last().X, points.Last().Y, points.Count);
}  

测试结果

允许Y差值方程起点终点包含点数
0.005Y=0.27 + 0.45X(0.13, 0.328201)(0.15, 0.337173)3
0.010Y=0.25 + 0.60X(0.12, 0.318606)(0.17, 0.350823)6
0.015Y=0.48 + 1.08X(0.54, 1.060612)(0.77, 1.318348)24
0.020Y=0.23 + 1.46X(0.28, 0.611221)(0.77, 1.318348)50
0.025Y=0.22 + 1.48X(0.26, 0.56426)(0.77, 1.318348)52
0.030Y=0.13 + 1.64X(0.09, 0.255596)(0.77, 1.318348)69
0.035Y=0.13 + 1.64X(0.08, 0.222174)(0.77, 1.318348)70
0.040Y=0.12 + 1.65X(0.07, 0.183729)(0.77, 1.318348)71

        对比文中开头的插图, 可以看出"允许Y差值"在0.020和0.025, 得到的数据还是比较靠谱的. 但这样的做法还有一点问题, 如果每个点都比前一个点高一点(在允许Y差值范围内), 等到点积累多了, 从整体看, 这些点组成的线就是一条向上的抛物线了, 那么这个算法就存在问题.

       如果您有什么想法, 欢迎交流, 附上图中数据下载(数据只含Y坐标值, X从0.0开始, 相邻两点X间隔0.01).

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

思考: 从曲线中提取出近似直线的一段 的相关文章

  • antd-design LocaleProvider国际化

    1 LocaleProvider 使用 React 的 context 特性 xff0c 只需在应用外围包裹一次即可全局生效 import LocaleProvider from 39 antd 39 import zh CN from 3
  • python 读取文件、并以十六进制的方式写入到新文件

    usr bin env python infile 61 file 34 in mp3 34 34 rb 34 outfile 61 file 34 out txt 34 34 wb 34 def main while 1 c 61 inf
  • perl的内置函数scalar

    scalar可以求数组的长度 xff0c 但是 xff0c 在scalar的说明里面并没有这一项 Forces EXPR to be interpreted in scalar context and returns the value o
  • sqlalchemy批量删除数据、全量删除

    问题 xff1a sqlalchemy如何批量删除多条数据 解决 xff1a 使用参数synchronize session 61 False xff0c 或for循环 方法 xff1a users 61 self db query Use
  • 经典的同态滤波算法的优化及其应用参数配置。

    同态滤波 xff0c 网络上有很多文章提到过这个算法 xff0c 我们摘取百度的一段文字简要的说明了该算法的核心 xff1a 同态滤波是一种减少低频增加高频 xff0c 从而减少光照变化并锐化边缘或细节的图像滤波方法 关于该算法 xff0c
  • Trajectory following with MAVROS OFFBOARD on Raspberry Pi

    原文链接 Trajectory following with MAVROS OFFBOARD on Raspberry Pi Jaeyoung Lim August 10 2016 404warehouse Small Projects B
  • 职位介绍 之 嵌入式开发工程师

    笔者电子信息专业硕士毕业 xff0c 获得过多次电子设计大赛 大学生智能车 数学建模国奖 xff0c 现就职于南京某半导体芯片公司 xff0c 从事硬件研发 xff0c 电路设计研究 对于学电子的小伙伴 xff0c 深知入门的不易 xff0
  • Elementui el-dialog 组件我又学会了一种新的用法

    1 新建弹窗Form vue文件 将visible属性设置为true lt template gt lt div gt lt el dialog title 61 34 提示 34 visible 61 34 true 34 width 6
  • webpack系列——实现一个行内样式px转vw的loader

    需求 自从有了postcss来处理css文件 xff0c 我们可以快速进行网站适配的开发 xff0c 只需要改改参数 xff0c 样式按照设计稿的px写 xff0c webpack编译自动转换成rem或者vw等 但是 xff0c 标签内的p
  • Scrapy爬虫 - 获取知乎用户数据

    2016 04 10 Scrapy爬虫 获取知乎用户数据 安装Scrapy爬虫框架 关于如何安装Python以及Scrapy框架 xff0c 这里不做介绍 xff0c 请自行网上搜索 初始化 安装好Scrapy后 xff0c 执行 scra
  • 百度云下载的压缩吧损坏问题解决

    有时用百度云下载压缩包回来之后会出现损坏不能解压的问题 xff0c 比如 xff1a 1 使用网页的批量下载 xff0c 此时百度云会压缩成一个包 xff0c 格式为zip xff0c 而下载下载回来之后用WinRAR解压就会出现CRC校验
  • 理解BPDU Guard的意义(BPDU Guard在全局配置与接口配置上的区别)

    BPDU Guard xff08 BPDU保护 xff09 xff0c 简单的讲它的意义就是一个不该接收 BPDU的端口 xff0c 比如被启动了 portfast的端口 xff0c 一旦收到 BPDU报文 xff0c 那么 BPDU保护功
  • frida hook java原生算法同时打印调用堆栈

    coding UTF 8 import frida sys jsCode 61 34 34 34 function showStacks Java perform function send Java use 34 android util
  • 步步为营 .NET 设计模式学习笔记 十六、Facade(外观模式)

    概述 在软件开发系统中 xff0c 客户程序经常会与复杂系统的内部子系统之间产生耦合 xff0c 而导致客户程序随着子系统的变化而变化 那么如何简化客户程序与子系统之间的交互接口 xff1f 如何将复杂系统的内部子系统与客户程序之间的依赖解
  • tld 标签元素

    每个自定义标签都必须在tld文件中声明 xff0c tld文件只不过是一个XML文件 根元素是 lt taglib gt xff0c 它包含一个或者多个 lt tag gt 标签 xff0c 该元素用来声明定制标签 TLD 文件中的元素标签
  • cuda中用cublas库做矩阵乘法

    这里矩阵C 61 A B xff0c 原始文档给的公式是C 61 alpha A B 43 beta C xff0c 所以这里alpha 61 1 xff0c beta 61 0 主要使用cublasSgemm这个函数 xff0c 这个函数
  • cv_bridge中的编码模式与实现

    image encodings cpp文件是关于图像编码模式的源文件 xff0c 其中规定了RGB的图像以及深度图的编码模式 该编码文件image encodings cpp所依赖的头文件图 命令空间 sensor msgs image e
  • Pixhawk进阶开发

    使用者 初见Pixhawk 大家知道Pix是一个出色的开源飞控 xff0c 那到底什么是Pixhawk呢 xff0c 它有那些种类 它的硬件是怎么设计的 xff0c 软件是基于什么方式设计的 xff0c 我们怎么连接 初始化配置 怎么调节参
  • Java程序心得体会

    学习Java是一件快乐的事情 xff0c 刚开始学习的时候还有点难 xff0c 后来慢慢熟悉了Java的程序操作 xff0c 在错误中获得技巧 xff0c 一次又一次的失败 xff0c 让我对Java产生了兴趣 xff0c 现在对Java既

随机推荐

  • linux网卡顺序发生变化,(linux)复制的虚拟机网卡eth0变成了eth1或其他名称后修正方法...

    正在使用的虚拟机 xff0c 复制之后 xff0c 发现网卡名称发生了变化 xff0c 修正方法如下 xff1a 比如eth0变成了eth1 xff1a ifconfig xff1a udev动态管理设备文件 xff1a cat etc u
  • Android中的Android中的Surface和SurfaceView

    一 什么是Surface 简单的说Surface对应了一块屏幕缓冲区 xff0c 每个window对应一个Surface xff0c 任何View都要画在Surface上 传统的view共享一块屏幕缓冲区 xff0c 所有的绘制必须在UI线
  • 创新AI技术引领手机芯片发展方向,麒麟970荣获中国好设计金奖

    11月24日 xff0c 2017年中国好设计颁奖仪式在深圳正式召开 xff0c 奖项一共设置为金奖 银奖 创意奖 入围奖四个级别 而麒麟970作为人工智能领域的代表性产品 xff0c 也是唯一的芯片产品 xff0c 在今年的85个项目中脱
  • 史上最全阿里 Java 面试题总结

    以下为大家整理了阿里巴巴史上最全的 Java 面试题 xff0c 涉及大量 Java 面试知识点和相关试题 JAVA基础 JAVA中的几种基本数据类型是什么 xff0c 各自占用多少字节 String类能被继承吗 xff0c 为什么 Str
  • 图象传输协议——PCoIP

    PCoIP 是一种高性能显示协议 专为交付虚拟桌面而构建 无论最终用户具有什么任务或处于何位置 均可为其提供内容极为丰富的最佳桌面体验 借助 PCoIP 整个计算体验先经过在数据中心进行 压缩 加密和编码 然后再通过标准 IP 网络传输到启
  • VB6 对象库未注册问题

    以下是个人使用VB6出现对象库未注册问题的解决方法 已成功 xff01 一 注册ocx文件 mscomctl ocx文件放进路径C Windows System32 xff08 64是此路径 xff0c 由于本人是64位系统32位未测试 x
  • 源码阅读技巧篇

    转载请注明原创出处 xff0c 谢谢 xff01 说在前面 本人水平有限 xff0c 下面的一些都是本人的思考与理解 xff0c 如果有那里不对 xff0c 希望各位大佬积极指出 xff0c 欢迎在留言区进行评论交流 探讨 主题 为什么要读
  • 黑箱方法-神经网络①

    人工神经网络 人工神经网络的概念 人工神经网络 xff08 Artificial Neural Networks xff0c ANN xff09 是对一组输入信号和一组输出信号之间的关系进行建模 xff0c 使用的模型来源于人类大脑对来自感
  • 飞行前的准备工作

    1 飞控固件 Mission Planner 里的版本 xff0c 好像没有offboard和一些参数的设置 Mission Planner中固件下载 3 3 3 3 4 6 Qground Control中的固件QGC中的固件中有offb
  • make menuconfig 无法启动处理方法

    ake menuconfig Unable to find the ncurses libraries required header files 问题 xff1a lzz 64 lzz virtual machine linux 2 6
  • Ubuntu下自动输入sudo密码

    sudo 自动输入密码 echo 34 password 34 sudo S netstat tlnp S参数 The S stdin option causes sudo to read the password from the sta
  • ssh 或 putty 连接linux报错解决方法

    由于当天多次输入错误密码 xff0c ssh和putty就连接不上了 xff0c 纠结了很久解决问题 ssh连接提示错误 xff1a server unexpectedly closed network connection putty 连
  • Postman 安装及使用入门教程

    安装 本文只是基于 Chrome 浏览器的扩展插件来进行的安装 xff0c 并非单独应用程序 首先 xff0c 你要台电脑 xff0c 其次 xff0c 安装有 Chrome 浏览器 xff0c 那你接着往下看吧 1 官网安装 xff08
  • k8s通过service访问pod(五)--技术流ken

    service 每个 Pod 都有自己的 IP 地址 当 controller 用新 Pod 替代发生故障的 Pod 时 xff0c 新 Pod 会分配到新的 IP 地址 这样就产生了一个问题 xff1a 如果一组 Pod 对外提供服务 x
  • 计算机图形学在GIS中的应用,GIS在交通中的应用与发展-

    xff27 xff29 xff33 在交通中的应用与发展 摘 要 xff1a 地理信息技术的日臻成熟为 xff27 xff29 xff33 在交通领域内的广泛应用创造了一定基础 本文总结了 xff27 xff29 xff33 技术的特点 x
  • 查询MYSQl数据表中的最后一条记录

    mysql select from table order by id DESC limit 1 oracle select from emp where id in select max id from emp 实例 xff1a mysq
  • Windows 10 替换 cmd 的命令行工具

    最近找 Windows 10 的命令行工具 xff0c 发现了 Windows 自带的 PowerShell xff0c 确实功能强大 推荐 查找方法 xff1a 搜索 xff0c PowserShell 打开就能用 https www z
  • 压控恒流源电路

    http bbs 21ic com forum php mod 61 viewthread amp tid 61 1634988 amp highlight 61 4 20ma 最简单简陋的电流输出电路 xff0c 是用 三级管 43 放大
  • OFFBOARD

    Pixhawk的offboard模式 xff0c 是指我们不用遥控器操控飞机 xff0c 也不用地面站给它设定plan 直接用飞机上的板载计算机来与Pixhawk进行通信 xff0c 控制飞机运动 准备工作 xff1a 首先要有一个板载计算
  • 思考: 从曲线中提取出近似直线的一段

    这个问题也是别人问我的 我思考了一些时间 希望抛砖引玉 得到更好的方法 问题是这样的 有一些离散的点 在坐标系中把它们拟合成一条曲线 其中有一段看上去很像是直线 现在要求出这段 34 直线 34 的起始坐标和结束坐标 并把这条线的方程求出来