本文介绍一种直线的识别方案。

步骤
  1. 使用最小二乘法回归直线:

  1. 得到直线方程y=kx+b后,计算所有点到直线的距离,若在阈值范围内,认为是直线。
实现
  1. /// <summary>
  2. /// 最小二乘法求回归直线方程
  3. /// </summary>
  4. /// <param name="points">输入数据</param>
  5. /// <param name="k">直线斜率</param>
  6. /// <param name="b">直线截距</param>
  7. /// <param name="type">直线类型 1:水平线 2:垂直线 3:一般直线</param>
  8. /// <returns></returns>
  9. public static bool IsLine(List<Point> points, out double k, out double b, out int type)
  10. {
  11. k = 0;
  12. b = 0;
  13. type = 0;
  14. if (points.Count < 2) return false;
  15. double averageX = 0, averageY = 0, n = 0;
  16. n = points.Count;
  17. foreach (Point p in points)
  18. {
  19. averageX += p.X;
  20. averageY += p.Y;
  21. }
  22. averageX /= n;
  23. averageY /= n;
  24. double numerator = 0, denominator = 0;
  25. foreach (Point p in points)
  26. {
  27. numerator += (p.X - averageX) * (p.Y - averageY);
  28. denominator += (p.X - averageX) * (p.X - averageX);
  29. }
  30. if (numerator == 0) //平行于X轴为水平线,返回纵坐标平均值
  31. {
  32. b = averageY;
  33. type = 1;
  34. }
  35. else if (denominator == 0)//平行于Y轴为垂直线,返回横坐标平均值
  36. {
  37. b = averageX;
  38. type = 2;
  39. }
  40. else
  41. {
  42. type = 3;
  43. }
  44. k = numerator / denominator;
  45. b = averageY - k * averageX;
  46. foreach (Point p in points)
  47. {
  48. dis = GetPoint2LineDistance(p, k, b, type);
  49. if (dis > MAX_POINT_LINE_DIS) return false; //点到拟合直线距离过大
  50. }
  51. return true;
  52. }
  53. /// <summary>
  54. /// 计算点到直线的距离
  55. /// </summary>
  56. /// <param name="p">待计算点</param>
  57. /// <param name="k">直线斜率</param>
  58. /// <param name="b">直线截距</param>
  59. /// <param name="type">直线类型 1:水平线 2:垂直线 3:一般直线</param>
  60. /// <returns>距离</returns>
  61. private static double GetPoint2LineDistance(Point p, double k, double b, int type)
  62. {
  63. if (type == 1)
  64. {
  65. return Math.Abs(p.Y - b);
  66. }
  67. else if (type == 2)
  68. {
  69. return Math.Abs(p.X - b);
  70. }
  71. else
  72. {
  73. double numerator = 0, denominator = 0;
  74. numerator = Math.Abs(k * p.X - p.Y + b);
  75. denominator = Math.Sqrt(k * k + 1);
  76. return numerator / denominator;
  77. }
  78. }

WPF -- 一种直线识别方案的更多相关文章

  1. WPF -- 一种圆形识别方案

    本文介绍一种圆形的识别方案. 识别流程 判断是否为封闭图形: 根据圆的方程,取输入点集中的1/6.3/6.5/6处的三个点,求得圆的方程,获取圆心及半径: 取点集中的部分点,计算点到圆心的距离与半径的 ...

  2. OAuth2 RFC 6749 规范提供的四种基本认证方案

    OAuth2 RFC 6749 规范提供了四种基本认证方案,以下针对这四种认证方案以及它们在本实现中的使用方式进行分别说面. 第一种认证方式: Authorization Code Grant (授权 ...

  3. javascript四种类型识别的方法

    × 目录 [1]typeof [2]instanceof [3]constructor[4]toString 前面的话 javascript有复杂的类型系统,类型识别则是基本的功能.javascrip ...

  4. 正确修改MySQL最大连接数的三种好用方案

    以下的文章主要介绍的是正确修改MySQL最大连接数的三种好用方案,我们大家都知道MySQL数据库在安装完之后,默认的MySQL数据库,其最大连接数为100,一般流量稍微大一点的论坛或网站这个连接数是远 ...

  5. 最经常使用的两种C++序列化方案的使用心得(protobuf和boost serialization)

    导读 1. 什么是序列化? 2. 为什么要序列化?优点在哪里? 3. C++对象序列化的四种方法 4. 最经常使用的两种序列化方案使用心得 正文 1. 什么是序列化? 程序猿在编写应用程序的时候往往须 ...

  6. 最常用的两种C++序列化方案的使用心得(protobuf和boost serialization)

    导读 1. 什么是序列化? 2. 为什么要序列化?好处在哪里? 3. C++对象序列化的四种方法 4. 最常用的两种序列化方案使用心得 正文 1. 什么是序列化? 程序员在编写应用程序的时候往往需要将 ...

  7. Python几种并发实现方案的性能比较

    http://blog.csdn.net/permike/article/details/54846831 Python几种并发实现方案的性能比较 2017-02-03 14:33 1541人阅读 评 ...

  8. objc单例的两种安全实现方案

    所有转出博客园,请您注明出处:http://www.cnblogs.com/xiaobajiu/p/4122034.html objc的单例的两种安全实现方案 首先应该知道单例的实现有两大类,一个是懒 ...

  9. SSO的几种跨域方案

    在此只是记录一下自己在尝试SSO跨域实现的过程中学到的几种跨域方案,不包含任何例子和具体的实现方法. 最近在尝试SSO的跨域,看了好多资料,然后自己记录了一下可以实现的方法: ①跳转所有站点设置coo ...

随机推荐

  1. Hbase Java API包括协处理器统计行数

    package com.zy; import java.io.IOException; import org.apache.commons.lang.time.StopWatch; import or ...

  2. Codeforces Round #628 (Div. 2) C. Ehab and Path-etic MEXs(树,思维题)

    题意: 给有 n 个点的树的 n-1 条边从 0 到 n-2 编号,使得任意两点路径中未出现的最小数最小的方案. 思路: 先给所有度为 1 的点所在边编号,之后其他点可以随意编排. #include ...

  3. 在eclipse完成对Java_web项目里面资源文件的读取

    Java_web项目的资源文件一般有两种: 一种是存放数据之间有联系的文件,使用xml文件 另一种是存放数据之间没有联系的文件,使用properties文件 这里我们对properties文件读写做示 ...

  4. Codeforces Round #340 (Div. 2) E. XOR and Favorite Number

    time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standa ...

  5. Codeforces Round #646 (Div. 2) E. Tree Shuffling dfs

    题意: 给你n个节点,这n个节点构成了一颗以1为树根的树.每一个节点有一个初始值bi,从任意节点 i 的子树中选择任意k个节点,并按他的意愿随机排列这些节点中的数字,从而产生k⋅ai 的成本.对于一个 ...

  6. 国产网络测试仪MiniSMB - 如何配置VLAN数据流

    国产网络测试仪MiniSMB(www.minismb.com)是复刻smartbits的IP网络性能测试工具,是一款专门用于测试智能路由器,网络交换机的性能和稳定性的软硬件相结合的工具.可以通过此以太 ...

  7. 创建AVL树,插入,删除,输出Kth Min

    https://github.com/TouwaErioH/subjects/tree/master/C%2B%2B/PA2 没有考虑重复键,可以在结构体内加一个int times. 没有考虑删除不存 ...

  8. Leetcode(25)- k个一组翻转链表

    给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定这个链表: ...

  9. CodeForces - 803C Maximal GCD 【构造】

    You are given positive integer number n. You should create such strictly increasing sequence of k po ...

  10. 2019牛客多校第二场E MAZE(线段树 + 矩阵)题解

    题意: n * m的矩阵,为0表示可以走,1不可以走.规定每走一步只能向下.向左.向右走.现给定两种操作: 一.1 x y表示翻转坐标(x,y)的0.1. 二.2 x y表示从(1,x)走到(n,y) ...