The Skyline Problem

Lab3.2 The Skyline Problem


The skyline problem is defined as given n rectangular buildings in a 2-dimensional city, compute the skyline of these buildings, eliminating hidden lines. The main task is to view buildings from a side and remove all sections that are not visible. All buildings share common bottom and every building can be represented by triplet (Left, Height, Right)

As an example, if the buildings array is
     [
        [1, 11, 5],
        [2, 6, 7],
        [3, 13, 9],
        [12, 7, 16],
        [14, 3, 25],
        [19, 18, 22],
        [23, 13, 29],
        [24, 4, 28]
      ]
then the skyline is
[[1, 11], [3, 13], [9, 0], [12, 7], [16, 3], [19, 18], [22, 3], [23, 13], [29, 0]]


buildings = [
                [1, 11, 5],
                [2, 6, 7],
                [3, 13, 9],
                [12, 7, 16],
                [14, 3, 25],
                [19, 18, 22],
                [23, 13, 29],
                [24, 4, 28]
            ]

def getSkyLine(B):
    return list(([B[0], B[1]], [B[2], 0]))

def setSkyLine(B1, B2):
    # B1 = Sky line of building 1 & B2 = Sky line of building 2
    h1 = 0; h2 = 0 # Height of buildings from B1 & B2
    # Skyline to return
    SkyLine = []
    # Indexes to iterate through each building set
    B1_i = 0; B2_i = 0;
    while ((len(B1) > B1_i) and (len(B2) > B2_i)):
        # Compare x position of each building
        if (B1[B1_i][0] <= B2[B2_i][0]):
            # h1 gets the first strip height
            h1 = B1[B1_i][1]
            # Add the current maximum height as the
            # height of the current strip
            if h1 >= h2: newHeight = h1
            else: newHeight = h2
            # Create the new strip of the skyline and
            # add it to the skylines building up
            if not ((len(SkyLine) != 0) and (SkyLine[len(SkyLine) - 1][1] == newHeight)):
                SkyLine.append([B1[B1_i][0], newHeight])
            # Increment the index to move to the next
            # building strip
            B1_i = B1_i + 1
        else:
            # h2 gets the first strip height
            h2 = B2[B2_i][1]
            # Add the current maximum height as the
            # height of the current strip
            if h1 >= h2: newHeight = h1
            else: newHeight = h2
            # Create the new strip of the skyline and
            # add it to the skylines building up
            if not ((len(SkyLine) != 0) and (SkyLine[len(SkyLine) - 1][1] == newHeight)):
                SkyLine.append([B2[B2_i][0], newHeight])
            # Increment the index to move to the next
            # building strip
            B2_i = B2_i + 1

    # If there are elements left in B1 or B2, that means
    # they are higher strips

    while (B1_i < len(B1)):
        # h1 gets the first strip height
        h1 = B1[B1_i][1]
        # Add the current maximum height as the
        # height of the current strip
        if h1 >= h2: newHeight = h1
        else: newHeight = h2
        # Add it to the skylines building up
        if not ((len(SkyLine) != 0) and (SkyLine[len(SkyLine) - 1][1] == newHeight)):
            SkyLine.append([B1[B1_i][0], newHeight])
        B1_i = B1_i + 1
        
    while (B2_i < len(B2)):
        # h2 gets the first strip height
        h2 = B2[B2_i][1]
        # Add the current maximum height as the
        # height of the current strip
        if h1 >= h2: newHeight = h1
        else: newHeight = h2
        # Add it to the skylines building up
        if not ((len(SkyLine) != 0) and (SkyLine[len(SkyLine) - 1][1] == newHeight)):
            SkyLine.append([B2[B2_i][0], newHeight])
        B2_i = B2_i + 1

    # Return the skyline calculated
    return SkyLine

def FindSkyLine(B):
    # Calculate length of B
    length = len(B)
    # If there's only one building,
    if (length == 1):
        return getSkyLine(B[0])
    else:
        # Find the mid point to break the set of buildings
        mid_value = length / 2
        # Find skyline of both set
        B1 = FindSkyLine(B[:mid_value]);
        B2 = FindSkyLine(B[mid_value:]);
        return setSkyLine(B1, B2)

print FindSkyLine(buildings)

Comments

Popular posts from this blog

Python Laboratory Excersices

Mocking Point Clouds in ROS Rviz

Find Maximum Number in a Nested List Recursively