交点计数 -- 软工个人项目作业

项目 内容
这个作业属于哪个课程 2020春北航计算机学院软件工程(罗杰 任健)
这个作业的要求在哪里 个人项目作业

项目地址

PSP 2.1

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

解题思路

基本问题

直线公式

我们将问题简化到求两条直线的交点。

由解析几何的知识我们知道,通过两条直线的公式可以求出他们的交点。为了简化问题,我使用直线的一般式来表示直线: Ax+By+C = 0.

A,B,C 可以由题目中给定的两点坐标计算得出(设两点为 (x_1,y_1),(x_2,y_2) ):

  • A=y_2−y_1
  • B=x_1−x_2
  • C=x_2y_1−x_1 y_2
交点的计算方法

通过联立上述直线公式,我们可以得到两条直线的交点。

交点x = {B_1C_2-B_2C_1} / {A_1 * B_2-B_1 * A_2}

交点y = {A_2 * C_1-C_2 * A_1} / {A_1 * B_2-B_1 * A_2}

存储方法

我们选用Vector存储过程中产生的交点。在所有交点计算完毕后,我们对数组内元素排序,并去重。

复杂度

由于在获得直线交点时,需要枚举两条直线的所以可能。所以时间复杂度为O(n^2)

设计和实现过程

本设计中包含两个类和一个结构体。

交点

stuct Position {
    double x;
    double y;
};

由于我们在后续需要对交点进行排序和去重处理,所以我构造和posCompare,posEqual两个函数来比较两个交点的大小和是否相等。

直线:

在直线类中我们存储直线一般式的三个参数$A,B,C$。

直线可以相交,我们为直线构造相交方法,返回交点结构体。

Class Line {
    long long a, b, c;
    Line(long long x1, long long y1, long long x2, long long y2);
    struct Position intersect(Line&);
}

的类中,我们存储能够定位一个圆的三个参数:$x,y,r$,即圆心和半径。

同时圆的类中,包含圆与直线相交、圆与圆相交的方法。

class Circle 
{
public:
    Circle(long long x, long long y, long long r);
    long long x, y, r;
    void lineIntersect(const Line&, vector<struct Position>&);
    void circleIntersect(const Circle&, vector<struct Position>&);
};

性能分析

在本节中我们对代码进行了性能分析。通过随机生成的2000条直线出入测试,我们代码的主要性能请将在于去重时对代码进行的排序操作,占到了所有消耗的70%左右。

测试

消除 Code Quality Analysis 中的所有警告

关键代码说明

交点计算方法

结构体(位置)比较函数

我们使用结构体struct Position来存储交点的坐标。由于在最后我们需要对这些坐标进行去重操作,所以我们需要设置坐标的比较函数,判断二者的大小和相等性。

猜你喜欢

转载自www.cnblogs.com/lebway/p/12457526.html