个人项目作业
教学班级:006
项目地址:https://github.com/mjjm3/Intersect.git
PSP 表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 440 | 500 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 30 | 30 |
· Design Spec | · 生成设计文档 | 30 | 60 |
· Design Review | · 设计复审 (和同事审核设计文档) | 30 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 20 |
· Design | · 具体设计 | 30 | 30 |
· Coding | · 具体编码 | 180 | 200 |
· Code Review | · 代码复审 | 20 | 30 |
· Test | · 测试(自我测试,修改代码,提交修改) | 40 | 40 |
Reporting | 报告 | ||
· Test Report | · 测试报告 | 20 | 20 |
· Size Measurement | · 计算工作量 | 10 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 30 | 30 |
合计 | 440 | 500 |
解题思路
题目的基本要求是给定N条直线,输出这些直线之间的交点的个数。首先的想法就是把这些直线两两组合,计算交点,计算交点的方法是把直线表示为ax+by+c = 0的形式,联立方程求解,如果有交点就把这个交点放入集合里面,最后输出集合的大小。这种做法的复杂度为O(N^2), 目前没有想到更好的做法。
附加要求是添加了圆形,输出所有交点的个数,想法依然是两两组合求交点,只需要添加计算圆与圆、圆与直线的交点的函数。圆表示为(x + c)^2 + (y + d)^2 = r^2。
设计实现过程
设计
我一共设计了Point,Line,Circle三个类,Line的构造函数传入两个Point对象,Circle的构造函数传入一个Point对象和double类型的半径r。Line内部有计算Line和Line之间,Line和Circle之间交点的static函数,Circle内部有计算Circle和Circle之间交点的static函数,返回值均为Point对象。
单元测试
单元测试主要测试三个static函数。测试用例考虑了两条平行直线,平行于y轴的直线,直线与圆相切,圆与圆相切等情况。
程序性能改进
程序中消耗最大的函数为计算两条直线的交点的函数。目前没有想到比较好的改进方法。
代码说明
程序的整体结构。
程序中用来统计交点个数的数据结构,unordered_set。
重载操作符,用于unordered_set判断两个point是否相同。
Point的hash函数,也是用于unordered_set。
用于计算两直线交点的函数,直线被表示为ax+by+c=0 的形式,返回值为Point对象。