软件构造Lab1实验总结
截至今日,软件构造的Lab1已经全部完成,故编写本篇博客记录在实验一过程中遇到的问题以及相应的解决方法。
一、P2中的凸包问题
我使用了gift-wrapping算法,再此对其进行一个简要的介绍
算法简介:以任意凸包上的点建立坐标系,该点连接其他点形成的极角中,绕该点逆时针方向的位于凸包上的点到该点极角最小。而在本算法中,找到点集中位于最左下角的点,该点必然在凸包上,然后以该点为起点,利用向量的叉乘,找到极角最小的点,加入凸包集,然后以该点为起点继续寻找下一个点,直至最终终点与凸包集中的第一个点(即起点与终点重合为止)。对于共线的顶点,观察MIT提供的test文件可知,其求的是最小凸包,则应该取众多共线顶点中距离最长的一个。
关键代码:
1、寻找并返回最左下角的顶点,即凸包的起点
```java
public static int ltl(List<Point> points) { //通过这个方法返回函数最坐下角的点,该点必在凸包上
int k = 0;
for (int i = 1; i < points.size(); i++) {
if (points.get(k).y() > points.get(i).y()
|| (points.get(k).y() == points.get(i).y() && points.get(k).x() > points.get(i).x())) {
k = i;
}
}
return k;
}
2、通过叉乘找到凸包上的下一个点
public static int ToLeft(Point v1, Point v2, Point s) {
double area2 = (v2.x() * s.y() + v1.x() * v2.y() + v1.y() * s.x())
- (v1.y() * v2.x() + v1.x() * s.y() + v2.y() * s.x());
if (area2 > 0.0f) // 左侧或共线
return 1;
else // 右侧
return -1;
}
3、主方法的核心算法,循环截至条件为凸包集的首尾重合
do {
extreme[begin] = true;
end = (begin + 1) % Lpoint.size();
for (int i = 0; i < Lpoint.size(); i++) {
if (i != begin && i != end
&& (end == -1 || ToLeft(Lpoint.get(begin), Lpoint.get(end), Lpoint.get(i)) == -1))
end = i;
}
begin = end;
} while (begin != LTL); //循环直到凸包的头和尾对上
二、P3中实现用户输入名字添加至关系网中
起初对于存顶点的集合,我使用了ArrayList类型变量存储person类,但是对于用户输入名字而创建的Person类我因无法解决变量名的问题 故无法实现添加至顶点集。后来我改用HashMap类型变量来存储Person类,Key值为用户的名字(String类型),Value为Person类,这样在用户输入一个名字后,只需要为该名字新建Person类(申请空间),然后将名字与Person类直接加入Map中即可实现用户自主输入添加顶点和边。(如果读者有兴趣可自行尝试,笔者也是Java的初学者,故主要提供一种思路)
三、关于GitHub中更换Master支的建议
由于初次使用GitHub,对于相关操作还不太熟悉,故先使用一些无用文件测试,然而手抖多件了几个本地仓库均与该远程仓库连接,上传了许多无用文件却从诸多本地仓库难以删除时,遂决定删除所有本地仓库以及GitHub上的master支全部重新来过(笑)。经过一下午的查资料尝试最终成功,再此记录方法以备后患。
1、先建立一个备用分支
git branch temp
2、将这个分支提交到 GitHub上
git push origin temp:temp
3、在GitHub仓库中打开settings,将默认仓库设置为temp
4、再删除本地master分支
git branch -D master
5、删除GitHub上的master分支直接再仓库选择branch,页面中可以直接手动删除
6、将temp分支重命名为master
git branch -m temp master
7、将新建master分支中正确的内容重新推送即可,如果显示失败的话,可以强制push
git -f push origin master //慎用
8、更新列表,使已经 删除的分支不再显示
git remote prune origin