Context
As part of my studies under José Luis García del Castillo y López in computational design, I worked on a Lissajous curve generator for my final project.
Lissajous curves are typically denoted with the following parametric equations:
such that you describe the superposition of two oscillatory forms in x and y determined at different angular frequencies (a and b).
Immediately I was drawn to the repeatable forms and seemingly infinite combinations. I wanted to see if it would be possible to extend the generator to cover other basic shapes such as squares and triangles as well as what I call ‘compound shapes’ — meaning the curve that is generated at the intersection of two basic shapes.
Dictionary
For the rest of the write-up I will be referring to the following terms:
1. Generators: the shapes that are being traced
2. Trays: the wrapper that the generators are placed into
4. Basic shapes: circles, triangles, squares
5. Compound shapes: the shape that is being generated at the intersection of two basic shapes
Programs and tools used
The project was created entirely in Java through Processing. Most of the code was written by myself with the aid of ChatGPT for help debugging. The Coding Train was also recommended to me and was very helpful in understanding the basics of Java. One of the next upgrades that I’d like to do for the program would be to move it to p5.js so that other people can interact with the program. A huge thank you to the Processing documentation website, Joseph Maa, and Kevin Kang for sitting with me and pair debugging.
Video walkthrough
The demo shows the randomization via randomizing of basic shapes as well as being able to drag any compound shape into a generator tray.
Stills of the program
Final completed program that showcases the compound shape integration.
Screenshot showing the bug that took me two weeks to figure out. The adjacent cell to any compound generator was somehow connected to the compound shape itself. I thought that the problem had to do with the two cells sharing an array, the generator tray and the cell orthogonally adjacent to it but when I was debugging it was returning different IDs. Instead of trying to reuse the same generator tray array, I ended up just having a custom array that holds the custom curves and that fixed it.
An exploration that I was trying to complete with 3d shapes instead of 2d euclidean geometry. I couldn’t quite figure out how the point would trace the actual sphere so I ended up not using this idea. In the future I think it’d be really neat to have the equivalent for all shapes though I’m not sure what would happen with the compound shapes. I think that they would probably start to become non-manifold which would break the program.
During debugging I accidentally broke the shapes but ended up with this really interesting half filled shapes.