Drag the points. This is a triangle filler that works using three clones, rather than filling in a triangle using pen. There is no pen in this project. TurboWarp: https://turbowarp.org/605468072/fullscreen?hqpen&offscreen&limitless To create any triangle possible, we need two degrees of freedom. This is because, to create any triangle given that we can apply translations, rotations, and dilations afterward, we just need to be able to create a triangle with any three angles that we specify. If we have two angles, there is only a single value that the third angle of the triangle can be, since the three angles must add to 180 degrees. The problem is, if we created a costume for every single possible combination of two-angled triangles, we would either get a stupidly massive costume count, or extreme inaccuracy. My solution is to have just one degree of freedom, where the costumes are a triangle between (0,0), (1,0), and a point moving along a unit semicircle. This creates a range of isosceles triangles. From here, I can express any triangle possible as a combination of three isosceles triangles on top of each other. In this case, to reduce artifacts as much as possible, I use 720 costumes – this allows for a maximum error of just a quarter of a degree. This is because I only need to cover the 180-degree arc to get the full set of possible isosceles triangles with a fourth of a degree step in the angle. If I did the same thing but had two angles of variability (which would mean I only require a single stamp per triangle, a 3x speedup), that would require 720*720*2 (multiplying by 2 to account for a reflected triangle) costumes, which comes out to a massive 1.0368 million costumes, just to get the same angular resolution that you see here. To create all of the sprites automatically, I created a Python script to write all of the SVG files. For each triangle, there is actually a triangle that looks exactly identical – either the triangle's vertices can go clockwise, or they can go counter-clockwise. This triangle filler only works for one direction – when the triangle is "reflected" in space, the "direction" in which the vertices curl inverts. The deal with this, I have to check whether the edge normals face inward or outward, and if they face outward, I need to invert the triangle direction so they face inward. I do this by taking each edge (AB, BC, and CA), rotating by 90° to get unnormalized normal vectors ([x,y] --> [-y, x]), then taking the vectors going from the midpoint of each segment to the centroid of the triangle, dotting those vectors with the normal vectors and summing the dot products. The sign of this is the inversion of the triangle.