work2_求交点数
教学班级:周三上午三四节
项目地址:https://github.com/875571216/-
PSP表格
psp2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 30 |
Estimate | 估计这个任务需要多少时间 | 10 | 10 |
Development | 开发 | ||
Analysis | 需求分析 (包括学习新技术) | 180 | 240 |
Design Spec | 生成设计文档 | 30 | 10 |
Design Review | 设计复审 | 10 | 10 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 10 |
Design | 具体设计 | 50 | 50 |
Coding | 具体编码 | 180 | 120 |
Code Review | 代码复审 | 10 | 10 |
Test | 测试(自我测试,修改代码,提交修改) | 180 | 220 |
Reporting | 报告 | 10 | 10 |
test Reporting | 测试报告 | 30 | 20 |
Size Measurement | 计算工作量 | 10 | 10 |
Postmortem & Process Improvement Plan | 事后总结, 并提出过程改进计划 | 10 | 10 |
解题思路描述
1)首先把输入文件中的直线,圆的信息都构造成相应的对象,存入到各自的容器中。(直线、圆和点各设置一个动态数组容器vector来存储)
2)交点分为:直线与直线相交;直线与圆相交;圆与圆相交,在各自的类中设置求交点的成员方法。具体求法为:
<1> 直线l1与直线l2:联立解方程
<2> 直线l与圆c:求出一条经过圆c的圆心且与直线l垂直的直线_l,l与_l的交点是c的圆心作l的垂线的垂足,通过这个垂足可以求出两个交点。
<3> 圆c1与圆c2:两圆的方程相减到它们焦点所在的直线,然后求直线与圆的交点。
3)交点加入加点集合(查重的方法是暴力遍历,如果这个点在数组中已经存在,就不加入集合,没找到更好的方法)
设计实现过程。
1)代码如何组织:
<1> 头文件:定义了line(直线)、dot(点)、cycle(圆)三个数据类型。
<2> 主体cpp文件:引用了头文件的三个数据类型。定义了line(直线)类中的“两直线求交点”的方法。定义了cycle(圆)类中“两圆求交点”的方法以及“圆与直线求交点”的方法。最后还有从文件读入圆与直线信息并构造相应数据类型的的main函数。
<3> 单元测试:设置了10组单元测试,引用了头文件中的三个数据类型,这三个数据类型的具体成员方法在主体cpp文件中定义好了。
2)单元测试:
<1> 直线与直线相交;
<2> 直线与直线平行;
<3> 圆与圆相离;
<4> 圆与圆外切;
<5> 圆与圆相交;
<6> 圆与圆内切;
<7> 圆包含圆;
<8> 直线与圆相离;
<9> 直线与圆相切;
<10> 直线与圆相交;
性能分析
可以看到,我的程序中,占用cpu最多的是solve,这个函数是我用来封装计算所有交点的函数,占用率高很正常。然后就是lintersectl这个函数,这个是用来计算直线交点的,由于我的测试样例只计算了直线与直线相交,这也比正常。有问题的是dotinsert这个函数,这个函数是用来插入点的,为什么会占用这么多的cpu呢,因为我的设计,是通过比较点的坐标来判断该点是否已经加入了交点集。我存储交点的数据结构是一个数组,这就导致没插入一个点就必须遍历一边数组,占用大量的cpu资源。看图:
我的改进办法是用hash表来存储交点,这样每次插入点的复杂度就有o(n)变成了o(1),节省了大量的时间开销。
关键代码:
<1> 两直线求交点方法:简单解方程。
<2> 直线l与圆c求交点的方法:求出一条经过圆c的圆心且与直线l垂直的直线_l,l与_l的交点是c的圆心作l的垂线的垂足。然后通过点到直线距离公式求圆c的圆心到直线l的垂直距离d。用勾股定理就能算出垂足点到两交点的距离,再结合直线l斜率,就可以求出两交点坐标。当然,如果圆心到直线的垂直距离d大于圆半径,那就没有交点,相等则只有一个交点——垂足点。
<3> 两圆相交:首先求出两圆心之间的距离d,如果d>r1+r2(两圆半径之和)或者d+r1(较小圆的半径)<r2,那么两个圆没有交点。然后从两个圆方程中解出通过他们交点的直线,再求直线与圆的交点
可以看出,确实大部分时间都消耗在了遍历数组上。于是,我决定用hash表来存储交点集,这样,在查找点集时的复杂度就有o(n)变为o(1),节省了大量的时间开销。
work2_求交点数的更多相关文章
- 洛谷P2789 直线交点数 [数论,递归]
题目传送门 题目描述 平面上有N条直线,且无三线共点,那么这些直线能有多少不同的交点数? 输入格式 一个正整数N 输出格式 一个整数表示方案总数 输入输出样例 输入 #1 4 输出 #1 5 说明/提 ...
- ray与triangle/quad求交二三事
引擎中,ray与quad求交,算法未细看,但有求解二次方程,不解.ray与triangle求交,使用的是97年经典算法,仔细看过论文,多谢小武同学指点,用到了克拉默法则求解线性方程组.想模仿该方法,做 ...
- HDU-1466 计算直线的交点数 经典dp
1.HDU-1466 计算直线的交点数 2.链接:http://acm.hdu.edu.cn/showproblem.php?pid=1466 3.总结:不会推这个,看了题解.. 状态转移: m条 ...
- [NetTopologySuite](2)任意多边形求交
任意多边形求交: private void btnPolygon_Click(object sender, EventArgs e) { , , , , , , , , , , , , , }; , ...
- hdu----(1466)计算直线的交点数(dp)
计算直线的交点数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Su ...
- HDOJ 1466 计算直线的交点数
将n 条直线排成一个序列,直线2和直线1最多只有一个交点,直线3和直线1,2最多有两个交点,......,直线n 和其他n-1条直线最多有n-1个交点.由此得出n条直线互不平行且无三线共点的最多交点数 ...
- 计算直线的交点数(hdu1466简单的dp)
题意:平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数.比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行). 思路:动态规划,想办法记忆化搜索,当前状态和之前状态结合起来 d ...
- 计算直线的交点数(set + 打表)
计算直线的交点数 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total S ...
- hdu1466 计算直线的交点数
题意: 平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数. 比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行). 分析: DP 设状态:f[i][j]表示i条直线能否产生j个 ...
随机推荐
- 优化 ASP.NET Core Docker 镜像的大小
在这容器化的世界里,我们已经很少直接通过文件发布来运行asp.net core程序了.现在大多数情况下,我们都会使用docker来运行程序.在使用docker之前,我们往往需要打包我们的应用程序.as ...
- 「HTML+CSS」--自定义按钮样式【004】
前言 Hello!小伙伴! 首先非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 哈哈 自我介绍一下 昵称:海轰 标签:程序猿一只|C++选手|学生 简介:因C语言结识编程,随后转入计算机 ...
- [树状数组]数星星 Stars
数 星 星 S t a r s 数星星 Stars 数星星Stars 题目描述 天空中有一些星星,这些星星都在不同的位置,每个星星有个坐标.如果一个星星的左下方(包含正左和正下)有 k k k 颗星星 ...
- DBeaver、Navicat、MySQL高频报错及解决方法,此文持续更新
目录 第一坑,没有用管理员身份 第二坑,MySQL 服务无法启动 第三坑,报错:ERROR 1045 (28000): Access denied for user 'root'@'localhost ...
- [Fundamental of Power Electronics]-PART II-8. 变换器传递函数-8.2 变换器传递函数分析
8.2 变换器传递函数分析 接下来,让我们推导基本变换器传递函数中的极点,零点和渐近线增益的解析表达式. 8.2.1 示例:Buck-boost变换器的传递函数 Buck-boost变换器的小信号等效 ...
- 如何快速搭建自己的ERP系统,4步源码快速安装odoo教程
上一篇内容:了解什么是Odoo,为二次开发做准备 1.下载odoo源码 Github地址:https://github.com/odoo/odoo Gitee地址:https://gitee.com/ ...
- 如何获取canvas当前的缩放值
项目中一直有一个问题困扰着我,我们的画布可以缩放平移旋转,支持拖拽生成图形,生成手写笔迹,如果用户选择的线条粗细为5像素,那么即使画布缩放过绘制出的线条粗细也应该是视觉上的5px,所以再绘制时赋值给c ...
- Java【线程池、Lambda表达式】
见pdf 等待唤醒机制 wait和notify 第二章 线程池 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低 系统的效率,因为频繁创建线程和销毁 ...
- Qt中检查槽函数connect是否正确
环境:VS2017+Qt插件 一般情况下VS+QT环境下运行的QT程序输出信息需要在调试模式的输出栏可以看到,由于太多信息所以导致查看不方便(当然也可以在筛选选项中筛选信息). 有更方便查看输出信息的 ...
- JAVAEE_Servlet_18_关于Servlet线程安全问题
关于Servlet线程安全问题 Servlet线程安全 Servlet 是单实例多线程的环境下运行的. 在服务器运行期间,一个Servlet接口实现类,只能创建一个实例对象(一个进程(Servlet接 ...