// This program was part of an April Fool's joke that I posted in April 2011.
// see https://futureboy.us/temp/pigraph.html
//
// This is an implementation of Tupper's "self-referential" formula in Frink.
// See:
// http://en.wikipedia.org/wiki/Tupper%27s_self-referential_formula
//
// This program reads in a (black and white) graphic from an image file
// and converts it to a number that can be plotted with Tupper's formula,
// appropriately modified for width and height. Note that the equation I use
// below is actually a simplified version of Tupper's formula that just plots
// each pixel directly.
f = new image["file:copyright.png"]
width = f.getWidth[]
height = f.getHeight[]
println["image is $width x $height"]
num = 0
for x = width-1 to 0 step -1
for y = 0 to height-1
{
num = num * 2
if f.getPixelGrayInt[x,y] < 128
num = num + 1
}
num = num*height
println["n = $num"]
println["Graph the points"]
println[" 0 <= x < $width,"]
println[" n <= y < n+$height,"]
println[" where"]
println[" 1/2 > floor(mod(floor(y/$height)*2^(-$height*floor(x)-mod(floor(y), $height)),2))"]
// Now graph the number again just to make sure everything went right.
g = new graphics
for x=0 to width-1
for y = num to num+height-1
{
// v = floor[(floor[y/height] 2^(-height floor[x] - floor[y] mod height)) mod 2]
v = ((y/height) * 2^(-height x - (y mod height))) mod 2
if v >= 1
g.fillRectCenter[x,-y,1,1]
}
g.show[]