public Point[] executeGrahamScan() {
		this.initialize();
		Stack<Point> stack = new Stack();
		stack.push(bottomMostPoint);
		if (!inputPoints.isEmpty()) {
			stack.push(inputPoints.get(0));
		}
		if (inputPoints.size() > 1) {
			stack.push(inputPoints.get(1));
		}
		for (int i = 2; i < inputPoints.size(); i++) {
			while (stack.peek().isLeftOfLine(stack.get(stack.size() - 2), inputPoints.get(i))
					|| (stack.peek().isCollinearTo(inputPoints.get(i), stack.get(stack.size() - 2)))) {
				stack.pop();
			}
			stack.push(inputPoints.get(i));
		}


		return stack.toArray(new Point[stack.size()]);
	}