public PolygonProjection getProjection(View view)
	{
		Point3D viewPoint = view.getView();
		Point3D viewedPoint = view.getViewed();
		
		double xDisp = viewedPoint.getX() - viewPoint.getX();
		double yDisp = viewedPoint.getY() - viewPoint.getY();
		double zDisp = viewedPoint.getZ() - viewPoint.getZ();
		
		double xTurnAxis = yDisp;
		double yTurnAxis = -xDisp;
		
		double zTurnAngle = Math.atan2(yTurnAxis, xTurnAxis);
		double turnAngle = Math.acos(zDisp/Math.sqrt(Math.pow(xDisp, 2) + Math.pow(yDisp, 2) + Math.pow(zDisp, 2)));
		
		Polygon3D rotatedPoly;
		
		/* Translation of space to position rotation axis at origin */
		rotatedPoly = translate(-viewPoint.getX(), -viewPoint.getY(), -viewPoint.getZ());
		
		/* Rotation of space about z-axis to position rotation axis at x-axis */
		rotatedPoly = rotatedPoly.rotAboutZ(-zTurnAngle);
		
		/* Rotation of space around the x-axis through the angle that positions the view plane at z = k */
		rotatedPoly = rotatedPoly.rotAboutX(turnAngle);
		
		/* Rotation of space about z-axis to reverse the previous z-rotation */
		rotatedPoly = rotatedPoly.rotAboutZ(zTurnAngle);
		
		Point2D[] projectedPoints = new Point2D[points.length];
		Point3D[] rotatedPoints = rotatedPoly.getPoints();
		
		Point3D maxPoint = rotatedPoints[0];
		Point3D minPoint = rotatedPoints[0];
		
		double zSum = 0;
		
		for(int i = 0; i < points.length; i ++)
		{
			/* Deals with polygons behind view plane */
			if(rotatedPoints[i].getZ() < -5)
			{
				return new PolygonProjection(new Point2D[0]);
			}
			
			/* Projection perspective calculations */
			double perspectiveMod = view.getFocalLength()/(rotatedPoints[i].getZ() + view.getFocalLength());
			projectedPoints[i] = new Point2D(perspectiveMod*rotatedPoints[i].getX() + view.getWidth()/2, perspectiveMod*rotatedPoints[i].getY() + view.getHeight()/2);
			
			/* Projection incline calculations */
			if(rotatedPoints[i].getZ() > maxPoint.getZ())
			{
				maxPoint = rotatedPoints[i];
			}
			if(rotatedPoints[i].getZ() <= minPoint.getZ())
			{
				minPoint = rotatedPoints[i];
			}
			
			/* Projection priority calculations */
			zSum += rotatedPoints[i].getZ();
		}
		
		double priority = zSum/rotatedPoints.length;
		
		double incline = Math.abs(maxPoint.getZ() - minPoint.getZ())/Math.sqrt(Math.pow(maxPoint.getX() - minPoint.getX(), 2) + Math.pow(maxPoint.getY() - minPoint.getY(), 2)); 
		
		return ((new PolygonProjection(projectedPoints, priority, incline, color)).rotate(new Point2D(view.getWidth()/2, view.getHeight()/2), view.getTurnAngle()));
	}