项目 | 内容 |
---|---|
教学班级 | 006 |
项目地址 | https://github.com/Junhaoo/IntersectProject.git |
作业属于 | 2020春季计算机学院软件工程(罗杰 任健) |
作业要求 | 个人项目作业 |
个人课程目标 | 掌握软件工程基础知识 |
具体有助方面 | 个人代码能力的检测与提升 |
PSP表格
Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|
计划 | ||
·估计任务需要时间 | 10 | 20 |
开发 | ||
·需求分析(包括学习新技术) | 60 | 80 |
·生成设计文档 | 10 | 10 |
·设计复审(和同事审核设计文档) | 10 | 10 |
·代码规范(为目前的开发制定何时规范) | 10 | 20 |
·具体设计 | 20 | 30 |
·具体编码 | 30 | 40 |
·代码复审 | 30 | 60 |
·测试(自我测试,修改代码,提交修改) | 30 | 60 |
报告 | ||
·测试报告 | 20 | 20 |
·计算工作量 | 10 | 20 |
·事后总结,并提出过程改进计划 | 15 | 20 |
合计 | 255 | 390 |
解题思路
题目描述并不复杂,简单思考后选择采用暴力的方法,即求出所用交点并去重,继而去思考了两个问题:①数学方面应该采用什么解法;②代码实现应该使用什么容器等。
关于数学方面知识,没有向高等数学方面进行深入,把初高中的解法进行简单的对比,加上代码实现的难易度,后决定采用Ax+By+C=0
的标准形式,两直线(非重合)联立方程求出交点。我思考的代码逻辑较为简单,选择容器时对c++也没有深入的了解,从Java语言类推,选取vector与set容器等,并通过菜鸟网站与博客园等网站结合进行针对地学习。
设计实现
设计与实现采用了“面向过程”(Procedure Oriented)的编程思想,分析解决问题所需要的步骤,然后分别设计函数进行代码实现。整体流程图如下所示:
具体实现上定义了两个数据结构Line
和Dot
,其中Line
记录了直线形式Ax+By+C=0
中的信息ABC
,Dot
记录了交点的横纵坐标。用vector容器记录Line,用set容器记录Dot,这里注意的是需要重载<操作符以实现自定义去重。
性能改进
根据VS 2019的性能分析工具生成的性能分析图中可以看出,绝大部分cpu功耗实在intersect()函数中,更具体来说是用在set
代码说明
由于我的实现是面向过程的,且实现较为简单、无复杂细节,故列出整体代码框架与说明。
而求交点Intersect()函数思路大概是,已知两直线不重合,那么两直线的关系我分为两种:既不平行也不垂直;两直线垂直相交。然后就可以根据数学知识进行求解。代码展示如下:
这里的实现有处没有进行处理,就是交点的精度问题。我们知道double类型变量有可能将两个相差极小的数判为相等。
另外代码质量检测警告如下(采用微软建议规则):