项目 | 内容 |
---|---|
这个作业属于哪个课程 | 2020春北航计算机学院软件工程(罗杰 任健) |
这个作业的要求在哪里 | 个人项目作业 |
项目地址
- 教学班级: 006
- 项目地址: https://github.com/Lebway/IntersectProject.git
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
来存储交点的坐标。由于在最后我们需要对这些坐标进行去重操作,所以我们需要设置坐标的比较函数,判断二者的大小和相等性。