个人项目博客作业

项目 内容
教学班级 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语言类推,选取vectorset容器等,并通过菜鸟网站博客园等网站结合进行针对地学习。

设计实现

设计与实现采用了“面向过程”(Procedure Oriented)的编程思想,分析解决问题所需要的步骤,然后分别设计函数进行代码实现。整体流程图如下所示:

graph LR A[开始]-->B[读入数据] B-->C[与已读直线求交点] C-->D[放入求出点集去重] D-->E[结束,返回交点个数]

具体实现上定义了两个数据结构LineDot,其中Line记录了直线形式Ax+By+C=0中的信息ABCDot记录了交点的横纵坐标。用vector容器记录Line,用set容器记录Dot,这里注意的是需要重载<操作符以实现自定义去重。

性能改进

根据VS 2019的性能分析工具生成的性能分析图中可以看出,绝大部分cpu功耗实在intersect()函数中,更具体来说是用在set这个容器里。set的底层实现是基于红黑二叉树的,其相比于这次作业的去重要求多了排序的功能,查询资料得知c++中有unordered_set容器一说,可以尝试替换实现。

代码说明

由于我的实现是面向过程的,且实现较为简单、无复杂细节,故列出整体代码框架与说明。

而求交点Intersect()函数思路大概是,已知两直线不重合,那么两直线的关系我分为两种:既不平行也不垂直;两直线垂直相交。然后就可以根据数学知识进行求解。代码展示如下:

这里的实现有处没有进行处理,就是交点的精度问题。我们知道double类型变量有可能将两个相差极小的数判为相等。
另外代码质量检测警告如下(采用微软建议规则):

posted @ 2020-03-10 16:41  Junhaoo  阅读(161)  评论(2编辑  收藏  举报