The translate object moves a graphical element to a new position. But it's not moving from 0,0 but relative from the last drawn object. This is evaluated not from top to bottom or left to right but from the order in which the programmer developed the program, so from what they wrote first. Deleted objects created during development are not garbage collected, so this is relative to objects that are no longer visible in code. Two identical looking source codes will come up with different results.
Ok, so this was (obviously) my mistake. Each gemhead object has a state containing data used to draw stuff. If you attach a translate to it, that changes a translation matrix stored IN THE GEMHEAD and NOT passed out the bottom of the translate object. Every translate object changes the matrix, cumulatively. The way to keep translations separate is to have separate gemheads for each individually translated object.
Welcome to post.lurk.org, an instance for discussions around cultural freedom, experimental, new media art, net and computational culture, and things like that.