Juggling props can be expensive! For example, quality cigar boxes range from $16 to $27. While durability and prop balance is important, these costs can be very steep for new jugglers. Furthermore, since juggling is still fairly niche, people who do not live near prop manufacturers often end up paying significant costs for shipping. As a result, many jugglers end up designing their own props. For this project, I wanted to design my own 3D printable cigar box. The design I based my project on is shown with this coral-motif juggling club.
In order to create this fun design, I decided to use Voronoi diagrams on a randomly generated set of points. In order to compute a Voronoi diagram, I implemented Fortune’s algorithm. For my implementation, I wanted to design an algorithm which builds a 3D model from start to finish.
Fortune’s Algorithm
Fortune’s Algorithm is a sweep line algorithm to compute a Voronoi diagram for a set of points. The algorithm works by recognizing that for any position of the sweep line, the set of curves which are equidistant between sites and the sweepline only change whenever a vertex event is encountered. The algorithm functions by maintaining two data structures: the event queue of events to process and the sweepline status which tracks the order of parabolas on the beachline. The algorithm tracks two types of events: site events and vertex events. Whenever a site event is encountered, the algorithm deterimines where along the beachline to insert the new arc. It then splits the old arc into an upper and lower segment and checks both segements for new vertex events. A vertex event occurs whenever a parabola is shrunk to a single point by the adjacent parabolas on the beachline. When a vertex event occurs, the algorithm removes the shrunk arc, outputs the adjacent edges, and checks the above and below arcs for new vertex events.
My implementation of Fortune’s algorithm can be found here. The algorithm uses a SkipList to implement both the EventQueue and the SweepLine status. My implementation uses logical implementations of all geometric objects. For example, growing edges are represented by rays, and parabolas are represented by an Arc class. My implementation runs in O(nlog(n)) time to produce outputs similar to the following:

3D Modeling
After computing a Voronoi diagram, the next step was to create a 3D model. My initial goal was to automatically create an stl file which can be imported into any standard slicer program to generate a 3D printable model. While it isn’t too difficult to write stl files (the format only tracks triangles along the surface of the object), there are many details I would need to implement to make it happen. For example, after generating a Voronoi diagram, I would need to project each edge into both adjacent faces slightly and detect the new computed face with thicker edges. The resulting diagram would need to be triangulated to produce an stl file. On its own, this algorithm is not particularly difficult, but there are many details that could take a signficant amount of time to get correct.
In the end, I decided to model one cigar box by hand using Autodesk Inventor. The hand modeling process took approximately two hours to complete, but the resulting 3D model was definitely worth the time. The process essentially boiled down to a repetitive sequence of cutting back a face and adding parallel constraints and dimensioning information.

Results
The resulting 3D model was cut in half and 3D printed into parts. The two prints took seven and nine hours respectively, and the cost of printing (using the 3D printers at RIT’s Construct facility) was a total of $8.70 factoring in 25 grams of free printing available to RIT students. It is notable, however, that my resulting model was printed too large because I used Amazon’s package size rather than Henry’s cigar box sizing as a refernce. The resulting 3D print used 303 grams of PLA plastic and was 8″ x 5″ x 3″. I eventually would like to print multiple of these cigar boxes at the correct size and weight of 220 grams for 7.1″ x 4.7″ x 2.4″. Not only will this reduce the cost of printing the cigar boxes, but it will also make them more usable.
Despite the accidental oversizing of the resulting print, the cigar box I printed has held up well so far. The block is admittedly somewhat more slippery to juggle than I initially expected, but this might be easily fixed by sanding the sides slightly to create a rougher surface between two boxes. To demonstrate the box in action, here is a short clip of my first time playing with the 3D printed cigar box:
Future Directions
This project turned out surprisingly well. I’m increibly happy with the resulting 3D print, and I really love the design of my new cigar box. I’m super excited to show off the cigar box at juggling club, and I even think that it could potentially be a marketable product. I’m looking forward to stress testing my box with more intensive juggling.
In the future, I hope to automate the process of building a 3D model from a randomly generated Voronoi diagram. I also would like to play around with other fun designs, such as Delaunay triangulations or random fractals. In terms of production, I’d like to figure out how to automatically determine the necessary infill required to achieve the correct weight for a cigar box given some 3D design. I’d also like to experiment with different fabrication techniques such as laser cutting wood layers to construct boxes that have a very classical feeling while keeping the fun and unique design.