If you are going to draw so many glasses that you fill the screen, then you probably do not want to make a list of them or remember everything that you painted.
What you want to do is create a pseudo-random, reversible mapping between points. Call the map E(x,y) . Then you can generate all the points (x,y) in the scan line or in another order, and then for each point (x,y) you draw E(x,y) on the screen. By making sure that the mapping is reversible, you guarantee that each unique (x,y) maps to a unique E(x,y) , so your every point will be different.
One common way to create a function of type E(x,y) is to use the Feistel structure: https://en.wikipedia.org/wiki/Feistel_cipher
This is used to create many cryptographic ciphers such as DES.
In your case, you can do this starting with a good integer hash function H(x) , then set W = screen width and H = screen height, and N = number of rounds before use (5ish will do), you can do your function like this (pseudo code, not python, sorry):
function E(x,y) for (i = 1 to N) x = (x+(H(y)%W)) % W; y = (y+(H(x)%H)) % H return (x,y)
Please note that each step is easily reversible. If you want to cancel y = (y+(H(x)%H)) % H , you can just do y = (y-(H(x)%H)) % H (this is pseudocode, so I can pretend that the module operator is working correctly with negative numbers).
Although the function is obviously reversible, since each step is reversible, the Feistel structure provides good mixing, and your points will be displayed in good pseudo-random order if you use a good H hash.