• BUAA2020软工作业(三)——个人项目


    项目 内容
    这个作业属于哪个课程 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有去重的功能,这里统一按两个不同点的情况来计算。

    圆和圆的交点

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

  • 相关阅读:
    poj1019——log10求位数
    poj2084——卡特兰数
    hdoj1023——卡特兰数
    poj1496——组合数学
    poj1850——组合数学
    bestcoder#29 1002 矩阵连乘快速幂解fib数列
    bestcoder#28 1002 dfs
    poj1458——dp,lcs
    hduoj1106
    codeforces#296div2_b 字符串,图
  • 原文地址:https://www.cnblogs.com/shanyanbo/p/12457335.html
Copyright © 2020-2023  润新知