Flat - Points

Imports

from flat import document, shape, rgb, rgba
from bezmerizing import Path, Polyline
from IPython.display import SVG, display
import numpy as np
import random
import itertools
from sympy.utilities.iterables import multiset_permutations

Functions

This section defines functions that will be used later.

# Display a flat page here in the notebook
def show(page):
    display(SVG(page.svg()))
       
# Draw a grid of horizontal and vertical lines based on 
# given coordinates
def draw_grid(page, x_coords, y_coords, color=rgb(200, 200, 200)):
    
    # Get minimum and maximum values 
    min_x, max_x = min(x_coords), max(x_coords)
    min_y, max_y = min(y_coords), max(y_coords)
    
    # Draw vertical lines
    for x in list(x_coords):
        line = shape().stroke(color).line(x, min_y, x, max_y)
        page.place(line)

    # Draw horizontal lines
    for y in list(y_coords):
        line = shape().stroke(color).line(min_x, y, max_x, y)
        page.place(line)

Flat Document

The following code defines the general setup of the document. It has width and height and a margin. The size of the grid is calculated as the size of the document minus the margin on all sides of the document.

# Width and height of the document
width, height = 400, 400

# Margin between border of the document and
# border of the grid
margin = 10

# Size of the grid
grid_width = width - 2*margin
grid_height = height - 2*margin

# Create the document
d = document(width, height, 'pt')

Grid Definition

The grid is defined through the number of points on the x and y axis. In the next step the coordinates for each point are calculated. This is done with the linspace() function from Numpy (np). It distributes the points on a given range, in this case the size of the grid. It also takes the margin into account.

# Number of points per row 
# (number of cells = row -1)
grid_x = 6
grid_y = 6

# Create coordinates
coords_x = np.linspace(margin, margin+grid_width, grid_x)
coords_y = np.linspace(margin, margin+grid_height, grid_y)

print(coords_x)
print(coords_y)
[ 10.  86. 162. 238. 314. 390.]
[ 10.  86. 162. 238. 314. 390.]

Draw points (circles) on the grid

The coordinates of the points are defined in the lists coords_x and coords_y. These can be accessed via their index, starting from 0. This means the point in the top left corner has the coordinates coords_x[0], coords_y[0], and the point in the bottom right corner has the coordinates coords_x[5], coords_y[5] (in a grid with 6 lines / 5 cells).

# Add a page to the document
page = d.addpage()

# Call the function to draw a grid
# As input it takes the list of coordinates defined above
draw_grid(page, coords_x, coords_y)

# Draw circles
fig = shape().fill(rgb(255, 0, 0)).nostroke().circle(coords_x[0], coords_y[1], 5)
page.place(fig)

fig = shape().fill(rgb(0, 255, 0)).nostroke().circle(coords_x[2], coords_y[0], 5)
page.place(fig)

fig = shape().fill(rgb(0, 0, 255)).nostroke().circle(coords_x[5], coords_y[4], 5)
page.place(fig)


# Feed the page into the show() function to display it inside the notebook
show(page)
_images/flat_02_points_10_0.svg