教学班级:006,周五上午3、4节班。
项目地址:https://github.com/gzhGit/personalwork1.git
psp表格:
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 10 | 10 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 90 | 120 |
· Design Spec | · 生成设计文档 | 60 | 30 |
· Design Review | · 设计复审 (和同事审核设计文档) | 10 | 10 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 20 | 10 |
· Design | · 具体设计 | 90 | 100 |
· Coding | · 具体编码 | 240 | 300 |
· Code Review | · 代码复审 | 30 | 20 |
· Test | · 测试(自我测试,修改代码,提交修改) | 180 | 240 |
Reporting | 报告 | ||
· Test Report | · 测试报告 | 30 | 30 |
· Size Measurement | · 计算工作量 | 30 | 40 |
· Postmortem & Process Improvement Plan | · 事后总结,并提出过程改进计划 | 30 | 20 |
解题思路:
实现过程:
//直线对象
Line* line1 = new Line(0, 0, 1, 1);
Line* line2 = new Line(2, 0, 2, -1123);
//圆对象
Circle* circle1 = new Circle(2, 2, 1);
Circle* circle2 = new Circle(0, 0, 3);
Circle* circle3 = new Circle(0, 0, 2);
Circle* circle4 = new Circle(10, 0, 1);
//几何对象,可表示直线或圆
Object o1(0, line1);
Object o2(1, circle1);
Object o3(1, circle2);
//主要函数测试
Intersect i;
vector<Node> v1 = i.circleCrossCircle(*(o2.circle), *(o3.circle));
vector<Node> v2 = i.lineCrossCircle(*(o1.line), *(o2.circle));
vector<Node> v3 = i.lineCrossLine(*line1, *line2);
vector<Node> v4 = i.lineCrossCircle(*line2, *circle2);
vector<Node> v5 = i.lineCrossCircle(*line2, *circle3);
vector<Node> v6 = i.lineCrossCircle(*line1, *circle4);
int size1 = v1.size();
int size2 = v2.size();
Assert::AreEqual(size1, 2);
Assert::AreEqual(size2, 2);
Assert::AreEqual((int)v3.size(), 1);
Assert::AreEqual((int)v4.size(), 2);
Assert::AreEqual((int)v5.size(), 1);
Assert::AreEqual((int)v6.at(0).judgeCross, 0);
性能分析:
代码说明:
int count = 0;
//遍历objVector,求二者交点
for (count = 0; count < countLines; count++) {
Object objCross = objVector->at(count);
vector<Node> result; //存储几何对象交点
Intersect cal;
//当前几何对象与直线求交点
if (obj.lineOrCircle == 0) {
//直线与直线相交
if (objCross.lineOrCircle == 0) {
result = cal.lineCrossLine(*(obj.line), *(objCross.line));
}
//直线与圆相交
else if (objCross.lineOrCircle == 1) {
result = cal.lineCrossCircle(*(obj.line), *(objCross.circle));
}
}
//当前几何对象与圆求交点
else if (obj.lineOrCircle == 1) {
//圆与直线相交
if (objCross.lineOrCircle == 0) {
result = cal.lineCrossCircle(*(objCross.line), *(obj.circle));
}
//圆与圆相交
else if (objCross.lineOrCircle == 1) {
result = cal.circleCrossCircle(*(obj.circle), *(objCross.circle));
}
}
//将求解所得的交点存入nodeSet
int runover;
for (runover = 0; runover < (int)result.size(); runover++) {
Node node = result.at(runover);
if (node.judgeCross == 1) {
nodeSet->insert(node);
}
}
}
objVector是存储几何对象的容器,每读入一行几何参数,就生成一个几何对象,记作obj。从前向后遍历objVector,将obj与容器中的每个几何对象求解交点,其中有细分的四种情况:直线和直线求交点,直线和圆求交点,圆和直线求交点(与前者调用同一函数),圆和圆求交点。求解交点的函数返回一个存储交点的容器,检查这些交点,如果其judgeCross值为0,说明二者无交点;反之说明二者存在交点,将交点存入nodeSet中。
使用vs2017的运行代码分析,对项目进行检测,结果无警告。截图如下:
原文:https://www.cnblogs.com/gzhBuaa/p/12455262.html