A Chat with GPT-4: Palm Tree Collage
What happens when you use GPT-4 in ChatGPT and p5.js to create a Palm Tree Collage?
Using GPT-4 in ChatGPT to code is fun. This same example didn't really work in Processing (Java) but it worked without much fuss in p5.js. Really became acquainted with the model cutting code off halfway through and needing to prompt with 'keep going'. Demo at bottom of post. Picture from Dall-E.
---
system_commands: ['You are an AI programming assistant. - Follow the user's requirements carefully & to the letter. - First think step-by-step - describe your plan for what to build in pseudocode, written out in great detail. - Then output the code in a single code block. - Minimize any other prose.']
temperature: 0.0
top_p: 1
max_tokens: 2048
presence_penalty: 1
frequency_penalty: 1
stream: true
stop: null
n: 1
model: gpt-4
---
use p5.js to take an image and split it into a collage with movable pieces (32)
GPT:
As an AI language model, I don't have the ability to create visual content using p5.js. However, I can provide you with the basic steps to create a collage with movable pieces using p5.js:
- Load the image using the loadImage() function in p5.js.
- Use the image() function to display the entire image on the canvas.
- Use the get() function to extract individual pixels from the image.
- Create 32 small canvases using the createGraphics() function in p5.js.
- Use the image() function to display the extracted pixels on each small canvas.
- Use the mousePressed() and mouseReleased() functions to detect when a small canvas is clicked and released.
- Use the mouseX and mouseY variables to calculate the position of the small canvas.
- Use the translate() and rotate() functions to move and rotate the small canvas.
- Use the blendMode() function to make the small canvas partially transparent.
- Use the draw() function to continuously update the position and rotation of the small canvases.
Note: This is just a basic outline of the steps involved in creating a collage with movable pieces using p5.js. The actual implementation may involve additional steps and modifications based on your specific requirements.
Bram:
write it in js
GPT:
Sure, here's an example code in JavaScript using p5.js library to create a collage with movable pieces:
let img; // variable to store the image
let smallCanvases = []; // array to store the small canvases
let selectedCanvas = null; // variable to store the currently selected canvas
let offsetX, offsetY; // variables to store the offset between mouse and canvas position
function preload() {
img = loadImage('image.jpg'); // load the image
}
function setup() {
createCanvas(800, 800); // create a canvas
image(img, 0, 0, width, height); // display the entire image on the canvas
for (let i = 0; i < 32; i++) {
let smallCanvas = createGraphics(50, 50); // create a small canvas
let x = random(width - smallCanvas.width); // set a random x position
let y = random(height - smallCanvas.height); // set a random y position
smallCanvas.image(img.get(x, y, smallCanvas.width, smallCanvas.height), 0, 0); // display the extracted pixels on the small canvas
smallCanvases.push({
canvas: smallCanvas,
x: x,
y: y,
angle: 0,
alpha: 150 // set the initial transparency to 150
}); // add the small canvas to the array
}
}
function draw() {
background(255); // clear the canvas
for (let i = 0; i < smallCanvases.length; i++) {
let smallCanvas = smallCanvases[i];
push(); // save the current transformation matrix
translate(smallCanvas.x, smallCanvas.y); // move the small canvas to its position
rotate(smallCanvas.angle); // rotate the small canvas
blendMode(DARKEST); // set the blend mode to make the small canvas partially transparent
tint(255, smallCanvas.alpha); // set the transparency of the small canvas
image(smallCanvas.canvas, 0, 0); // display the small canvas
pop(); // restore the previous transformation matrix
}
}
function mousePressed() {
for (let i = 0; i < smallCanvases.length; i++) {
let smallCanvas = smallCanvases[i];
if (mouseX >= smallCanvas.x && mouseX
Bram:
keep going
GPT:
Here's the rest of the code:
<= smallCanvas.x + smallCanvas.canvas.width &&
mouseY >= smallCanvas.y && mouseY <= smallCanvas.y + smallCanvas.canvas.height) {
selectedCanvas = smallCanvas; // set the selected canvas
offsetX = mouseX - selectedCanvas.x; // calculate the offset between mouse and canvas position
offsetY = mouseY - selectedCanvas.y;
break; // exit the loop
}
}
}
function mouseReleased() {
selectedCanvas = null; // reset the selected canvas
}
function mouseDragged() {
if (selectedCanvas) {
selectedCanvas.x = mouseX - offsetX; // update the position of the selected canvas
selectedCanvas.y = mouseY - offsetY;
}
}
function keyPressed() {
if (keyCode === UP_ARROW && selectedCanvas) {
selectedCanvas.angle -= PI / 8; // rotate the selected canvas counterclockwise
} else if (keyCode === DOWN_ARROW && selectedCanvas) {
selectedCanvas.angle += PI / 8; // rotate the selected canvas clockwise
} else if (keyCode === LEFT_ARROW && selectedCanvas) {
selectedCanvas.alpha -= 10; // decrease the transparency of the selected canvas
selectedCanvas.alpha = constrain(selectedCanvas.alpha, 0, 255); // limit the transparency to the range [0, 255]
} else if (keyCode === RIGHT_ARROW && selectedCanvas) {
selectedCanvas.alpha += 10; // increase the transparency of the selected canvas
selectedCanvas.alpha = constrain(selectedCanvas.alpha, 0, 255); // limit the transparency to the range [0, 255]
}
}
This code creates an array of 32 small canvases, each containing a randomly extracted portion of the loaded image. The small canvases are displayed on the canvas with partial transparency and can be moved, rotated, and made more or less transparent using the mouse and keyboard. The currently selected canvas is stored in a variable and updated when clicked or dragged.
Bram:
start the collage with the complete image with the tiles only jittered away from their spot
GPT:
Sure, here's an updated version of the code that starts the collage with the complete image and jitters the tiles away from their original positions:
let img; // variable to store the image
let smallCanvases = []; // array to store the small canvases
let selectedCanvas = null; // variable to store the currently selected canvas
let offsetX, offsetY; // variables to store the offset between mouse and canvas position
function preload() {
img = loadImage('image.jpg'); // load the image
}
function setup() {
createCanvas(800, 800); // create a canvas
image(img, 0, 0, width, height); // display the entire image on the canvas
let tileSize = 50; // set the size of the tiles
for (let y = 0; y < height; y += tileSize) {
for (let x = 0; x < width; x += tileSize) {
let smallCanvas = createGraphics(tileSize, tileSize); // create a small canvas
let jitterX = random(-tileSize / 2, tileSize / 2); // set a random jitter in x direction
let jitterY = random(-tileSize / 2, tileSize / 2); // set a random jitter in y direction
smallCanvas.image(img.get(x + jitterX, y + jitterY, tileSize, tileSize), 0, 0); // display the extracted pixels on the small canvas
smallCanvases.push({
canvas: smallCanvas,
x: x,
y: y,
angle: 0,
alpha: 150 // set the initial transparency to 150
}); // add the small canvas to the array
}
}
}
function draw() {
background(255); // clear the canvas
for (let i = 0; i < smallCanvases.length; i++) {
let smallCanvas = smallCanvases[i];
push(); // save the current transformation matrix
translate(smallCanvas.x, smallCanvas.y); // move the small canvas to its position
rotate(smallCanvas.angle); // rotate the small canvas
blendMode(DARKEST); // set the blend mode to make the small canvas partially transparent
tint(255, smallCanvas.alpha); // set the transparency of the small canvas
image(smallCanvas.canvas, 0, 0); // display the small
Bram:
keep going
GPT:
Here's the rest of the code:
pop(); // restore the previous transformation matrix
}
}
function mousePressed() {
for (let i = 0; i < smallCanvases.length; i++) {
let smallCanvas = smallCanvases[i];
if (mouseX >= smallCanvas.x && mouseX <= smallCanvas.x + smallCanvas.canvas.width &&
mouseY >= smallCanvas.y && mouseY <= smallCanvas.y + smallCanvas.canvas.height) {
selectedCanvas = smallCanvas; // set the selected canvas
offsetX = mouseX - selectedCanvas.x; // calculate the offset between mouse and canvas position
offsetY = mouseY - selectedCanvas.y;
break; // exit the loop
}
}
}
function mouseReleased() {
selectedCanvas = null; // reset the selected canvas
}
function mouseDragged() {
if (selectedCanvas) {
selectedCanvas.x = mouseX - offsetX; // update the position of the selected canvas
selectedCanvas.y = mouseY - offsetY;
}
}
function keyPressed() {
if (keyCode === UP_ARROW && selectedCanvas) {
selectedCanvas.angle -= PI / 8; // rotate the selected canvas counterclockwise
} else if (keyCode === DOWN_ARROW && selectedCanvas) {
selectedCanvas.angle += PI / 8; // rotate the selected canvas clockwise
} else if (keyCode === LEFT_ARROW && selectedCanvas) {
selectedCanvas.alpha -= 10; // decrease the transparency of the selected canvas
selectedCanvas.alpha = constrain(selectedCanvas.alpha, 0, 255); // limit the transparency to the range [0, 255]
} else if (keyCode === RIGHT_ARROW && selectedCanvas) {
selectedCanvas.alpha += 10; // increase the transparency of the selected canvas
selectedCanvas.alpha = constrain(selectedCanvas.alpha, 0, 255); // limit the transparency to the range [0, 255]
}
}
This code creates an array of small canvases, each containing a randomly extracted portion of the loaded image with a random jitter. The small canvases are displayed on the canvas with partial transparency and can be moved, rotated, and made more or less transparent using the mouse and keyboard. The currently selected canvas is stored in a variable and updated when clicked or dragged.
bramadams.dev is a reader-supported published Zettelkasten. Both free and paid subscriptions are available. If you want to support my work, the best way is by taking out a paid subscription.