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

    •  

  • 相关阅读:
    ibatis.net:惯用法
    ibatis.net:在VS中支持xml智能提示
    设计原则:色彩
    编码原则:“防御式编程”再次让我快乐
    错误:update 忘了加 where
    .NET:不要使用扩展方法扩展Object对象。
    错误:不小心的VS重命名
    技术人生:如何更有效率的切换上下文?
    Logstash filter 插件之 grok
    轻松测试 logstash 的配置文件
  • 原文地址:https://www.cnblogs.com/lucien98/p/12457743.html
Copyright © 2011-2022 走看看