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个 ...
随机推荐
- python-3-1
一.布尔类型 布尔值为: True 和Flase 注:区分大小写,如果写true 和false 不代表布尔类型值 小于 大于 小于等于 大于等于 对应这些判断 一般就是用布尔类型进行判断 ...
- 【MCU】国民N32固件库移植
目录 前言 移植N32Gxxx系列要点 前言 链接: 李柱明博客 移植AT32库&FreeRTOS教程 由于大部分国产MCU移植固件库.RTOS源码都是差不多的,所以本文不讲细节,如想熟悉移植 ...
- Java中的集合List - 入门篇
前言 大家好啊,我是汤圆,今天给大家带来的是<Java中的集合List - 入门篇>,希望对大家有帮助,谢谢 简介 说实话,Java中的集合有很多种,但是这里作为入门级别,先简单介绍第一种 ...
- Oment++ 初学者教程 第4节-将其转变为真实网络
4.1两个以上的节点 现在,我们将迈出一大步:创建几个tic模块并将它们连接到网络中.现在,我们将使它们的工作变得简单:一个节点生成一条消息,其他节点继续沿随机方向扔消息,直到它到达预定的目标节点为止 ...
- 全网最详细的Linux命令系列-mkdir命令
Linux mkdir 命令用来创建指定的名称的目录,要求创建目录的用户在当前目录中具有写权限,并且指定的目录名不能是当前目录中已有的目录. 命令格式: mkdir [选项] 目录... 命令功能: ...
- PictureCleaner 官方版 v1.1.3.04061,免费的图片校正及漂白专业工具,专业去除文档图片黑底麻点杂色,规格化A4、B5尺寸输出,还你一个清晰的文本。
当家长多年,每天都要拍照试卷打印.用App去掉图片黑底就成了每天必备工作.可是,有些图片文件不是来自手机,所以需要一个电脑版的图片漂白工具.经过一个多月努力,PictureCleaner官方版诞生了 ...
- [Fundamental of Power Electronics]-PART II-7. 交流等效电路建模-7.4 规范电路模型
7.4 规范电路模型 在讨论了推导开关变换器交流等效电路模型的几种方法后,让我们先停下来,说明下这些结果.所有的在 CCM下以PWM工作的DC-DC变换器都具有相似的基本功能.首先,他们在理想情况下, ...
- Java(171-194)【接口、多态】
1.接口概述与生活举例 接口就是一种公共的规范标准 只要符合规范标准,就可以大家通用 2.接口的定义基本格式 public interface 接口名称 { // 抽象方法 / ...
- 「Spring Boot 2.4 新特性」一键构建Docker镜像
背景 在我们开发过程中为了支持 Docker 容器化,一般使用 Maven 编译打包然后生成镜像,能够大大提供上线效率,同时能够快速动态扩容,快速回滚,着实很方便.docker-maven-plugi ...
- OO Unit3 总结
OO Unit3 总结 OO课Unit3人际关系网JML应用技术回顾 BUAA.1823.邓新宇 2020/5/23 梳理JML语言的理论基础.应用工具链情况 方法规格 JML中,同一个方法在不同的条 ...