colorFillProbability: 0.5,
horizontalHatchProbability: 0.5,
circlePatternProbability: 0.3,
wavyLinePatternProbability: 0.3,
polkaDotPatternProbability: 0.3,
backgroundGradientStart: '#ffffff',
backgroundGradientEnd: '#e0e0e0',
["#264653", "#2a9d8f", "#e9c46a", "#f4a261", "#e76f51"],
["#000000", "#333333", "#666666", "#999999", "#CCCCCC"],
["#ff6b6b", "#feca57", "#ff9ff3", "#48dbfb", "#1dd1a1"],
["#3f88c5", "#ffba08", "#f72585", "#4cc9f0", "#7209b7"],
["#6a0572", "#d90368", "#f49d37", "#04a777", "#f2f2f2"]
createCanvas(windowWidth, windowHeight);
function windowResized() {
resizeCanvas(windowWidth, windowHeight);
gui.add(settings, 'cols', 1, 10, 1).name('Colonnes').onChange(redrawCanvas);
gui.add(settings, 'rows', 1, 10, 1).name('Lignes').onChange(redrawCanvas);
gui.add(settings, 'colorFillProbability', 0, 1, 0.01).name('Probabilité de couleur').onChange(redrawCanvas);
gui.add(settings, 'stepNum', 3, 20, 1).name('Nombre de pas').onChange(redrawCanvas);
gui.add(settings, 'hatchProbability', 0, 1, 0.01).name('Probabilité de hachures').onChange(redrawCanvas);
gui.add(settings, 'horizontalHatchProbability', 0, 1, 0.01).name('Probabilité hachures horizontales').onChange(redrawCanvas);
gui.add(settings, 'handDrawnIntensity', 0, 3, 0.1).name('Intensité dessin main levée').onChange(redrawCanvas);
gui.add(settings, 'circlePatternProbability', 0, 1, 0.01).name('Probabilité motif cercles').onChange(redrawCanvas);
gui.add(settings, 'wavyLinePatternProbability', 0, 1, 0.01).name('Probabilité motif lignes ondulées').onChange(redrawCanvas);
gui.add(settings, 'polkaDotPatternProbability', 0, 1, 0.01).name('Probabilité motif pois').onChange(redrawCanvas);
gui.add(settings, 'paletteIndex', { "Originale": 0, "Niveaux de gris": 1, "Pastel": 2, "Vibrante": 3, "Contraste": 4 })
.name('Palette de couleurs')
console.log(typeof yourObject.randomize);
gui.add(settings, 'randomize').name('Randomiser');
function redrawCanvas() {
drawBackgroundGradient();
const cellSizeX = (width * 0.8) / settings.cols;
const cellSizeY = (height * 0.8) / settings.rows;
const size = min(cellSizeX, cellSizeY);
const offsetX = (width - settings.cols * size) / 2;
const offsetY = (height - settings.rows * size) / 2;
for (let j = 0; j < settings.rows; j++) {
for (let i = 0; i < settings.cols; i++) {
const x = offsetX + i * size;
const y = offsetY + j * size;
drawRectangles(x, y, size, i, j);
function drawBackgroundGradient() {
let gradient = drawingContext.createLinearGradient(0, 0, width, height);
gradient.addColorStop(0, settings.backgroundGradientStart);
gradient.addColorStop(1, settings.backgroundGradientEnd);
drawingContext.fillStyle = gradient;
drawingContext.fillRect(0, 0, width, height);
function drawRectangles(x, y, size, colIndex, rowIndex) {
const step_num = settings.stepNum;
const step = size / step_num;
const cells = Array.from({ length: step_num }, () => Array.from({ length: step_num }, () => false));
const colors = palettes[settings.paletteIndex];
const baseColorIndex = int(map(colIndex, 0, settings.cols - 1, 0, colors.length - 1));
const baseColor = color(colors[baseColorIndex]);
for (let j = 0; j < step_num; j++) {
for (let i = 0; i < step_num; i++) {
let cellSizeMax = int(random(1, step_num / 2));
for (let cellSize = cellSizeMax; cellSize > 0; cellSize--) {
for (let l = j; l < j + cellSize; l++) {
for (let k = i; k < i + cellSize; k++) {
let l_ = constrain(l, 0, step_num - 1);
let k_ = constrain(k, 0, step_num - 1);
let wc = step * cellSize;
let hc = step * cellSize;
if (random(1) < settings.hatchProbability) {
const isHorizontal = random(1) < settings.horizontalHatchProbability;
const spacing = random(3, 10);
drawHatch(rectX, rectY, wc, hc, spacing, isHorizontal);
} else if (random(1) < settings.colorFillProbability) {
let c = color(baseColor);
handDrawnRect(rectX, rectY, wc, hc);
let patternDrawn = false;
if (random(1) < settings.circlePatternProbability) {
drawCirclePattern(rectX, rectY, wc, hc, colors);
if (!patternDrawn && random(1) < settings.wavyLinePatternProbability) {
drawWavyLinePattern(rectX, rectY, wc, hc, colors);
if (!patternDrawn && random(1) < settings.polkaDotPatternProbability) {
drawPolkaDotPattern(rectX, rectY, wc, hc, colors);
strokeWeight(random(0.5, 2));
handDrawnRect(rectX, rectY, wc, hc);
for (let l = j; l < j + cellSize; l++) {
for (let k = i; k < i + cellSize; k++) {
let l_ = constrain(l, 0, step_num - 1);
let k_ = constrain(k, 0, step_num - 1);
function drawHatch(x, y, w, h, spacing, isHorizontal) {
strokeWeight(random(0.5, 1.5));
for (let i = 0; i <= h; i += spacing) {
let y1 = y + i + random(-settings.handDrawnIntensity, settings.handDrawnIntensity);
let y2 = y + i + random(-settings.handDrawnIntensity, settings.handDrawnIntensity);
x + random(-settings.handDrawnIntensity, settings.handDrawnIntensity),
x + w + random(-settings.handDrawnIntensity, settings.handDrawnIntensity),
for (let i = 0; i <= w; i += spacing) {
let x1 = x + i + random(-settings.handDrawnIntensity, settings.handDrawnIntensity);
let x2 = x + i + random(-settings.handDrawnIntensity, settings.handDrawnIntensity);
y + random(-settings.handDrawnIntensity, settings.handDrawnIntensity),
y + h + random(-settings.handDrawnIntensity, settings.handDrawnIntensity)
function handDrawnRect(x, y, w, h) {
x + random(-settings.handDrawnIntensity, settings.handDrawnIntensity),
y + random(-settings.handDrawnIntensity, settings.handDrawnIntensity)
x + w + random(-settings.handDrawnIntensity, settings.handDrawnIntensity),
y + random(-settings.handDrawnIntensity, settings.handDrawnIntensity)
x + w + random(-settings.handDrawnIntensity, settings.handDrawnIntensity),
y + h + random(-settings.handDrawnIntensity, settings.handDrawnIntensity)
x + random(-settings.handDrawnIntensity, settings.handDrawnIntensity),
y + h + random(-settings.handDrawnIntensity, settings.handDrawnIntensity)
function drawCirclePattern(x, y, w, h, colors) {
const colorIndex = int(random(colors.length));
stroke(colors[colorIndex]);
strokeWeight(random(0.5, 1.5));
let maxRadius = min(w, h) / 2;
let numCircles = int(random(3, 7));
for (let i = 0; i < numCircles; i++) {
let radius = (maxRadius / numCircles) * (i + 1);
x + w / 2 + random(-settings.handDrawnIntensity, settings.handDrawnIntensity),
y + h / 2 + random(-settings.handDrawnIntensity, settings.handDrawnIntensity),
function drawWavyLinePattern(x, y, w, h, colors) {
const colorIndex = int(random(colors.length));
stroke(colors[colorIndex]);
strokeWeight(random(0.5, 1.5));
let numLines = int(random(5, 10));
for (let i = 0; i < numLines; i++) {
let amplitude = random(2, 5);
let frequency = random(1, 3);
for (let xi = x - w * 0.1; xi <= x + w * 1.1; xi += w / 20) {
let progress = map(xi, x, x + w, 0, 1);
let yi = y + (h / numLines) * i + sin(progress * TWO_PI * frequency) * amplitude;
xi + random(-settings.handDrawnIntensity, settings.handDrawnIntensity),
yi + random(-settings.handDrawnIntensity, settings.handDrawnIntensity)
function drawPolkaDotPattern(x, y, w, h, colors) {
const colorIndex = int(random(colors.length));
fill(colors[colorIndex]);
let numDotsX = int(random(3, 6));
let numDotsY = int(random(3, 6));
let dotSize = min(w, h) / max(numDotsX, numDotsY) * 0.5;
for (let i = 0; i < numDotsX; i++) {
for (let j = 0; j < numDotsY; j++) {
let dx = x + (w / numDotsX) * i + (w / numDotsX) / 2;
let dy = y + (h / numDotsY) * j + (h / numDotsY) / 2;
dx + random(-settings.handDrawnIntensity, settings.handDrawnIntensity),
dy + random(-settings.handDrawnIntensity, settings.handDrawnIntensity),
return '#' + floor(random(0x1000000)).toString(16).padStart(6, '0');
function mouseReleased() {
const cellSizeX = (width * 0.8) / settings.cols;
const cellSizeY = (height * 0.8) / settings.rows;
const size = min(cellSizeX, cellSizeY);
const offsetX = (width - settings.cols * size) / 2;
const offsetY = (height - settings.rows * size) / 2;
let colIndex = floor((mouseX - offsetX) / size);
let rowIndex = floor((mouseY - offsetY) / size);
if (colIndex >= 0 && colIndex < settings.cols && rowIndex >= 0 && rowIndex < settings.rows) {
drawRectangles(offsetX + colIndex * size, offsetY + rowIndex * size, size, colIndex, rowIndex);