项目 内容
这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健)
这个作业的要求在哪里 个人项目作业
我在这个课程的目标是 进一步提高自己的编码能力,工程能力
这个作业在哪个具体方面帮助我实现目标 学习c++,掌握测试方法,掌握软件工程开发规范和相关工具的使用
其他参考文献 博客1
教学班级 006
项目地址 https://github.com/Michael-Steven/BUAA-software-engineering-personal-project.git

一、写在前面

本次作业内容比较简单,比较适合软件工程入门,由于之前没有用c++写过程序,所以这次写起来不算是特别顺利,出过很多玄学bug,不过借助搜索引擎的帮助,我的问题都解决了。通过这次作业我也正好入门了c++的面向对象机制,为以后的作业打下基础。

下述 PSP 表格记录了我在程序的各个模块的开发上耗费的时间:

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划
· Estimate · 估计这个任务需要多少时间 20 20
Development 开发
· Analysis · 需求分析 (包括学习新技术) 60 60
· Design Spec · 生成设计文档 30 50
· Design Review · 设计复审 (和同事审核设计文档) 20 20
· Coding Standard · 代码规范 (为目前的开发制定合适的规范) 20 10
· Design · 具体设计 30 30
· Coding · 具体编码 240 300
· Code Review · 代码复审 30 20
· Test · 测试(自我测试,修改代码,提交修改) 180 240
Reporting 报告
· Test Report · 测试报告 50 30
· Size Measurement · 计算工作量 10 10
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 10 10
合计 700 800

二、解题思路

拿到这个题之后,首先明白这是一道求交点的题,根据数学知识即可得出求交点的公式:

  • 两直线的交点:直接联立两个直线的方程即可得解;
  • 直线与圆的交点:参考博客1,采用辅助线的方法进行求解,比直接联立方程组求解简单得多;
  • 两个圆的交点:将两个圆的标准方程相减得到两个圆交点所在直线的方程,然后根据直线与圆的交点算法进行求解。

三、实现过程

算法选择

采用O(n^2)的算法,每新增一条直线或者一个圆,就和之前输入的所有直线和圆进行交点计算,并存储到相应容器中,最后统计存储的交点数量。

类和方法的设计

本代码共有4个类:

  • Point:存储交点坐标;
  • Line:存储直线方程的参数;
    • get_line_line_intersect():求直线和直线交点
    • get_line_circle_intersect():求直线和圆的交点
  • Circle:存储圆方程的参数;
    • get_circle_line_intersect():求圆和直线的交点
    • get_circle_circle_intersect():求圆和圆的交点
  • Intersect:存储所有直线、圆和交点。
    • add_line():新增直线
    • add_circle():新增圆

容器的选择

采用STL中的Set存储,Set中的Insert方法可以在插入新元素的同时自动去除重复的元素,由于本次作业的交点是浮点数,所以在代码中重载了Set中的<运算符,在进行浮点数比较时忽略极小的数值差异,达到去重的目的。

单元测试

对于以下每种情况分别手动编写测试数据:

  • 多个直线相交于一个点;
  • 直线和圆相切;
  • 圆和圆内切/外切;
  • 多个圆相交于一个点;
  • 一条直线和多个圆相交于一点;
  • 多条直线和一个圆相交于一点;
  • 其他普通情况。

四、性能改进

本次作业我在算法上没有什么改进的地方,主要是一些细节的改善,比如减少重复的函数调用等等。

性能分析

Code Quality Analysis工具分析

五、关键代码

直线和直线的交点

这里是直接套公式计算交点坐标并存储在intersect中。

直线和圆的交点

直接翻译上面提到的算法就可以,这里要注意的是,答案可能是两个相同的点也可能是两个不同的点,由于Set有去重的功能,这里统一按两个不同点的情况来计算。

圆和圆的交点

在计算出交点连线的方程后直接调用直线和圆的交点方法即可。

BUAA2020软工作业(三)——个人项目的更多相关文章

  1. BUAA2020软工作业——提问回顾与个人总结

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾与个人总结 我在这个课程的目标是 进一步提高自己的编码能力,工程能力 这个作业在哪个具体方 ...

  2. BUAA2020软工作业(四)——结对项目

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 结对项目作业 我在这个课程的目标是 进一步提高自己的编码能力,工程能力,团队协作能力 这个作业在哪 ...

  3. BUAA2020软工作业(五)——软件案例分析

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 软件案例分析作业 我在这个课程的目标是 进一步提高自己的编码能力,工程能力 这个作业在哪个具体方面 ...

  4. BUAA2020软工作业(二)——对软件工程的初步理解

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业 我在这个课程的目标是 进一步提高自己的编码能力,工程能力 这个作业在哪个具体方面帮助 ...

  5. BUAA2020软工作业(一)——谈谈我和计算机的缘分

    项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 第一次作业-热身! 我在这个课程的目标是 进一步提高自己的编码能力,工程能力 这个作业在哪个具体方 ...

  6. BUAA2020软工团队beta得分总表

    BUAA2020软工团队beta得分总表 [TOC] 零.团队博客目录及beta阶段各部分博客地址 团队博客 计划与设计博客 测试报告博客 发布声明博客 事后分析博客 敏 杰 开 发♂ https:/ ...

  7. [软工作业]-软件案例分析-CSDN

    [软工作业]-软件案例分析-CSDN(app) 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 个人博客作业-软件案例分析 我在这个课程的目标是 ...

  8. 软工作业-----Alpha版本第一周小结

            软工作业-----Alpha版本第一周小结   Part1.第一周周计划记录 姓名 学号 周前计划安排 每周工作记录 自我打分 yrz(队长) 1417 1.进行任务分析 2.任务分配 ...

  9. 【软工作业&思考】关于软工的一些概念性理解暨第一次阅读作业

    概述 项目 内容 本次作业所属课程 2019BUAA软件工程 周二班 本次作业要求 第1次个人作业当然,比这个更重要百倍的还是实实在在的思考,这也是标题如此命名的原因 我在本课程的目标 在原有实践经验 ...

随机推荐

  1. session案例之验证码

    一.需求分析 其中,一张图片就是一个单独的请求: 一个验证验证码的Servlet,还有一个验证用户名和密码的Servlet,两次都可能有错误信息返回到前端页面,所以前面页面要从request域中获取返 ...

  2. aes加解密前后端-前端

    一.ajax请求前端 f12请求和响应参数效果: 1.在前端封装ajax的公共Util的js中,封装ajax请求的地方,在beforeSend方法和成功之后的回调函数success方法中: var p ...

  3. 下载excel(接收文件流)

    /**  * 文件流转换 主要代码块,可自定义下载文件名称  * @param {} data  */ export function download(data, titName) {   if ( ...

  4. .NET 6 RC1 正式发布

    昨天晚上微软发布了.NET 6的两个RC版本中的第一个版本,该版本将于11月正式发布,作为在开源MIT协议下整合所有不同的.NET开发模组件的开源跨平台实现.这是一个从2014年开始,持续多年的,以改 ...

  5. 如何解决浮动元素高度塌陷---CSS

    解决高度塌陷问题的方法: 方法一. //给父元素添加声明 overflow:hidden; 缺点:回隐藏溢出的元素: 方法二. 在浮动的元素下添加空div标签,并给该元素添加声明: clear:bot ...

  6. 一文带你了解.Net读写锁

    本文主要讲解.Net基于ReaderWriterLockSlim讲解读写锁 基础概念 读写锁是一个具有特殊用途的线程锁,适用于频繁读取且读取需要一定时间的场景,共享资源的读取操作通常是可以同时执行的, ...

  7. 开源的物联网技术平台(Thingsboard)

    1   总体说明 1.1   产品概述 1.1.1 Thingsboard作用 1.置备并控制设备. 2.采集设备数据并进行数据可视化. 3.分析设备数据,触发告警. 4.将数据传输到另一个系统. 5 ...

  8. 【PHP数据结构】队列的相关逻辑操作

    在逻辑结构中,我们已经学习了一个非常经典的结构类型:栈.今天,我们就来学习另外一个也是非常经典的逻辑结构类型:队列.相信不少同学已经使用过 redis . rabbitmq 之类的缓存队列工具.其实, ...

  9. 一起搞懂PHP的错误和异常(一)

    在PHP的学习过程中,我们会接触到两个概念,一个是错误,一个是异常.啥玩意?他们不是一个东西嘛?如果接触过Java.C#之类的纯面向对象语言的同学,可能对异常是没有什么问题,毕竟所有的问题都可以try ...

  10. 【tp3.2】根据不同域名来加载不同的配置文件

    遇到问题: 最近遇到一个需求,需要多个公众号使用同一个项目,这就导致了不同公众号访问的数据库和公众号配置不同. 解决思路: 查看文档:http://document.thinkphp.cn/manua ...