个人项目作业

个人项目作业

教学班级: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对象。

posted @ 2020-03-10 09:12  17373263  阅读(151)  评论(2编辑  收藏  举报