xxxxxxxxxx
93
// Dusa code with commentary: https://dusa.rocks/#jsonz=dVTtbtMwFH2VQ_djm5S1Szp-EDFQ9yFUxCaqwWikSpOTeK1ZYme2wygfD8Oz8GJcO-mariOqKufc4-N7z73Oz57txT1VcdkLernK6pJLh-zgHZc100tEh9ERztgSL2OMJeyCw9hlwaFucc01w4Uq5N8_eiZ3cKrKquCW53gQdoHq5VcTY2FtZeLBgOfCKt13YF_p-UCr1IiyVNIMzB232YKbwSt7r0e377-UM0l6aS0KKyTGl59uPn74fIWqqM0T_GJ8SYFSyK3Ip_HF-RWsKLnxajhn2QJGFbUVSiJTWnNTKZkbWAUGrR6atC8fSQZ7C645IccID_dnUsicf6dlf7Xc8ycTIdxHfIAGvAwIeIOw35x7we44KlUs504xXaKqLSU5R0iokJZ2gbvc7muWayat28TwC6lbHLjHLXJCsplckYhxELpf2kcHTeHBrN_BMsJC5F0od6QQrE3xjN8KyX1z51rkTV7GJeagx10P3g3Wpp0xibmaUcmFZY0pzfKJKQ3YMSVTSucY4zsmEOYt9nyTcDXFtOPiOFgfPHHBG9wErdi0o7J8opIg-a_KjQs_qiRt9afUF6uZqymMoWSxpOmQ32i3WbCKNPdqQ_-MtlmuqTgSO0iZoTk3IifbuLE0HH49xiSkdFYetEmNpjihrNq3kylGyb5LciZBzzrB0BWJSRQ8DURNYNgGOg7606ZhgI4fHkvCbXLkydEG2WNJtE0eevJwg-yxZJUGlXV83Fw-UvVZjJI1lETrJE661KGnnnSpQ6JSO3ZulU5F6-vYd5aG0wbuD69xuN2xKG4uj7u-mt_Xgm419ZC6ogWT84ITP-clk5uizygNY-RK7lrQJ8zP_frOkppSMCUrCurzPdOcrYTantLsop28LSO9jxs2ehfX5fodj7LMRUcsWCOpR9Jgk5d5NOvwco_kDc99LEmG9hGJULIveqbqoxhS4RvXVmSsgNJYKC1-KGnpraCvgll3ZVXBWVPBddBFdltoghfH9Nbv_f4H
const NUM_COLS = 12;
const NUM_ROWS = 50;
const BOX_SIZE = 50;
const SHAPE_SCALE = BOX_SIZE / 10 / 1.5;
const WIDTH = BOX_SIZE * NUM_COLS;
const HEIGHT = BOX_SIZE * (NUM_ROWS + 1)
const MOLNAR = new Dusa(`
#builtin INT_PLUS plus
#builtin INT_MINUS minus
#builtin INT_TIMES times
delta 10.
delta (minus N 1) :- delta N, N > 1.
index ${NUM_COLS}.
index (minus N 1) :- index N, N > 1.
# a | b
# -----
# d | c
quadrant a -1 -1 b.
quadrant b 1 -1 c.
quadrant c 1 1 d.
quadrant d -1 1 a.
coord I x Q is? (times SX X) :- index I, quadrant Q SX _ _, delta X.
coord I y Q is? (times SY Y) :- index I, quadrant Q _ SY _, delta Y.
side I Q1 is (minus (times AX BY) (times BX AY)) :-
quadrant Q1 _ _ Q2,
quadrant Q2 _ _ Q3,
coord I x Q1 is X1, coord I y Q1 is Y1,
coord I x Q2 is X2, coord I y Q2 is Y2,
coord I x Q3 is X3, coord I y Q3 is Y3,
AX == minus X2 X1, AY == minus Y2 Y1,
BX == minus X3 X1, BY == minus Y3 Y1.
sqarea I Q is (times X X Y Y) :-
coord I x Q is X, coord I y Q is Y.
#forbid side I Q is Det, Det < 0.
#demand side I Q is 0.
#forbid
sqarea I a is Aa, sqarea I b is Ab,
sqarea I c is Ac, sqarea I d is Ad,
plus Aa Ab Ac Ad < 30.
#forbid coord I D Q is V, coord I D Q' is V, Q != Q'.
`).solve();
function setup() {
createCanvas(WIDTH, HEIGHT);
background(253, 65, 41);
noFill();
stroke(255);
}
let row = 0;
function draw() {
if (row === NUM_ROWS) return;
const sol = MOLNAR.next();
if (sol.done) return;
const base_y = (row + 1) * BOX_SIZE;
for (let col = 0; col < NUM_COLS; col++) {
const base_x = col * BOX_SIZE;
beginShape();
vertex(
base_x + SHAPE_SCALE * sol.value.get("coord", col, { name: "x" }, { name: "a" }),
base_y + SHAPE_SCALE * sol.value.get("coord", col, { name: "y" }, { name: "a" }),
);
vertex(
base_x + SHAPE_SCALE * sol.value.get("coord", col, { name: "x" }, { name: "b" }),
base_y + SHAPE_SCALE * sol.value.get("coord", col, { name: "y" }, { name: "b" }),
);
vertex(
base_x + SHAPE_SCALE * sol.value.get("coord", col, { name: "x" }, { name: "c" }),
base_y + SHAPE_SCALE * sol.value.get("coord", col, { name: "y" }, { name: "c" }),
);
vertex(
base_x + SHAPE_SCALE * sol.value.get("coord", col, { name: "x" }, { name: "d" }),
base_y + SHAPE_SCALE * sol.value.get("coord", col, { name: "y" }, { name: "d" }),
);
endShape(CLOSE);
}
row += 1;
}