### Alien art revisited

A look back at Alien art: (x ^ y) % 9 with an updated formula and a much bigger playfield.

```// LL 2021

const power = 12; // min=6 max=14 step=1
const mod = 62; // min=1 max=1000 step=1
const result=0; // min=0 max=50 step=1

const style = 3; // min=1 max=3 step=1 (Dots,Lines,Both)
const rotate = 1; // min=0 max=1 step=1 (No,Yes)

const grid = 2 ** power;

Canvas.setpenopacity(1);
const turtle = new Turtle();

function walk(i, t) {
const x = i % grid;
const y = (i / grid) | 0;
const r = 100 / grid;

if (getValue(x, y)) {
const xy = getXY(x, y);
if (Math.abs(xy.x) <= 100 && Math.abs(xy.y) <= 100) {
if (style & 2) {
for (var dy=-1; dy<=1; dy++) {
for (var dx=-1; dx<=1; dx++) {
if (!dx && !dy) continue;
if (x+dx >= 0 && x+dx < grid && y+dy >= 0 && y+dy < grid) {
if (getValue(x+dx, y+dy)) {
const xy2 = getXY(x+dx, y+dy);
turtle.jump(xy.x, xy.y);
turtle.goto(xy2.x, xy2.y);
}
}
}
}
}

if (style & 1) {
const steps = 4;
turtle.up();
for (var j=0; j<=steps; j++) {
const cx = xy.x + r * Math.cos(Math.PI*2 * j / steps + i * Math.PI/2);
const cy = xy.y + r * Math.sin(Math.PI*2 * j / steps + i * Math.PI/2);
turtle.goto(cx, cy);
turtle.down();
}
}
}
}

return i < grid * grid;
}

function getValue(x, y) {
return (((x*mod) ^ (y*mod)) % mod) == (result % mod);
}

function getXY(x, y) {
const size = rotate ? 284 : 200;
const px = (x / grid) * size - size / 2;
const py = (y / grid) * size - size / 2;
const rx = rotX(px, py, rotate * Math.PI/4);
const ry = rotY(px, py, rotate * Math.PI/4);
return { x:rx, y:ry };
}

function rotX(x, y, a) { return Math.cos(a) * x - Math.sin(a) * y; }
function rotY(x, y, a) { return Math.sin(a) * x + Math.cos(a) * y; }
```