private ArrayList<Point> graham() {
		// heuristic,expect that half of the points are not inside the
		// convexhull
		int startSize = helperP.size() > 21 ? helperP.size() / 2 : 10;
		ArrayList<Point> convexHull = new ArrayList<>(startSize);

		// fill convexHull
		convexHull.add(lowest);
		convexHull.add(helperP.get(0).getP());

		for (int i = 1; i < helperP.size(); i++) {
			Point next = helperP.get(i).getP();

			while (!isConvex(convexHull, next))
				convexHull.remove(convexHull.size() - 1);

			convexHull.add(next);
		}

		/*
		 * MODIFICATION: check if the last Point has to be in the ConvexHull. if
		 * P0 and Pn-1 build a line with Pn on it, remove Pn
		 */
		int n = convexHull.size() - 1;
		if (!isConvex(convexHull.get(n - 1), convexHull.get(n), convexHull.get(0)))
			convexHull.remove(n);

		return convexHull;
	}