colorMode(HSB, 360, 100, 100, 100);
w = sqrt(2) * max(width, height);
separateGrid(x, y, d, objs);
rect(offset,offset,width-offset*2,height-offset*2);
translate(width / 2, height / 2);
translate(-w / 2, -w / 2);
obj.t = (obj.t + 1 / 150) % 1;
if (abs(obj.t - prev_t) < 1 / 2) {
let t = easeInOutElastic(obj.t);
drawTruchetPattern(t * obj.d, 0, 0, obj.d, obj.n);
drawTruchetPattern(-obj.d + t * obj.d, 0, 0, obj.d, obj.n2);
obj.n2 = int(random(40));
function easeInOutCirc(x) {
? (1 - Math.sqrt(1 - Math.pow(2 * x, 2))) / 2
: (Math.sqrt(1 - Math.pow(-2 * x + 2, 2)) + 1) / 2;
function easeInOutElastic(x) {
const c5 = (2 * Math.PI) / 4.5;
? -(Math.pow(2, 20 * x - 10) * Math.sin((20 * x - 11.125) * c5)) / 2
: (Math.pow(2, -20 * x + 10) * Math.sin((20 * x - 11.125) * c5)) / 2 + 1;
function separateGrid(x, y, d, arr) {
let sepNum = int(random([1, 2, 3]));
for (let i = x; i < x + d - 1; i += w) {
for (let j = y; j < y + d - 1; j += w) {
if ((random(100) < 95 && w > width / 3) || d > width ) {
separateGrid(i, j, w, arr);
a: (int(random(4)) * 360) / 4,
function drawTruchetPattern(
pattern_size = ceil(pattern_size);
let colors = [color(0, 0, 20), color(0, 0, 90)];
let d = pattern_size / 6;
translate(pattern_center_x, pattern_center_y);
rect(0, 0, pattern_size, pattern_size);
circle(+pattern_size / 2, -pattern_size / 2 + d * 1.5, d);
circle(-pattern_size / 2 + d * 1.5, +pattern_size / 2, d);
circle(+pattern_size / 2, +pattern_size / 2 - d * 1.5, d);
circle(+pattern_size / 2 - d * 1.5, +pattern_size / 2, d);
arc(-pattern_size / 2, -pattern_size / 2, d * 5 * 2, d * 5 * 2, 0, 90);
arc(-pattern_size / 2, -pattern_size / 2, d * 4 * 2, d * 4 * 2, 0, 90);
arc(-pattern_size / 2, -pattern_size / 2, d * 2 * 2, d * 2 * 2, 0, 90);
arc(-pattern_size / 2, -pattern_size / 2, d * 1 * 2, d * 1 * 2, 0, 90);
rect(0, 0, pattern_size, pattern_size);
rect(-pattern_size / 2, -pattern_size / 2, pattern_size, d * 2);
circle(-pattern_size / 2 + d * 1.5, pattern_size / 2, d);
circle(+pattern_size / 2 - d * 1.5, pattern_size / 2, d);
circle(-pattern_size / 2, pattern_size / 2 - d * 1.5, d);
circle(+pattern_size / 2, pattern_size / 2 - d * 1.5, d);
for (let i = 0; i < 3; i++) {
let x = map(i, 0, 2, -pattern_size / 2, pattern_size / 2);
let y = -pattern_size / 2;
rect(0, 0, pattern_size, pattern_size);
for (let i = 0; i < 2; i++) {
arc(-pattern_size / 2, -pattern_size / 2, d * 2 * 2, d * 2 * 2, 0, 90);
arc(-pattern_size / 2, -pattern_size / 2, d * 1 * 2, d * 1 * 2, 0, 90);
arc(0, pattern_size / 2, d * 2 * 2, d * 2 * 2, 180, 360);
circle(-pattern_size / 2, +pattern_size / 2 - d * 1.5, d);
circle(+pattern_size / 2, +pattern_size / 2 - d * 1.5, d);
arc(0, pattern_size / 2, d * 1 * 2, d * 1 * 2, 180, 360);
rect(0, 0, pattern_size, pattern_size);
for (let i = 0; i < 4; i++) {
arc(-pattern_size / 2, -pattern_size / 2, d * 2 * 2, d * 2 * 2, 0, 90);
arc(-pattern_size / 2, -pattern_size / 2, d * 1 * 2, d * 1 * 2, 0, 90);
rect(0, 0, pattern_size, pattern_size);
for (let i = 0; i < 4; i++) {
circle(-pattern_size / 2, pattern_size / 2 - d * 1.5, d);
circle(-pattern_size / 2 + d * 1.5, pattern_size / 2, d);
rect(0, 0, pattern_size, pattern_size);
for (let j = 0; j < 5; j++) {
for (let i = 0; i < 5; i++) {
let x = map(i, 0, 4, -pattern_size / 2, pattern_size / 2);
let y = map(j, 0, 4, -pattern_size / 2, pattern_size / 2);
rect(0, 0, pattern_size, pattern_size);
for (let j = 0; j < 5; j++) {
for (let i = 0; i < 5; i++) {
let x = map(i, 0, 4, -pattern_size / 2, pattern_size / 2);
let y = map(j, 0, 4, -pattern_size / 2, pattern_size / 2);
((i == 0 || i == 4 || j == 0 || j == 4) && n % 2 == 1)
rect(0, 0, pattern_size, pattern_size);
for (let j = 0; j < 5; j++) {
for (let i = 0; i < 5; i++) {
let x = map(i, 0, 4, -pattern_size / 2, pattern_size / 2);
let y = map(j, 0, 4, -pattern_size / 2, pattern_size / 2);
if ((i == 0 || i == 4 || j == 0 || j == 4) && n % 2 == 1) {
rect(0, 0, pattern_size, pattern_size);
for (let j = 0; j < 3; j++) {
for (let i = 0; i < 3; i++) {
let x = map(i, 0, 2, -pattern_size / 2, pattern_size / 2);
let y = map(j, 0, 2, -pattern_size / 2, pattern_size / 2);
if (!(i == 1 && j == 1)) circle(x, y, d * 2);
rect(0, 0, pattern_size, pattern_size);
for (let j = 0; j < 2; j++) {
for (let i = 0; i < 3; i++) {
let x = map(i, 0, 2, -pattern_size / 2, pattern_size / 2);
let y = map(j, 0, 2, -pattern_size / 2, pattern_size / 2);
if (!(i == 1 && j == 1)) circle(x, y, d * 2);
rect(-pattern_size / 2, +pattern_size / 2 - d, pattern_size, d);
circle(-pattern_size / 2 + d * 1.5, pattern_size / 2, d);
circle(pattern_size / 2 - d * 1.5, pattern_size / 2, d);
rect(0, 0, pattern_size, pattern_size);
for (let j = 0; j < 3; j++) {
for (let i = 0; i < 3; i++) {
let x = map(i, 0, 2, -pattern_size / 2, pattern_size / 2);
let y = map(j, 0, 2, -pattern_size / 2, pattern_size / 2);
rect(0, 0, pattern_size, pattern_size);
for (let j = 1; j < 2; j++) {
for (let i = 0; i < 3; i++) {
let x = map(i, 0, 2, -pattern_size / 2, pattern_size / 2);
let y = map(j, 0, 2, -pattern_size / 2, pattern_size / 2);
if (!(i == 1 && j == 1)) circle(x, y, d * 2);
rect(-pattern_size / 2, -pattern_size / 2, pattern_size, d);
rect(-pattern_size / 2, +pattern_size / 2 - d, pattern_size, d);
circle(-pattern_size / 2 + d * 1.5, -pattern_size / 2, d);
circle(pattern_size / 2 - d * 1.5, -pattern_size / 2, d);
circle(-pattern_size / 2 + d * 1.5, pattern_size / 2, d);
circle(pattern_size / 2 - d * 1.5, pattern_size / 2, d);
rect(0, 0, pattern_size, pattern_size);
for (let j = 0; j < 2; j++) {
for (let i = 0; i < 3; i++) {
let x = map(i, 0, 2, -pattern_size / 2, pattern_size / 2);
let y = map(j, 0, 2, -pattern_size / 2, pattern_size / 2);
rect(-pattern_size / 2, +pattern_size / 2 - d, pattern_size, d);
circle(-pattern_size / 2 + d * 1.5, pattern_size / 2, d);
circle(pattern_size / 2 - d * 1.5, pattern_size / 2, d);
rect(0, 0, pattern_size, pattern_size);
rect(-pattern_size / 2, -pattern_size / 2 + d, pattern_size, d);
for (let i = 0; i < 4; i++) {
(cos(i * 90) * pattern_size) / 2,
(sin(i * 90) * pattern_size) / 2,
(cos(i * 90) * pattern_size) / 2,
(sin(i * 90) * pattern_size) / 2,
rect(0, 0, pattern_size, pattern_size);
for (let j = 1; j < 2; j++) {
for (let i = 0; i < 3; i++) {
let x = map(i, 0, 2, -pattern_size / 2, pattern_size / 2);
let y = map(j, 0, 2, -pattern_size / 2, pattern_size / 2);
rect(-pattern_size / 2, -pattern_size / 2, pattern_size, d);
rect(-pattern_size / 2, +pattern_size / 2 - d, pattern_size, d);
circle(-pattern_size / 2 + d * 1.5, -pattern_size / 2, d);
circle(pattern_size / 2 - d * 1.5, -pattern_size / 2, d);
circle(-pattern_size / 2 + d * 1.5, pattern_size / 2, d);
circle(pattern_size / 2 - d * 1.5, pattern_size / 2, d);
rect(0, 0, pattern_size, pattern_size);
for (let i = 0; i < 4; i++) {
(cos(i * 90) * pattern_size) / 2,
(sin(i * 90) * pattern_size) / 2,
(cos(i * 90) * pattern_size) / 2,
(sin(i * 90) * pattern_size) / 2,
rect(0, 0, pattern_size, pattern_size);
arc(-pattern_size / 2, -pattern_size / 2, d * 5 * 2, d * 5 * 2, 0, 90);
circle(-pattern_size / 2 + d * 1.5, pattern_size / 2, d);
circle(+pattern_size / 2, -pattern_size / 2 + d * 1.5, d);
circle(pattern_size / 2, pattern_size / 2, d * 2);
circle(-pattern_size / 2, -pattern_size / 2, d * 2);
circle(-pattern_size / 2, -pattern_size / 2 + d * 3, d * 2);
circle(-pattern_size / 2 + d * 3, -pattern_size / 2, d * 2);
rect(0, 0, pattern_size, pattern_size);
arc(-pattern_size / 2, -pattern_size / 2, d * 2 * 2, d * 2 * 2, 0, 90);
arc(+pattern_size / 2, -pattern_size / 2, d * 2 * 2, d * 2 * 2, 90, 180);
-pattern_size / 2 + d * 3,
-pattern_size / 2 + d * 3,
arc(0, 0, d * 2 * 2, d * 2 * 2, 180, 360);
arc(0, +pattern_size / 2, d * 2 * 2, d * 2 * 2, 180, 360);
arc(-pattern_size / 2, -pattern_size / 2, d * 1 * 2, d * 1 * 2, 0, 90);
arc(+pattern_size / 2, -pattern_size / 2, d * 1 * 2, d * 1 * 2, 90, 180);
-pattern_size / 2 + d * 3,
-pattern_size / 2 + d * 3,
arc(0, 0, d * 1 * 2, d * 1 * 2, 180, 360);
arc(0, +pattern_size / 2, d * 1 * 2, d * 1 * 2, 180, 360);
rect(0, 0, pattern_size, pattern_size);
arc(-pattern_size / 2, -pattern_size / 2, d * 5 * 2, d * 5 * 2, 0, 90);
circle(-pattern_size / 2 + d * 1.5, pattern_size / 2, d);
circle(+pattern_size / 2, -pattern_size / 2 + d * 1.5, d);
circle(+pattern_size / 2 - d * 1.5, pattern_size / 2, d);
circle(+pattern_size / 2, +pattern_size / 2 - d * 1.5, d);
circle(-pattern_size / 2, -pattern_size / 2, d * 2);
circle(-pattern_size / 2, -pattern_size / 2 + d * 3, d * 2);
circle(-pattern_size / 2 + d * 3, -pattern_size / 2, d * 2);
rect(0, 0, pattern_size, pattern_size);
arc(-pattern_size / 2, -pattern_size / 2, d * 2 * 2, d * 2 * 2, 0, 90);
circle(+pattern_size / 2 - d * 1.5, -pattern_size / 2, d);
circle(+pattern_size / 2, -pattern_size / 2 + d * 1.5, d);
-pattern_size / 2 + d * 3,
-pattern_size / 2 + d * 3,
arc(0, 0, d * 2 * 2, d * 2 * 2, 180, 360);
arc(0, +pattern_size / 2, d * 2 * 2, d * 2 * 2, 180, 360);
arc(-pattern_size / 2, -pattern_size / 2, d * 1 * 2, d * 1 * 2, 0, 90);
arc(+pattern_size / 2, -pattern_size / 2, d * 1 * 2, d * 1 * 2, 90, 180);
-pattern_size / 2 + d * 3,
-pattern_size / 2 + d * 3,
arc(0, 0, d * 1 * 2, d * 1 * 2, 180, 360);
arc(0, +pattern_size / 2, d * 1 * 2, d * 1 * 2, 180, 360);
rect(0, 0, pattern_size, pattern_size);
for (let i = 0; i < 4; i++) {
(cos(i * 90) * pattern_size) / 2,
(sin(i * 90) * pattern_size) / 2,
(cos(i * 90) * pattern_size) / 2,
(sin(i * 90) * pattern_size) / 2,
rect(pattern_size / 2 - d * 2, -pattern_size / 2, d, pattern_size);
circle(-pattern_size / 2, -pattern_size / 2 + d * 1.5, d);
circle(-pattern_size / 2, +pattern_size / 2 - d * 1.5, d);
rect(0, 0, pattern_size, pattern_size);
rect(-pattern_size / 2, -pattern_size / 2, pattern_size, d * 2);
rect(-pattern_size / 2, -pattern_size / 2 + d * 4, pattern_size, d);
circle(-pattern_size / 2 + d * 1.5, pattern_size / 2, d);
circle(+pattern_size / 2 - d * 1.5, pattern_size / 2, d);
for (let i = 0; i < 3; i++) {
let x = map(i, 0, 2, -pattern_size / 2, pattern_size / 2);
let y = -pattern_size / 2;
rect(0, 0, pattern_size, pattern_size);
for (let i = 0; i < 4; i++) {
arc(-pattern_size / 2, -pattern_size / 2, d * 2 * 2, d * 2 * 2, 0, 90);
arc(-pattern_size / 2, -pattern_size / 2, d * 1 * 2, d * 1 * 2, 0, 90);
arc(0, d, d * 2 * 2, d * 2 * 2, 180, 360);
rect(-d * 1.5, d * 2, d, d * 2);
rect(+d * 1.5, d * 2, d, d * 2);
arc(0, d, d * 1 * 2, d * 1 * 2, 180, 360);
rect(0, 0, pattern_size, pattern_size);
circle(+pattern_size / 2 - d * 1.5, -pattern_size / 2, d);
circle(+pattern_size / 2, -pattern_size / 2 + d * 1.5, d);
circle(-pattern_size / 2 + d * 1.5, -pattern_size / 2, d);
circle(-pattern_size / 2, -pattern_size / 2 + d * 1.5, d);
-pattern_size / 2 + d * 3,
-pattern_size / 2 + d * 3,
arc(0, 0, d * 2 * 2, d * 2 * 2, 180, 360);
arc(0, +pattern_size / 2, d * 2 * 2, d * 2 * 2, 180, 360);
arc(-pattern_size / 2, -pattern_size / 2, d * 1 * 2, d * 1 * 2, 0, 90);
arc(+pattern_size / 2, -pattern_size / 2, d * 1 * 2, d * 1 * 2, 90, 180);
-pattern_size / 2 + d * 3,
-pattern_size / 2 + d * 3,
arc(0, 0, d * 1 * 2, d * 1 * 2, 180, 360);
arc(0, +pattern_size / 2, d * 1 * 2, d * 1 * 2, 180, 360);
rect(0, 0, pattern_size, pattern_size);
for (let i = 0; i < 4; i++) {
(cos(i * 90) * pattern_size) / 2,
(sin(i * 90) * pattern_size) / 2,
(cos(i * 90) * pattern_size) / 2,
(sin(i * 90) * pattern_size) / 2,
circle(-pattern_size / 2, -pattern_size / 2 + d * 1.5, d);
circle(-pattern_size / 2, +pattern_size / 2 - d * 1.5, d);
rect(0, 0, pattern_size, pattern_size);
for (let i = 0; i < 4; i++) {
arc(-pattern_size / 2, -pattern_size / 2, d * 2 * 2, d * 2 * 2, 0, 90);
arc(-pattern_size / 2, -pattern_size / 2, d * 1 * 2, d * 1 * 2, 0, 90);
arc(0, d, d * 2 * 2, d * 2 * 2, 180, 360);
rect(-d * 1.5, d * 2, d, d * 2);
rect(+d * 1.5, d * 2, d, d * 2);
arc(0, d, d * 1 * 2, d * 1 * 2, 180, 360);
rect(0, 0, pattern_size, pattern_size);
arc(-pattern_size / 2, -pattern_size / 2, d * 5 * 2, d * 5 * 2, 0, 90);
arc(-pattern_size / 2, -pattern_size / 2, d * 4 * 2, d * 4 * 2, 0, 90);
for (let i = 0; i < 4; i++) {
arc(-pattern_size / 2, -pattern_size / 2, d * 2 * 2, d * 2 * 2, 0, 90);
arc(-pattern_size / 2, -pattern_size / 2, d * 1 * 2, d * 1 * 2, 0, 90);
rect(0, 0, pattern_size, pattern_size);
arc(0, -pattern_size / 2, d * 2 * 2, d * 2 * 2, 0, 180);
arc(0, -pattern_size / 2, d * 2 * 1, d * 2 * 1, 0, 180);
arc(0, +pattern_size / 2, d * 2 * 2, d * 2 * 2, 180, 270);
arc(0, +pattern_size / 2, d * 2 * 1, d * 2 * 1, 180, 270);
rect(-pattern_size / 2, -pattern_size / 2 + d, pattern_size / 2, d);
rect(0, +pattern_size / 2 - d * 2, pattern_size / 2, d);
circle(-pattern_size / 2, pattern_size / 2 - d * 1.5, d);
circle(+pattern_size / 2, -pattern_size / 2 + d * 1.5, d);
circle(d * 1.5, pattern_size / 2, d);
rect(0, 0, pattern_size, pattern_size);
circle(+pattern_size / 2, -pattern_size / 2 + d * 1.5, d);
arc(-pattern_size / 2, -pattern_size / 2, d * 5 * 2, d * 5 * 2, 0, 90);
arc(-pattern_size / 2, -pattern_size / 2, d * 4 * 2, d * 4 * 2, 0, 90);
for (let i = 0; i < 4; i++) {
rect(0, 0, pattern_size, pattern_size);
for (let i = 0; i < 2; i++) {
arc(-pattern_size / 2, -pattern_size / 2, d * 2 * 2, d * 2 * 2, 0, 90);
arc(-pattern_size / 2, -pattern_size / 2, d * 1 * 2, d * 1 * 2, 0, 90);
arc(0, d, d * 2 * 2, d * 2 * 2, 180, 360);
rect(-d * 1.5, d * 2, d, d * 2);
rect(+d * 1.5, d * 2, d, d * 2);
circle(-pattern_size / 2, +pattern_size / 2 - d * 1.5, d);
circle(+pattern_size / 2, +pattern_size / 2 - d * 1.5, d);
arc(0, d, d * 1 * 2, d * 1 * 2, 180, 360);
rect(0, 0, pattern_size, pattern_size);
circle(-pattern_size / 2 + d * 1.5, pattern_size / 2, d);
circle(+pattern_size / 2, -pattern_size / 2 + d * 1.5, d);
rect(pattern_size / 2 - d * 2, -pattern_size / 2, d, pattern_size);
rect(-pattern_size / 2, pattern_size / 2 - d * 2, pattern_size, d);
rect(-pattern_size / 2, pattern_size / 2 - d * 2, pattern_size, d);
arc(-pattern_size / 2, -pattern_size / 2, d * 2 * 2, d * 2 * 2, 0, 90);
arc(-pattern_size / 2, -pattern_size / 2, d * 1 * 2, d * 1 * 2, 0, 90);
rect(0, 0, pattern_size, pattern_size);
circle(-pattern_size / 2 + d * 1.5, pattern_size / 2, d);
circle(+pattern_size / 2, -pattern_size / 2 + d * 1.5, d);
arc(pattern_size / 2, pattern_size / 2, d * 2 * 2, d * 2 * 2, 180, 270);
rect(-pattern_size / 2, -pattern_size / 2 + d, pattern_size / 2, d);
rect(-pattern_size / 2 + d, -pattern_size / 2, d, pattern_size / 2);
arc(pattern_size / 2, pattern_size / 2, d * 1 * 2, d * 1 * 2, 180, 270);
arc(-pattern_size / 2, 0, d * 2 * 2, d * 2 * 2, 0, 90);
arc(0, -pattern_size / 2, d * 2 * 2, d * 2 * 2, 0, 90);
arc(-pattern_size / 2, 0, d * 1 * 2, d * 1 * 2, 0, 90);
arc(0, -pattern_size / 2, d * 1 * 2, d * 1 * 2, 0, 90);
rect(0, 0, pattern_size, pattern_size);
circle(+pattern_size / 2, -pattern_size / 2 + d * 1.5, d);
circle(-pattern_size / 2 + d * 1.5, +pattern_size / 2, d);
arc(-pattern_size / 2, -pattern_size / 2, d * 5 * 2, d * 5 * 2, 0, 90);
arc(-pattern_size / 2, -pattern_size / 2, d * 4 * 2, d * 4 * 2, 0, 90);
for (let i = 0; i < 4; i++) {
rect(0, 0, pattern_size, pattern_size);
arc(0, -pattern_size / 2, d * 2 * 2, d * 2 * 2, 0, 180);
arc(0, -pattern_size / 2, d * 1 * 2, d * 1 * 2, 0, 180);
for (let i = 0; i < 4; i++) {
arc(-pattern_size / 2, -pattern_size / 2, d * 2 * 2, d * 2 * 2, 0, 90);
arc(-pattern_size / 2, -pattern_size / 2, d * 1 * 2, d * 1 * 2, 0, 90);
rect(0, 0, pattern_size, pattern_size);
arc(0, -pattern_size / 2, d * 2 * 2, d * 2 * 2, 0, 90);
arc(0, -pattern_size / 2, d * 2 * 1, d * 2 * 1, 0, 90);
arc(0, +pattern_size / 2, d * 2 * 2, d * 2 * 2, 180, 270);
arc(0, +pattern_size / 2, d * 2 * 1, d * 2 * 1, 180, 270);
rect(-pattern_size / 2, -pattern_size / 2 + d, pattern_size / 2, d);
rect(0, +pattern_size / 2 - d * 2, pattern_size / 2, d);
circle(-pattern_size / 2, pattern_size / 2 - d * 1.5, d);
circle(+pattern_size / 2, -pattern_size / 2 + d * 1.5, d);
circle(d * 1.5, pattern_size / 2, d);
circle(-d * 1.5, -pattern_size / 2, d);
rect(0, 0, pattern_size, pattern_size);
circle(+pattern_size / 2 - d * 1.5, -pattern_size / 2, d);
circle(+pattern_size / 2, -pattern_size / 2 + d * 1.5, d);
circle(-pattern_size / 2 + d * 1.5, -pattern_size / 2, d);
circle(-pattern_size / 2, -pattern_size / 2 + d * 1.5, d);
-pattern_size / 2 + d * 3,
-pattern_size / 2 + d * 3,
arc(0, 0, d * 2 * 2, d * 2 * 2, 180, 360);
arc(-pattern_size / 2, -pattern_size / 2, d * 1 * 2, d * 1 * 2, 0, 90);
arc(+pattern_size / 2, -pattern_size / 2, d * 1 * 2, d * 1 * 2, 90, 180);
-pattern_size / 2 + d * 3,
-pattern_size / 2 + d * 3,
arc(0, 0, d * 1 * 2, d * 1 * 2, 180, 360);
circle(d * 1.5, pattern_size / 2, d);
circle(-d * 1.5, pattern_size / 2, d);
rect(0, 0, pattern_size, pattern_size);
arc(0, -pattern_size / 2, d * 2 * 2, d * 2 * 2, 0, 180);
arc(0, -pattern_size / 2, d * 2 * 1, d * 2 * 1, 0, 180);
arc(0, +pattern_size / 2, d * 2 * 2, d * 2 * 2, 180, 270);
arc(0, +pattern_size / 2, d * 2 * 1, d * 2 * 1, 180, 270);
rect(0, +pattern_size / 2 - d * 2, pattern_size / 2, d);
circle(-pattern_size / 2, pattern_size / 2 - d * 1.5, d);
circle(-pattern_size / 2, -pattern_size / 2 + d * 1.5, d);
circle(+pattern_size / 2, -pattern_size / 2 + d * 1.5, d);
circle(d * 1.5, pattern_size / 2, d);
rect(0, 0, pattern_size, pattern_size);
for (let i = 0; i < 2; i++) {
arc(-pattern_size / 2, -pattern_size / 2, d * 2 * 2, d * 2 * 2, 0, 90);
arc(-pattern_size / 2, -pattern_size / 2, d * 1 * 2, d * 1 * 2, 0, 90);
rect(0, d * 1.5, pattern_size, d);
circle(d * 1.5, pattern_size / 2, d);
circle(-d * 1.5, pattern_size / 2, d);
rect(0, 0, pattern_size, pattern_size);
circle(+pattern_size / 2, -pattern_size / 2 + d * 1.5, d);
circle(-pattern_size / 2, -pattern_size / 2 + d * 1.5, d);
circle(+pattern_size / 2, +pattern_size / 2 - d * 1.5, d);
circle(-pattern_size / 2, +pattern_size / 2 - d * 1.5, d);
arc(0, pattern_size / 2, d * 2 * 2, d * 2 * 2, 180, 360);
arc(0, pattern_size / 2, d * 2 * 1, d * 1 * 2, 180, 360);
arc(0, -pattern_size / 2, d * 2 * 2, d * 2 * 2, 0, 180);
arc(0, -pattern_size / 2, d * 2 * 1, d * 1 * 2, 0, 180);
rect(0, 0, pattern_size, pattern_size);
circle(+pattern_size / 2, -pattern_size / 2 + d * 1.5, d);
circle(-pattern_size / 2 + d * 1.5, +pattern_size / 2, d);
arc(-pattern_size / 2, -pattern_size / 2, d * 5 * 2, d * 5 * 2, 0, 90);
arc(-pattern_size / 2, -pattern_size / 2, d * 4 * 2, d * 4 * 2, 0, 90);
arc(-pattern_size / 2, -pattern_size / 2, d * 2 * 2, d * 2 * 2, 0, 90);
arc(-pattern_size / 2, -pattern_size / 2, d * 1 * 2, d * 1 * 2, 0, 90);
circle(-pattern_size / 2, -pattern_size / 2 + d * 1.5, d);
circle(-pattern_size / 2 + d * 1.5, -pattern_size / 2, d);