个人项目作业

个人项目作业


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,再加上这周电脑出了大问题,修不明白了,已经卖了新的,导致遇到了许多意料之外的小问题,解决起来花费了不少时间。之后会尽力赶上的!

posted on 2020-03-17 02:16  我是真的不会编程  阅读(131)  评论(1编辑  收藏  举报