项目 内容
这个作业属于哪个课程 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. Docker(36)- docker run 的流程和原理

    背景 目前项目组上, Docker 用的非常重,所有微服务都是通过 docker 来部署的 所以不能仅仅会命令,还得会一些原理的东西,特此补一篇基础点的,后面再更加深入一些 docker 原理 本篇学 ...

  2. Asp.Net 5上传文件 (Core API方式)

    参考文档 首先在控制器中注入IWebHostEnvironment IWebHostEnvironment提供有关正在运行应用程序的Web托管环境的信息. 属于命名空间Microsoft.AspNet ...

  3. mybatis和hibernate区别

    一.本质区别和应用场景

  4. Excel导入保存附件和解析数据

    Excel导入保存附件和解析数据 一,前端上传附件的组件 1.先给一个下载模板的按钮 // 下载Excel模板 downLoadExcel: function () { window.open(GLO ...

  5. k8s nodes节点 notready问题

    1.在master查看node状态 [root@master1 ~]# kubectl get nodes NAME STATUS ROLES AGE VERSION master1 Ready co ...

  6. 洛谷P1019——单词接龙(DFS暴力搜索)

    https://www.luogu.org/problem/show?pid=1019#sub 题目描述 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们已知一组单词,且给定一个开头的字母, ...

  7. EditPlus配置C/C++运行环境

    1.安装MinGW和EditPlus 2.打开EditPlus ctrl+1 编译 ctrl+2 运行

  8. Java Web下MySQL数据库的增删改查(二)

    前文:https://www.cnblogs.com/Arisf/p/14095002.html 在之前图书管理系统上做了改进优化 图书管理系统v2 首先是项目结构: 1.数据库的连接: 1 pack ...

  9. 浅析Java中的static关键字

    关键点 <Java编程思想>对static方法的描述:"static方法就是没有this的方法.在static方法内部不能调用非静态方法,反过来是可以的.而且可以在没有创建对象的 ...

  10. centos修改ssh默认端口号的方法

    修改/etc/ssh/sshd_config配置文件(注意:这里是sshd_config,而不是ssh_config) vi /etc/ssh/sshd_config 在sshd_config文件中添 ...