Camera operation

Karel World has a single camera. Many operations refer to it implicitly. 
     
If you have any Model object (such as a robot) you can ask the world's camera to track that object:

	world.cameraFollow(robot);
	
	Normally the camera only moves when the object does. If you want it to focus on its object at other
	times use:
	
	world.refocusCamera();
	
If you want the camera to stay pointed at a spot above or below a 
particular corner, even when the camera moves, use:

	world.cameraStayFocusedOn(street, avenue, height);
	
	If you omit the last argument, the height will be 0 (street level). 
	
You can create an InvisibleCameraTarget anywhere in the world and have the camera point at it. You
can also move the camera to its position. 
	
You can operate the camera in a running simulation with the keyboard, but first you need to click in 
the world (on the background) so that the world looks for keystrokes. 

	Left-Arrow moves the camera back (farther)
	Right-Arrow moves the camera forward (closer)
	
	If you pause the simulation, the keystrokes won't take effect until you resume it. 
	
You can move the camera to a spot above or below a particular corner:

	moveCameraTo(street, avenue, height, duration);
	
	If you omit the last argument the move will be instantaneous.
	
You obtain an explicit reference to the camera by asking a world for the reference:

     AbstractCamera camera = getCamera();
     
This is convenient if you are in a method of class that extends KarelWorld. You may also ask any robot
object for the camera of its world. But this only works after you have added the robot to the world. 

	AbstractCamera camera = robot.getCamera();
	
If you just want the camera to point at an object once (rather than continue to follow it):

	camera.pointAt(robot); // this is a basic camera operation from Alice itself. 
	
You can move the camera once you have a reference to it with the usual Alice commands, remembering
that these moves are relative to the camera's current orientation. The camera is initialized as follows:

	The camera is 2 blocks behind the south boundary wall, across the wall from first avenue from 
	a height of 4 meters (blocks). It is inclined downward (forward) 30 degrees. It
	looks in direction roughly North-East by North (33.75 degrees East of Karel's North
	-- not Alice's north) It has a vertical viewing angle of .15.
	
	Camera movements are in blocks, though you can use fractions of a block if you like
	
	     camera.move(MoveDirection.RIGHT, 1.5);
	
	BACKWARD and FORWARD motion will take the camera down (up) as well, since it is inclined. You may
	turn (rotate) the camera also. Rotations are measured in fractions of a full revolution (.25 = 90 degrees).
	To make the camera level (from its initial position) you can use:
	
	     camera.turntate(TurnDirection.BACKWARD, 30.0/360.0);
	     
	If you then want it to point straight West:
	
	     camera.turn(TurnDirection.LEFT, 123.75/360.0); // 90 + 33.75
	     
	     
Note that the camera can be moved beneath the world and pointed up to look at it from below. If you move the camera
back far enough the world looks incomplete. The boundary wall and the street grid are only created initially to 
cover a relatively small area. But if any robot moves outside that region, the walls and grid are extended to keep 
pace. This is because these objects take up memory and there are quite a lot of them. But if you follow a street for
4000 blocks you will find it isn't gridded any more. Everything will still work, but it won't be as visually
pleasing. 
	 
