软件构造实验(一)总结

实验前的准备

实验前,先下载了 j d k , e c l i p s e , g i t , jdk,eclipse,git, 检查了 e c l i p s e eclipse 自带的 J u n i t Junit .比较麻烦的是环境变量的配置,因为之前安装过 j d k jdk ,卸载之后仍然不能正确安装新 j d k jdk ,花费了很长时间.

P1

P 1 P1 主要考察了文件的读取以及对异常的处理,是实验中最简单的一部分,但是因为自己不熟悉 j a v a java 语法,边学边写,也花费了不少时间.
编程中 j a v a java 需要注意的是:

  • 相对路径的填写:例如针对下面的文件目录,如果在 M a g i c S q u a r e . j a v a MagicSquare.java 中使用 1. t x t 1.txt ,相对路径应从 s r c src 开始填写.
  • 关于异常处理:了解了多种异常类型,例如 A r r a y I n d e x O u t O f B o u n d s E x c e p t i o n , N e g a t i v e A r r a y S i z e E x c e p t i o n ArrayIndexOutOfBoundsException,NegativeArraySizeException ,利用 j a v a java 提供的这些异常类型,省去了累赘的判断过程,使得代码更加简洁.
  • 关于从文件中读出矩阵之后的处理:起初,不知道使用什么容器来承接从文件中读出的数据.
    • src
      • P 1 P1
        • M a g i c S q u a r e . j a v a MagicSquare.java
        • t x t txt
          • 1. t x t 1.txt
          • 2. t x t 2.txt
          • 3. t x t 3.txt
          • 4. t x t 4.txt
          • 5. t x t 5.txt

P2

难点就是求凸包算法
第一个想法是把给的点集按照 x x 坐标排序, ( x m i n , y ) (x_{min},y) 肯定在凸包线上,再以改点为起点,逐个遍历其他点,只要计算目标点和当前点的夹角,使用 a t a n 2 atan2 函数所得的最大值对应的点就是下一个在凸包线上的点.该算法可行,但比较费时。之后查阅资料知道了求凸包的边界漫游法。

求凸包算法(所得凸包是逆时针方法的)

  1. 找到所给点集中最左下方的顶点作为起始点P0。
  2. 将点集中剩余的点排序,排序规则是:将y = P0.y作为极轴,将P0作为极点,待排序点和极点之间的极角较小的排在前面。
  3. 之后,将P0加到排好序的点集最后。
  4. 将P0和排好序的点中最小的点进栈。
  5. 对排好序的点集中的每个点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;
	}
发布了13 篇原创文章 · 获赞 2 · 访问量 580

猜你喜欢

转载自blog.csdn.net/qq_43887432/article/details/104560891