/// <summary>
        /// Get a set of vertical elements which start on this floor
        /// </summary>
        /// <param name="parentBuilding"></param>
        /// <returns></returns>
        private IReadOnlyList <ConstrainedVerticalSelection> ConstrainVerticalElements(IBuilding parentBuilding)
        {
            //Get all vertical selections which start on this floor
            var starting = parentBuilding
                           .Verticals(FloorIndex, FloorIndex)
                           .Where(a => a.StartingFloor() == FloorIndex)
                           .ToArray();

            //Create somewhere to put results
            var results = new ConstrainedVerticalSelection[starting.Length];

            //Inspect all the floors which overlap each vertical, and constrain the area the vertical can be placed in
            for (var i = 0; i < starting.Length; i++)
            {
                var verticalSelection = starting[i];

                //Get all floors this feature overlaps
                var crossedFloors = (
                    from f in Enumerable.Range(verticalSelection.Bottom, verticalSelection.Top - verticalSelection.Bottom + 1)
                    select parentBuilding.Floor(f)
                    ).ToArray();

                //Calculate the intersection of all crossed floor footprints
                var intersection = IntersectionOfFootprints(crossedFloors);

                results[i] = new ConstrainedVerticalSelection(verticalSelection, intersection);
            }

            return(results);
        }