实验前的准备
实验前,先下载了 检查了 自带的 .比较麻烦的是环境变量的配置,因为之前安装过 ,卸载之后仍然不能正确安装新 ,花费了很长时间.
P1
主要考察了文件的读取以及对异常的处理,是实验中最简单的一部分,但是因为自己不熟悉
语法,边学边写,也花费了不少时间.
编程中
需要注意的是:
- 相对路径的填写:例如针对下面的文件目录,如果在 中使用 ,相对路径应从 开始填写.
- 关于异常处理:了解了多种异常类型,例如 ,利用 提供的这些异常类型,省去了累赘的判断过程,使得代码更加简洁.
- 关于从文件中读出矩阵之后的处理:起初,不知道使用什么容器来承接从文件中读出的数据.
- src
-
- src
P2
难点就是求凸包算法
第一个想法是把给的点集按照
坐标排序,
肯定在凸包线上,再以改点为起点,逐个遍历其他点,只要计算目标点和当前点的夹角,使用
函数所得的最大值对应的点就是下一个在凸包线上的点.该算法可行,但比较费时。之后查阅资料知道了求凸包的边界漫游法。
求凸包算法(所得凸包是逆时针方法的)
- 找到所给点集中最左下方的顶点作为起始点P0。
- 将点集中剩余的点排序,排序规则是:将y = P0.y作为极轴,将P0作为极点,待排序点和极点之间的极角较小的排在前面。
- 之后,将P0加到排好序的点集最后。
- 将P0和排好序的点中最小的点进栈。
- 对排好序的点集中的每个点P,都判断次栈顶元素,栈顶元素,P是否构成左旋,如果是左旋,将P压栈,否则,将栈顶元素出栈,直到构成左旋为止。
核心代码见下:
static Point findMinPoint(Set<Point> points) {
Point minPoint = null;
for (Point point : points) {
if (minPoint == null) {
minPoint = point;
continue;
}
if (minPoint.x() > point.x()) minPoint = point;
else if (minPoint.x() == point.x()) {
if (point.y() < minPoint.y())
minPoint = point;
}
}
return minPoint;
}
static boolean judgeLeft(Point A, Point B, Point C) {
double judge = (A.x() - C.x()) * (B.y() - C.y()) - (A.y() - C.y()) * (B.x() - C.x());
if (judge > 0) return true;
else {
return false;
}
}
public static Set<Point> convexHull(Set<Point> points){
if (points.isEmpty() || points.size() <= 3) return points;
Point minPoint = findMinPoint(points);
List<Point> pointList = new ArrayList<Point>(points);
final Point minPoint1 = minPoint;
pointList.remove(minPoint);
Collections.sort(pointList, new Comparator<Point>() {
public int compare(Point point1, Point point2) {
if (judgeLeft(minPoint1, point1, point2)) return -1;
else return 1;
}
});
pointList.add(minPoint);
Stack<Point> pointStack = new Stack<Point>();
pointStack.add(minPoint);
pointStack.add(pointList.get(0));
int size = pointList.size();
for (int i = 1; i < size; i++) {
while (true) {
Point peekPoint = pointStack.pop();
Point nextPoint = pointStack.peek();
pointStack.add(peekPoint);
if (judgeLeft(nextPoint, peekPoint, pointList.get(i))) {
pointStack.add(pointList.get(i));
//System.out.println("true");
break;
}
else pointStack.pop();
}
}
pointStack.pop();
Set<Point> convexHullPoints = new HashSet<Point>(pointStack);
return convexHullPoints;
}