zoukankan      html  css  js  c++  java
  • 个人项目作业

    一、信息

    项目内容
    这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) (北京航空航天大学 - 计算机学院)
    这个作业的要求在哪里 个人项目作业
    我的教学班级 周三上午三四
    这个项目的GitHub地址 https://github.com/lucieningit/intersection

    二、PSP

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

    三、设计思路

    首先应该对输入进行处理。对于直线,考虑到有各种的直线,采用一般式来表示直线,利用两个点可以表示出一般式。两个直线的交点同样可以用数学推导求出,用一般式中的系数表示。那么这个程序有两个主要过程。第一,转换输入,得到可用的数据,即图形的存储。第二,是求解交点,这些可以用初中的知识解决。

    • 输入信息处理

      • 直线:由两点(x1, y1)、(x2, y2),一般式ax+by+c=0

        • a: y1-y2

        • b: x2-x1

        • c: x1y2-x2y1。

    • 交点求解

      • 直线与直线:ax+by+c=0,px+qy+r=0

        • x: (br - cq)/(aq - bp)

        • y: (-ar + cp)/(aq - bp)

    四、设计实现

    • 数据结构

      • 图形

        需要三个参数和一个类型

        struct Graph
        {
        char type;
        int a;
        int b;
        int c;
        };
        • 直线:ax+by+c=0

      • 全部图形

        所设计算法为两两比较,因此存储所有图形,利用vector节省空间

        vector<Graph> graphs;

      • 全部交点

        交点不能重复,因此选择map和set的结构

        map<double, set<double>> points

         

    • 函数

      用到的函数关系如下图所示

    main主要用于输入转换和判断,交点函数用来求解交点

    五、性能分析

    如下图所示

    上图为1000直线交点测试,其中求交点的函数占大多资源,底层为set和tree的函数。

    六、代码说明

    主要有两个过程

    • 输入转换

      利用两点求出参数

      for (i = 0; i < gn; i++) {
      Graph graph{};
      cin >> graph.type;
        //将输入转化为可用数据
      if (graph.type == 'L') {
      cin >> x1;
      cin >> y1;
      cin >> x2;
      cin >> y2;
      graph.a = y1 - y2;
      graph.b = x2 - x1;
      graph.c = x1 * y2 - x2 * y1;
      }
      for (j = 0; j < graphs.size(); j++) {
                 //判断是否有交点
      if (graph.type == 'L' && graphs.at(j).type == 'L') {
      if (graph.a*graphs.at(j).b != graphs.at(j).a*graph.b) {
                         //调用交点函数
      line_line(graph, graphs.at(j));
      }
      }
      }
      graphs.push_back(graph);
      }
    • 求交点

      利用推导公式求交点,并在set中查重、存储

      void line_line(Graph &g, Graph &f) 
      {
      //根据公式求交点
         const double x = (g.b*f.c - g.c*f.b) / (g.a*f.b - g.b*f.a);
      const double y = (g.c*f.a - g.a*f.c) / (g.a*f.b - g.b*f.a);

         //查重、存储
      if (points.find(x) != points.end()) {
      set<double> ys = points.at(x);
      if (ys.find(y) == ys.end()) {
      pn++;
      ys.insert(y);
      }
      } else {
         pn++;
      set<double> ys;
      ys.insert(y);
      points.insert(Mypoints::value_type(x, ys));
      }
      }c

    七、其他

    • 错误与警告

    • unit

    •  

  • 相关阅读:
    Python基础语法 第2节课(数据类型转换、运算符、字符串)
    python基础语法 第5节课 ( if 、 for )
    python基础语法 第4节课 (字典 元组 集合)
    Python基础语法 第3节课 (列表)
    A. Peter and Snow Blower 解析(思維、幾何)
    C. Dima and Salad 解析(思維、DP)
    D. Serval and Rooted Tree (樹狀DP)
    C2. Balanced Removals (Harder) (幾何、思維)
    B. Two Fairs 解析(思維、DFS、組合)
    D. Bash and a Tough Math Puzzle 解析(線段樹、數論)
  • 原文地址:https://www.cnblogs.com/lucien98/p/12457743.html
Copyright © 2011-2022 走看看