# Lissajous table

• Here is some code to draw a Lissajous table.
Change the `func_x` and/or `func_y` (sin or cos) and/or add some value to the `delta` to get other curves.
Well, actually the curves are just polygons.

``````# ----------------------
#  lissajous table
# ----------------------
#  settings

cols = 12
rows = 8
cell_s = 80
r_factor = .8 # fraction of the cell size to have a gap between them

func_x = cos  # should be `sin` or `cos`
func_y = sin  # should be `sin` or `cos`
delta = 0 #pi/3  # some angle in radians

density = 360 # amount of points per cell – higher values make nicer curve approximations

# ----------------------
#  calculated settings

radius = (cell_s * r_factor) / 2
step = (2 * pi) / density

pw = cell_s * (cols + 1)
ph = cell_s * (rows + 1)

x_coords = { (col, d) : func_x(step * (col + 1) * d  + pi/2 + delta) * radius for col in range(cols) for d in range(density) }
y_coords = { (row, d) : func_y(step * (row + 1) * d  + pi/2) * radius for row in range(rows) for d in range(density) }

# ----------------------
#  function(s)

def draw_cell(pos, col, row):
cx, cy = pos
points = [(cx + x_coords[(col, f)], cy + y_coords[(row, f)]) for f in range(density)]
polygon(*points)

# ----------------------
#  drawings

newPage(pw, ph)
rect(0, 0, pw, ph)
fontSize(12)
translate(0, ph)
fill(1)
text('δ\n{0:.2f}°'.format(degrees(delta)), (cell_s * (1 - r_factor)/2, -20))

for col in range(1, cols+1):
cx = col * cell_s + cell_s * (1 - r_factor)/2
text('{0}\n{1}'.format(func_x.__name__, col), (cx, -20))

for row in range(1, rows + 1):
cy = row * cell_s + cell_s * (1 - r_factor)
text('{0}\n{1}'.format(func_y.__name__, row), (cell_s * (1 - r_factor)/2, -cy))

fill(None)
stroke(.5)
strokeWidth(1)

for col in range(cols):
for row in range(rows):
draw_cell((cell_s * col + cell_s * 1.5, - cell_s * row -cell_s * 1.5), col, row)
``````