个人项目作用
胖胖的毛毛虫 人气:0
# 软工个人项目
|**项目**|**内容**|
|:-|:-:|
|所属课设:北航2020年春软件工程|[班级博客](https://edu.cnblogs.com/campus/buaa/BUAA_SE_2020_LJ/)|
|作业要求:实现一个能求解简单几何形状之间交点的控制台程序。|[作业要求](https://edu.cnblogs.com/campus/buaa/BUAA_SE_2020_LJ/homework/10429)|
|个人课程目标|学习一个具备一定规模的软件在生命周期中需要哪些工作,锻炼自己的团队协作能力,并使自己具有开发一个“好软件”的能力|
|教学班级|006|
|这个作业在哪个具体方面帮助我实现目标|提升个人的软件工程能力|
|项目地址|https://github.com/NSun-S/SoftwareEngineering_PersonalWork|
## PSP估算
> 在开始实现程序之前,在下述 PSP 表格记录下你估计将在程序的各个模块的开发上耗费的时间。(0.5')
> 在你实现完程序之后,在下述 PSP 表格记录下你在程序的各个模块上实际花费的时间。(0.5')
|PSP2.1|Personal Software Process Stages|预估耗时(分钟)|实际耗时(分钟)|
|:-:|:-:|:-:|:-:|
|Planning|计划|20|10|
|Estimate| 估计这个任务需要多少时间|20|10|
|Development|开发|630|510|
|Analysis| 需求分析 (包括学习新技术)|60|30|
|Design Spec| 生成设计文档|40|30|
|Design Review| 设计复审 (和同事审核设计文档)|0|0|
|Coding Standard| 代码规范 (为目前的开发制定合适的规范)|20|20|
|Design| 具体设计|60|80|
|Coding| 具体编码|120|150|
|Code Review| 代码复审|30|20|
|Test| 测试(自我测试,修改代码,提交修改)|60|80|
|Reporting|报告|60|50|
|Test Report| 测试报告|20|20|
|Size Measurement| 计算工作量|10|10|
|Postmortem & Process Improvement Plan| 事后总结, 并提出过程改进计划|30|20|
||合计|650|520|
在任务完成后回顾这个表格,我发现我做得还算不错,总体时间小于预估,但是debug的时间较长,这也是测试花费大量时间的原因。
## 思路及设计
在拿到题目之后,我很快定位出这是一道代数几何题,我们需要用自己学过的平面图形的相关知识来求解问题,这个问题分为3部分:直线和直线的交点,圆和圆的交点以及圆和直线的交点。
因此,我先是在纸上进行了演算,直线和直线的交点很好推理,圆和圆的可以转换圆和直线的交点,那么我们求解的关键就是圆和直线的交点,因此我查阅了求解这个问题的[相关资料](https://blog.csdn.net/sinat_25911307/articlehttps://img.qb5200.com/download-x/details/86598780),找到了解决办法。
## 设计实现过程
这部分完成的比较轻松,因为有面向对象的基本知识,所以在这到题中,我自然的设计了两个类,圆和直线。
![](https://img2020.cnblogs.com/blog/1615693/202003/1615693-20200310185102900-1896158698.png)
上图是直线类的定义,我们可以看出,其中包含了确定直线的两个点的坐标,以及一个用来求解直线和直线交点的函数。
![](https://img2020.cnblogs.com/blog/1615693/202003/1615693-20200310185212300-198783421.png)
上图是圆类的定义,其中包含圆的中心点和半径,此外,还有计算垂足,计算直线到圆的距离以及求解圆和直线交点以及圆和圆交点的函数,单元测试中我主要测试了各种类型的直线之间交点的例子。
## 改进程序性能
这个过程经历了两个阶段:
1. 使用set存放pair作为数据结构,利用set的不重复性来求解。
2. 使用vector存放pair作为数据结构,最后对vector进行去重。
![](https://img2020.cnblogs.com/blog/1615693/202003/1615693-20200310185228820-1738160281.png)
![](https://img2020.cnblogs.com/blog/1615693/202003/1615693-20200310185553539-1582891056.png)
上面两张图是我们阶段1分别用随机生成的1000条直线(约50w交点)和3000条直线(约450w交点)测试cpu的截图,从中我们可以看出,随着交点个数以近$n^2$的比例增长,时间也大幅度的增长。
![](https://img2020.cnblogs.com/blog/1615693/202003/1615693-20200310185300933-1793797318.png)
上图是3000条指令是对应的时间消耗占比,我们可看出,对set的操作花费了大量的时间。以下是其中消耗时间最长的函数:
```
bool line::intersect(line line2, set
加载全部内容