docs: function (tiles) {
  		const maxDist = 5;
  		
  		let t, tile, i;
  		
  		let topLeft = Vector._temp[0],
  			topRight = Vector._temp[1],
  			bottomLeft = Vector._temp[2],
  			bottomRight = Vector._temp[3];
  		
  		// Calculate initial boundary edges
  		for (t = 0; t < tiles.length; t++) {
  			tile = tiles[t];
  			
  			// Skip over irrelevant tiles
  			if (isIrrelevant(tile)) {
  				continue;
  			}
  			
  			let body = tile.physics.matterBody.body;
  			let vertices = body.vertices;
  			
  			let left = tile.pixelX;
  			let right = tile.pixelX + tile.width;
  			let top = tile.pixelY;
  			let bottom = tile.pixelY + tile.height;
  			
  			topLeft.y = top;
  			topLeft.x = left;
  			topRight.y = top;
  			topRight.x = right;
  			bottomLeft.y = bottom;
  			bottomLeft.x = left;
  			bottomRight.y = bottom;
  			bottomRight.x = right;
  			
  			// Identify solid boundary edges
  			for (i = 0; i < vertices.length; i++) {
  				let firstVertex = vertices[i];
  				let secondVertex = vertices[(i + 1) % vertices.length];
  				
  				// Top
  				if (distance(firstVertex, topLeft) < maxDist && distance(secondVertex, topRight) < maxDist) {
  					tile.physics.slopes.edges.top = Constants.SOLID;
  				}
  				
  				// Bottom
  				if (distance(firstVertex, bottomRight) < maxDist && distance(secondVertex, bottomLeft) < maxDist) {
  					tile.physics.slopes.edges.bottom = Constants.SOLID;
  				}
  				
  				// Left
  				if (distance(firstVertex, bottomLeft) < maxDist && distance(secondVertex, topLeft) < maxDist) {
  					tile.physics.slopes.edges.left = Constants.SOLID;
  				}
  				
  				// Right
  				if (distance(firstVertex, topRight) < maxDist && distance(secondVertex, bottomRight) < maxDist) {
  					tile.physics.slopes.edges.right = Constants.SOLID;
  				}
  			}
  		}
  		
  		// Compare neighbouring boundary edges
  		for (t = 0; t < tiles.length; t++) {
  			tile = tiles[t];
  			
  			// Skip over irrelevant tiles
  			if (isIrrelevant(tile)) {
  				continue;
  			}
  			
  			let tileEdges = tile.physics.slopes.edges;
  			let neighbours = tile.physics.slopes.neighbours;
  			
  			let up = neighbours.up;
  			let down = neighbours.down;
  			let left = neighbours.left;
  			let right = neighbours.right;
  			
  			// Identify empty edges
  			if (!isIrrelevant(up)) {
  				tileEdges.top = this.compareBoundaryEdges(tileEdges.top, up.physics.slopes.edges.bottom);
  				tile.collideUp = tileEdges.top !== Constants.EMPTY;
  			}
  			
  			if (!isIrrelevant(down)) {
  				tileEdges.bottom = this.compareBoundaryEdges(tileEdges.bottom, down.physics.slopes.edges.top);
  				tile.collideDown = tileEdges.bottom !== Constants.EMPTY;
  			}
  			
  			if (!isIrrelevant(left)) {
  				tileEdges.left = this.compareBoundaryEdges(tileEdges.left, left.physics.slopes.edges.right);
  				tile.collideLeft = tileEdges.left !== Constants.EMPTY;
  			}
  			
  			if (!isIrrelevant(right)) {
  				tileEdges.right = this.compareBoundaryEdges(tileEdges.right, right.physics.slopes.edges.left);
  				tile.collideRight = tileEdges.right !== Constants.EMPTY;
  			}
  		}
  	}