记录二维直线的斜率和截距
catalog
- Base
- 模板
- 模板2
Base
当:斜率k可能是小数 或 截距b可能是小数时其实,我们仍可以用double来存直线!!但是需要设置一个eps精度!! 只要小于误差,就当做是:double值相同
' 注意, 垂直线的斜率 不存在!! 所以,对垂直线(甚至平行线k==0)的 都特殊处理 ' vector< pair<double, double> > A;A.PB( {k, b} ); ' 放入:斜率 和 截距 'sort(A.begin(), A.end());for(i, 0, n-1, 1){if(i == 0) ++ ans;else{if( DB_EQUAL(A[i].FIR, A[i-1].FIR) &&DB_EQUAL(A[i].SEC, A[i-1].SEC)continue;++ ans;} // DE_EQUAL(a,b){ return fabs(a-b) <= EPS; }' 1, 两个double的差,比eps还小。 说明,他俩可以看做是相同的 '' 2, 一定一定要注意(是&&的关系),不是(||)!!! '
' {1, 1} {1, 10}: 斜率相同,截距不同; 两个平行的直线 '
' 这不是一条直线 !!! 所以,是&&的关系!! '
模板
有一个长度为w、高度为h 的矩阵,他的左下角 坐落在坐标系的[0,0]位置即,有(w+1)*(h+1)个二维坐标点,坐落在这个矩阵上你可以任意连接 其中的两个点,问一共有多少个不同的直线(所谓不同: 斜率 和 截距,均不同)
比如w = 1, h = 2
[a] [b] ' 斜率=0: [ef], [cd], [ab] 3条 '
[c] [d] ' 斜率不存在:[ae], [bf] 2条 '
[e] [f] ' 斜率>0: [ed], [eb], [cb] 3条 '' 斜率<0: [cf], [ad], [af] 3条 'ans = 111, double记录斜率和截距 (注意,斜率和截距 都可能是小数)
VE< pair<double, double> > A;
FOR(x1, 1, w + 1, 1){ FOR(y1, 1, h + 1, 1){FOR(x2, 1, w + 1, 1){FOR(y2, 1, h + 1, 1){if( (x1 == x2) || (y1 == y2) ) ' 特殊处理,水平和垂直线 'continue;double k = (double)(y2 - y1) / (double)(x2 - x1);double b = (double)y1 - k * x1;A.PB( {k, b} );}}}
}
sort(VE_ALL(A)); ' sort是为了, 方便找 两两相同的 '
int ans = w + 1 + h + 1;
int n = A.size();
FOR(i, 0, n-1, 1){if(i == 0) ++ ans;else{if( DB_EQUAL(A[i].FIR, A[i-1].FIR) &&DB_EQUAL(A[i].SEC, A[i-1].SEC){continue;}++ ans;}
}
注意, 上面的4个for,千万不要写成: x2 >= x1 && y2 >= y1这是错的!!!
[2] [1] ' 你是想: 遍历了[1],没必要遍历[3] '[A] ' 这样想确实是正确的。 '
[3] [4] ' 但(x2>=x1 && y2>=y1): 他只是遍历的 [1]这个区域!! 即正斜率'' 还有: 负斜率!!! 即可以(x2>=x1) 让y遍历所有 '但没有必要!!! 这种优化完全没有必要!!! 不会有质的变化!! 2, 还有一种“暴力”的做法枚举(x1,y1) 和 (x2,y2): if(vis[(x1,y1)][(x2,y)]) continue;ans ++;_gcd = gcd( abs(x2-x1), abs(y2-y1) ); ' 这里 和 下一行, 是核心!!! 'X = (x2-x1) / _gcd, Y = (y2-y1) / _gcd; ' 注意,这里没有abs!!'pair.PB( 获取所有的{x1 + k*X, y1 + k*Y} ); ' k可正负,而且无边界,你需要自己去break '' 即,pair里存的是: 位于(x1,y1)-(x2,y2)这条直线上的 所有的点。 '对pair进行二层循环, 将任意的两个点,都置为true
模板2
有很多的点,选择了2个点A和B找出所有的CDEF....点,处在A-B这条直线上方法1: 记录AB直线(但注意的是,AB直线垂直的情况 要特判!!!)I: A.x == B.x 特判II: 斜率k = (B.y - A.y) / (B.x - A.x)截距b = A.y - k * A.x然后,遍历所有的点T[xx, yy]根据当前T点的xx横坐标,放到{k, b}这个直线中可以得到一个should_y = xx * k + b然后,判断if(yy == should_y) 则说明 T点是合法的
记录二维直线的斜率和截距相关推荐
- 虎书学习笔记4:图形学基础数学(隐式二维直线、隐式二次曲线、二维参数曲线、二维参数直线、二维参数圆)
关于图形学的基础数学知识 基础数学 隐式二维直线 我们最熟悉的直线:斜截式 他的隐式方程为: 我们再函数y-mx-b=0两边同乘一个系数,将得到一摸一样的直线. 因为两个点觉得一条直线,所以必然满足: ...
- OpenCV:Vec4f二维直线类型
1. Vec4的参数本质 二维直线类型为cv::Vec4f,三维直线类型是cv::Vec6f, 输出参数的前半部分给出的是直线的方向,而后半部分给出的是直线上的一点(即通常所说的点斜式直线). Vec ...
- opencv判断 线夹角_opencv计算直线的斜率、截距,与水平线弧度值、角度值
opencv计算直线的斜率.截距,与水平线弧度值.角度值 发布时间:2018-07-10 12:56, 浏览次数:1324 , 标签: opencv 1.输入一堆直线,返回每条直线的斜率和截距 斜率和 ...
- 二维直线拟合--opencv实现
二维/三维直线拟合–opencv实现 Hough变换可以提取图像中的直线,但是提取线的精度不高,然而我们的很多场合下需要精确估计直线的参数,这时就需要进行直线拟合. 直线拟合的方法有很多,比如 ...
- 给定直线参数在二维散点数据上绘制直线(Python)
声明: 仅个人小记 前言:遇到在二维散点图上绘制指定的直线,直线不是通过直接给出两个断点而是只给了直线的必要参数,进而需要基于散点数据计算出直线的两个端点,然后绘制出直线.方便以后使用,计算端点过程记 ...
- Java黑皮书课后题第8章:*8.31(几何:交点)编写一个方法,返回两条直线的交点。四个点存放在4*2的二维数组points中。编写一个程序,提示用户输入4个点,并显示交点
*8.31(几何:交点)编写一个方法,返回两条直线的交点.四个点存放在4*2的二维数组points中.编写一个程序,提示用户输入4个点,并显示交点 题目 题目描述 破题 代码 本题运行实例 题目 题目 ...
- Java实现二维数组和稀疏数组的转换
文章目录 稀疏数组 二维数组-->稀疏数组 稀疏数组-->二维数组 完整code 稀疏数组 简介:当编写的二维数组中存在很多不用的点但初始化时都赋值为0时,这个二维数组的观赏性很低并且非常 ...
- 减小程序规模!稀疏数组Sparsearray,数据结构二维数组与稀疏数组转换,Java实现
文章目录 基本介绍 应用实例 基本介绍 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组. 稀疏数组的处理方法是: ①记录数组一共有几行几列,有多少个不同的值(0除外) ...
- iOS原生实现二维码拉近放大
http://www.cocoachina.com/ios/20180416/23033.html 2018-04-16 15:34 编辑: yyuuzhu 分类:iOS开发 来源:程序鹅 8 300 ...
最新文章
- Java8新特性-接口中的静态方法与默认方法
- 基于 Ubuntu 搭建微信小程序服务
- Java初学者推荐学习书籍free下载
- 使用Docker Compose 搭建lnmp
- eclipse下创建Maven项目
- Win Linux 双系统安装指南
- c52单片机c语言编程,c52单片机c语言编程怎样实现阴历查询
- eureka 集群失败的原因_对于注册中心,ZooKeeper、Eureka哪个更合适?
- dfs序七个经典问题(转)
- 例2.1 排序 - 九度教程第1题(排序)
- python time函数的功能_Python中Python时间模块的常用功能,Pythontime,函数
- ArcView GIS 应用与开发技术(9)- 创建空间数据
- 不加群提取群成员_快速提取PPT上的文字!
- SolidWorks导入3DSource零件库的模型方法介绍
- 多开助手完美版,APP一键多开,支持安卓10
- 《东周列国志》第五十二回 公子宋尝鼋构逆 陈灵公衵服戏朝
- mysql数据库加密存储过程_数据库系统(六)---MySQL语句及存储过程
- gitee 链接报错
- 在线上也能进行商标注册
- 聚类kmeans案例