个人项目作业
个人项目作业
1.教学班级和Github项目地址
项目 | 内容 |
---|---|
教学班级 | 005 |
项目地址 | https://github.com/JeromyLee/IntersectProject |
2.PSP 2.1表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 20 | 10 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 40 | 60 |
· Design Spec | · 生成设计文档 | 20 | 30 |
· Design Review | · 设计复审(和同事审核设计文档) | 10 | 10 |
· Coding Standard | · 代码规范(为目前的开发制定合适的规范) | 20 | 10 |
· Design | · 具体设计 | 20 | 10 |
· Coding | · 具体编码 | 90 | 70 |
· Code Review | · 代码复审 | 30 | 50 |
· Test | · 测试(自我测试,修改代码,提交修改) | 60 | 60 |
Reporting | 报告 | ||
· Test Report | · 测试报告 | 30 | 20 |
· Size Measurement | · 计算工作量 | 20 | 10 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 40 |
Total | 合计 | 420 | 380 |
3.解题思路
n条直线若满足以下情况:
- 无三条及以上直线交与一点
- 无平行线
- 无重合直线(本题保证交点为有限个,因此无需考虑)
交点个数为,
\[\frac{n(n-1)}{2}
\]
采用暴力求解,求出所有的交点,在添加的过程中去重。
4.设计实现过程
由于不需要复杂的操作,因此只有一个类,仅将点和直线包装成结构体,以及处理点和直线的相应方法。
两点确定一条直线表示为
\[Ax+By+C=0
\]
其中,
\[A=y_2-y_1
\]
\[B=x_1-x_2
\]
\[C=x_2*y_1-x_1*y_2
\]
均为整数。
考虑到浮点型可能带来的精度问题,因此将交点坐标表示为分数,
\[(\frac{x_u}{x_d},\frac{y_u}{y_d})
\]
其中,
\[x_u=B_2*C_1-B_1*C_2
\]
\[y_u=A_1*C_2-A_2*C_1
\]
\[x_d=y_d=A_2*B_1-A_1*B_2
\]
也均为整数。
5.程序改进
在容器选择方面,最初选择使用set存放交点,但需要重写operator,而且set本身虽然使用起来方便,但效率一般。最终选择了vector。但也依然有可优化之处,如插入时自动排序去重,而非乱序去重。以及交点的四个参数,实际上用三个整型就能表示。
6.代码说明
首先是代码总格局
然后是一些函数
以及主函数中命令行参数的处理部分
消除Warnings
7.总结
这次作业总体不难,但囿于个人能力问题,加上第一次接触C++与VS,再加上这周电脑出了大问题,修不明白了,已经卖了新的,导致遇到了许多意料之外的小问题,解决起来花费了不少时间。之后会尽力赶上的!