# This example shows one of the possibilities of the canvas: 
# the ability to access all existing objects on it.
size(550, 300)

fill(1, 0.8)
strokewidth(1.5)

# First, generate some rectangles all over the canvas, rotated randomly.
for i in range(3000):
    grob = rect(random(WIDTH)-25, random(HEIGHT)-25,50, 50)
    grob.rotate(random(360))
    
# Now comes the smart part: 
# We want to sort the objects on the canvas using a custom sorting
# method; in this case, their vertical position.
# The bounds property returns the following: ( (x, y), (width, height) )
# The lambda function thus compares the y positions against eachother.
sorted_grobs = list(canvas)
# sorted_grobs.sort(lambda v1, v2: cmp(v1.bounds[0][1], v2.bounds[0][1]))

def compare(a,b):
    v1 = a.bounds[0][1]
    v2 = b.bounds[0][1]
    if v1 > v2:
        return 1
    elif v1 < v2:
        return -1
    return 0

sortlistfunction( sorted_grobs, compare )

# Now that we have all the graphic objects ("grobs") sorted,
# traverse them in order and change their properties.

# t is a counter going from 0.0 to 1.0
t = 0.0
# d is the delta amount added each step
d = 1.0 / len(sorted_grobs)




for grob in sorted_grobs:
    # Grobs will get bigger
    grob.scale(t)
    # Grobs's stroke will get darker
    grob.stroke = (0.6 - t, 0.50)
    t += d

# This is really a hack, but you can replace the internal
# grob list of the canvas with your own to change the Z-ordering.
# Comment out this line to get a different effect.
canvas._grobs = sorted_grobs
# This example shows one of the possibilities of the canvas: 
# the ability to access all existing objects on it.
size(550, 300)

fill(1, 0.8)
strokewidth(1.5)

# First, generate some rectangles all over the canvas, rotated randomly.
for i in range(3000):
    grob = rect(random(WIDTH)-25, random(HEIGHT)-25,50, 50)
    grob.rotate(random(360))
    
# Now comes the smart part: 
# We want to sort the objects on the canvas using a custom sorting
# method; in this case, their vertical position.
# The bounds property returns the following: ( (x, y), (width, height) )
# The lambda function thus compares the y positions against eachother.
sorted_grobs = list(canvas)
# sorted_grobs.sort(lambda v1, v2: cmp(v1.bounds[0][1], v2.bounds[0][1]))

def compare(a,b):
    v1 = a.bounds[0][1]
    v2 = b.bounds[0][1]
    if v1 > v2:
        return 1
    elif v1 < v2:
        return -1
    return 0

sortlistfunction( sorted_grobs, compare )

# Now that we have all the graphic objects ("grobs") sorted,
# traverse them in order and change their properties.

# t is a counter going from 0.0 to 1.0
t = 0.0
# d is the delta amount added each step
d = 1.0 / len(sorted_grobs)




for grob in sorted_grobs:
    # Grobs will get bigger
    grob.scale(t)
    # Grobs's stroke will get darker
    grob.stroke = (0.6 - t, 0.50)
    t += d

# This is really a hack, but you can replace the internal
# grob list of the canvas with your own to change the Z-ordering.
# Comment out this line to get a different effect.
canvas._grobs = sorted_grobs
# This example shows one of the possibilities of the canvas: # the ability to access all existing objects on it. # First, generate some rectangles all over the canvas, rotated randomly. # Now comes the smart part: # We want to sort the objects on the canvas using a custom sorting # method; in this case, their vertical position. # The bounds property returns the following: ( (x, y), (width, height) ) # The lambda function thus compares the y positions against eachother. # sorted_grobs.sort(lambda v1, v2: cmp(v1.bounds[0][1], v2.bounds[0][1])) # Now that we have all the graphic objects ("grobs") sorted, # traverse them in order and change their properties. # t is a counter going from 0.0 to 1.0 # d is the delta amount added each step # Grobs will get bigger # Grobs's stroke will get darker # This is really a hack, but you can replace the internal # grob list of the canvas with your own to change the Z-ordering. # Comment out this line to get a different effect.