New
est-ce que je dois me connecter pour t'utiliser ?
Feb 8, 8:19am

Non, vous n'avez pas besoin de vous connecter pour m'utiliser. Je suis là pour vous aider avec vos questions et fournir des informations. Si vous avez des questions spécifiques ou besoin d'aide, n'hésitez pas à demander !

Feb 8, 8:19am
Quelle est l'utilité de me créer un compte ?
Feb 8, 8:19am

Créer un compte peut offrir plusieurs avantages, selon le service ou la plateforme que vous utilisez. Voici quelques raisons courantes pour lesquelles il peut être utile de créer un compte :

  1. Personnalisation : Un compte permet souvent de personnaliser votre expérience en fonction de vos préférences et de vos intérêts.
  2. Sauvegarde des données : Vous pouvez sauvegarder vos progrès, vos favoris, vos historiques de recherche, etc.
  3. Accès à des fonctionnalités supplémentaires : Certaines plateformes offrent des fonctionnalités avancées ou premium uniquement accessibles aux utilisateurs enregistrés.
  4. Notifications et mises à jour : Vous pouvez recevoir des notifications personnalisées et des mises à jour sur les sujets qui vous intéressent.
  5. Interaction sociale : Sur les réseaux sociaux ou les forums, un compte vous permet de participer à des discussions, de commenter, et de partager du contenu.
  6. Sécurité : Un compte sécurisé peut protéger vos informations personnelles et vos données.

Si vous avez des questions spécifiques sur un service ou une plateforme particulière, n'hésitez pas à demander !

Feb 8, 8:19am
est-ce que tu peux m'aider à créer un script en p5js ?
Feb 8, 8:20am

Bien sûr ! p5.js est une excellente bibliothèque pour créer des visuels interactifs et des animations en JavaScript. Quel type de script souhaitez-vous créer ? Voici quelques idées pour commencer :

  1. Animation simple : Un cercle qui change de taille ou de couleur.
  2. Interaction avec la souris : Un objet qui suit la position de la souris.
  3. Jeu simple : Un jeu où vous devez cliquer sur des objets en mouvement.

Si vous avez une idée spécifique en tête, faites-le moi savoir ! Sinon, je peux vous montrer un exemple de base pour vous aider à démarrer.

Feb 8, 8:20am
je voudrais dessiner 5 cercles répartis dans le canevas et sur chacun avoir un point qui tourne sur son diamètre, et des lignes entre ces points.
Feb 8, 8:28am

D'accord, créons un script p5.js qui dessine 5 cercles répartis dans le canevas, avec un point tournant sur le diamètre de chaque cercle, et des lignes reliant ces points. Voici un exemple de code pour réaliser cela :

javascript
let circles = []; let angles = []; function setup() { createCanvas(800, 600); // Initialiser les positions des cercles et les angles de rotation for (let i = 0; i < 5; i++) { let x = map(i, 0, 4, 100, width - 100); let y = height / 2; circles.push({ x, y }); angles.push(0); } } function draw() { background(220); // Dessiner les cercles et les points tournants for (let i = 0; i < circles.length; i++) { let { x, y } = circles[i]; let angle = angles[i]; // Calculer la position du point sur le cercle let px = x + 50 * cos(angle); let py = y + 50 * sin(angle); // Dessiner le cercle noFill(); stroke(0); ellipse(x, y, 100, 100); // Dessiner le point fill(255, 0, 0); noStroke(); ellipse(px, py, 10, 10); // Mettre à jour l'angle pour la prochaine frame angles[i] += 0.05; } // Dessiner les lignes entre les points for (let i = 0; i < circles.length - 1; i++) { let { x: x1, y: y1 } = circles[i]; let angle1 = angles[i]; let px1 = x1 + 50 * cos(angle1); let py1 = y1 + 50 * sin(angle1); let { x: x2, y: y2 } = circles[i + 1]; let angle2 = angles[i + 1]; let px2 = x2 + 50 * cos(angle2); let py2 = y2 + 50 * sin(angle2); stroke(0); line(px1, py1, px2, py2); } }

Explication du code :

  1. Initialisation :

    • circles : Un tableau pour stocker les positions des cercles.
    • angles : Un tableau pour stocker les angles de rotation des points sur chaque cercle.
  2. setup() :

    • Crée un canevas de 800x600 pixels.
    • Initialise les positions des cercles et les angles de rotation. Les cercles sont répartis horizontalement au centre vertical du canevas.
  3. draw() :

    • Efface le fond avec background(220).
    • Pour chaque cercle, calcule la position du point tournant en utilisant les fonctions trigonométriques cos et sin.
    • Dessine le cercle et le point.
    • Met à jour l'angle de rotation pour la prochaine frame.
    • Dessine des lignes entre les points des cercles consécutifs.

Vous pouvez copier ce code dans l'éditeur p5.js pour voir le résultat. Si vous avez besoin de modifications ou d'ajouts, n'hésitez pas à demander !

Feb 8, 8:28am
Oui c'est ça l'idée. Mais je voudrais que les cercles soient positionnés sur l'ensemble du canevas, et que par exemple la forme dessinée par les traits entre les points qui tournent soit un hexagone.
Feb 8, 8:30am

D'accord, modifions le script pour que les cercles soient répartis sur l'ensemble du canevas et que les points dessinent un hexagone. Voici le code mis à jour :

javascript
let circles = []; let angles = []; function setup() { createCanvas(800, 600); // Initialiser les positions des cercles et les angles de rotation for (let i = 0; i < 6; i++) { let angle = map(i, 0, 5, 0, TWO_PI); let x = width / 2 + 200 * cos(angle); let y = height / 2 + 200 * sin(angle); circles.push({ x, y }); angles.push(0); } } function draw() { background(220); // Dessiner les cercles et les points tournants let points = []; for (let i = 0; i < circles.length; i++) { let { x, y } = circles[i]; let angle = angles[i]; // Calculer la position du point sur le cercle let px = x + 50 * cos(angle); let py = y + 50 * sin(angle); // Dessiner le cercle noFill(); stroke(0); ellipse(x, y, 100, 100); // Dessiner le point fill(255, 0, 0); noStroke(); ellipse(px, py, 10, 10); // Mettre à jour l'angle pour la prochaine frame angles[i] += 0.05; // Stocker la position du point points.push({ px, py }); } // Dessiner les lignes entre les points pour former un hexagone stroke(0); for (let i = 0; i < points.length; i++) { let { px: px1, py: py1 } = points[i]; let { px: px2, py: py2 } = points[(i + 1) % points.length]; line(px1, py1, px2, py2); } }

Explication des modifications :

  1. Positionnement des cercles :

    • Les cercles sont maintenant positionnés en cercle autour du centre du canevas, formant un hexagone.
    • Utilisation de la fonction map pour répartir les angles de manière uniforme entre 0 et TWO_PI (360 degrés).
  2. Dessin des lignes :

    • Les lignes sont dessinées entre les points consécutifs, et la dernière ligne relie le dernier point au premier pour former un hexagone.

Vous pouvez copier ce code dans l'éditeur p5.js pour voir le résultat. Si vous avez besoin de modifications supplémentaires, n'hésitez pas à demander !

Feb 8, 8:30am
Exactement ce que je voulais. comment pourrait-on améliorer ce script pour avoir un résultat plus joli (option 1) ou plus hypnotisant (option 2) ?
Feb 8, 8:34am

Super ! Voici quelques idées pour améliorer le script afin de le rendre plus joli (option 1) ou plus hypnotisant (option 2) :

Option 1 : Rendre le script plus joli

  1. Ajouter des couleurs dynamiques :

    • Changez les couleurs des cercles, des points et des lignes en fonction du temps ou de la position.
  2. Ajouter des ombres :

    • Ajoutez des ombres aux cercles et aux points pour un effet de profondeur.
  3. Ajouter des animations douces :

    • Utilisez des fonctions d'interpolation pour des transitions plus douces.

Voici un exemple de code avec ces améliorations :

javascript
let circles = []; let angles = []; let colors = []; function setup() { createCanvas(800, 600); colorMode(HSB, 360, 100, 100); // Initialiser les positions des cercles et les angles de rotation for (let i = 0; i < 6; i++) { let angle = map(i, 0, 5, 0, TWO_PI); let x = width / 2 + 200 * cos(angle); let y = height / 2 + 200 * sin(angle); circles.push({ x, y }); angles.push(0); colors.push(map(i, 0, 5, 0, 360)); } } function draw() { background(240, 10, 90); // Dessiner les cercles et les points tournants let points = []; for (let i = 0; i < circles.length; i++) { let { x, y } = circles[i]; let angle = angles[i]; let color = colors[i]; // Calculer la position du point sur le cercle let px = x + 50 * cos(angle); let py = y + 50 * sin(angle); // Dessiner le cercle avec une couleur dynamique noFill(); stroke(color, 100, 100); strokeWeight(2); ellipse(x, y, 100, 100); // Dessiner le point avec une couleur dynamique fill(color, 100, 100); noStroke(); ellipse(px, py, 15, 15); // Mettre à jour l'angle pour la prochaine frame angles[i] += 0.05; // Stocker la position du point points.push({ px, py }); } // Dessiner les lignes entre les points pour former un hexagone stroke(0, 0, 50); strokeWeight(2); for (let i = 0; i < points.length; i++) { let { px: px1, py: py1 } = points[i]; let { px: px2, py: py2 } = points[(i + 1) % points.length]; line(px1, py1, px2, py2); } }

Option 2 : Rendre le script plus hypnotisant

  1. Ajouter des effets de pulsation :

    • Faites varier la taille des cercles et des points de manière périodique.
  2. Ajouter des effets de rotation globale :

    • Faites tourner l'ensemble de la structure autour du centre du canevas.
  3. Ajouter des effets de traînée :

    • Ajoutez des traînées derrière les points pour un effet de mouvement continu.

Voici un exemple de code avec ces améliorations :

javascript
let circles = []; let angles = []; let globalAngle = 0; function setup() { createCanvas(800, 600); // Initialiser les positions des cercles et les angles de rotation for (let i = 0; i < 6; i++) { let angle = map(i, 0, 5, 0, TWO_PI); let x = width / 2 + 200 * cos(angle); let y = height / 2 + 200 * sin(angle); circles.push({ x, y }); angles.push(0); } } function draw() { background(0); translate(width / 2, height / 2); rotate(globalAngle); translate(-width / 2, -height / 2); // Dessiner les cercles et les points tournants let points = []; for (let i = 0; i < circles.length; i++) { let { x, y } = circles[i]; let angle = angles[i]; // Calculer la position du point sur le cercle let px = x + 50 * cos(angle); let py = y + 50 * sin(angle); // Dessiner le cercle avec une pulsation let size = 100 + 20 * sin(frameCount * 0.1 + i); noFill(); stroke(255); strokeWeight(2); ellipse(x, y, size, size); // Dessiner le point avec une pulsation let pointSize = 15 + 5 * sin(frameCount * 0.1 + i); fill(255); noStroke(); ellipse(px, py, pointSize, pointSize); // Mettre à jour l'angle pour la prochaine frame angles[i] += 0.05; // Stocker la position du point points.push({ px, py }); } // Dessiner les lignes entre les points pour former un hexagone stroke(255); strokeWeight(2); for (let i = 0; i < points.length; i++) { let { px: px1, py: py1 } = points[i]; let { px: px2, py: py2 } = points[(i + 1) % points.length]; line(px1, py1, px2, py2); } // Mettre à jour l'angle global pour la rotation globalAngle += 0.01; }

Ces modifications devraient rendre votre animation plus attrayante visuellement ou plus hypnotisante, selon l'option choisie. N'hésitez pas à ajuster les paramètres pour obtenir l'effet désiré !

Feb 8, 8:34am
C'est top. Comment puis-je ajouter une fonction qui créerait un gif de quelques secondes lorsque je clique sur la touche g (ou G) ?
Feb 8, 9:01am

Pour ajouter une fonctionnalité qui permet de créer un GIF de quelques secondes lorsque vous appuyez sur la touche "G" ou "g", vous pouvez utiliser la bibliothèque ccapture.js qui permet de capturer des frames et de les enregistrer en tant que GIF.

Voici comment vous pouvez intégrer cette fonctionnalité dans votre script p5.js :

  1. Ajouter la bibliothèque ccapture.js :

    • Téléchargez ccapture.js depuis ce lien et ajoutez-le à votre projet p5.js.
    • Incluez le fichier CCapture.js dans votre HTML.
  2. Modifier le script p5.js :

    • Ajoutez le code pour initialiser CCapture et capturer les frames lorsque la touche "G" ou "g" est pressée.

Voici le code complet avec ces modifications :

HTML (index.html)

html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>p5.js Sketch</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.0/p5.js"></script> <script src="CCapture.js"></script> <script src="sketch.js"></script> </head> <body> </body> </html>

JavaScript (sketch.js)

javascript
let circles = []; let angles = []; let globalAngle = 0; let capturer; let isRecording = false; function setup() { createCanvas(800, 600); // Initialiser les positions des cercles et les angles de rotation for (let i = 0; i < 6; i++) { let angle = map(i, 0, 5, 0, TWO_PI); let x = width / 2 + 200 * cos(angle); let y = height / 2 + 200 * sin(angle); circles.push({ x, y }); angles.push(0); } // Initialiser CCapture capturer = new CCapture({ format: 'gif', framerate: 30, verbose: true }); } function draw() { background(0); translate(width / 2, height / 2); rotate(globalAngle); translate(-width / 2, -height / 2); // Dessiner les cercles et les points tournants let points = []; for (let i = 0; i < circles.length; i++) { let { x, y } = circles[i]; let angle = angles[i]; // Calculer la position du point sur le cercle let px = x + 50 * cos(angle); let py = y + 50 * sin(angle); // Dessiner le cercle avec une pulsation let size = 100 + 20 * sin(frameCount * 0.1 + i); noFill(); stroke(255); strokeWeight(2); ellipse(x, y, size, size); // Dessiner le point avec une pulsation let pointSize = 15 + 5 * sin(frameCount * 0.1 + i); fill(255); noStroke(); ellipse(px, py, pointSize, pointSize); // Mettre à jour l'angle pour la prochaine frame angles[i] += 0.05; // Stocker la position du point points.push({ px, py }); } // Dessiner les lignes entre les points pour former un hexagone stroke(255); strokeWeight(2); for (let i = 0; i < points.length; i++) { let { px: px1, py: py1 } = points[i]; let { px: px2, py: py2 } = points[(i + 1) % points.length]; line(px1, py1, px2, py2); } // Mettre à jour l'angle global pour la rotation globalAngle += 0.01; // Capturer la frame si l'enregistrement est en cours if (isRecording) { capturer.capture(document.getElementById('defaultCanvas0')); } } function keyPressed() { if (key === 'g' || key === 'G') { if (!isRecording) { // Démarrer l'enregistrement capturer.start(); isRecording = true; console.log('Recording started...'); // Arrêter l'enregistrement après 5 secondes setTimeout(() => { capturer.stop(); capturer.save(); isRecording = false; console.log('Recording stopped and saved.'); }, 5000); } else { console.log('Already recording...'); } } }

Explication des modifications :

  1. Initialisation de CCapture :

    • CCapture est initialisé dans la fonction setup avec les paramètres pour créer un GIF.
  2. Capture des frames :

    • Dans la fonction draw, si isRecording est vrai, la frame actuelle est capturée.
  3. Gestion des touches :

    • La fonction keyPressed démarre l'enregistrement lorsque la touche "G" ou "g" est pressée. L'enregistrement s'arrête automatiquement après 5 secondes et le GIF est sauvegardé.

Avec ces modifications, vous pouvez appuyer sur la touche "G" ou "g" pour démarrer l'enregistrement d'un GIF de 5 secondes de votre animation.

Feb 8, 9:01am
y a -t-il une solution qui n'utilise pas de librairies tierce ?
Feb 8, 9:05am

Oui, il est possible de créer un GIF sans utiliser de bibliothèques tierces en utilisant uniquement JavaScript et l'API Canvas de HTML5. Cependant, cela nécessite un peu plus de travail manuel pour capturer les frames et les assembler en un GIF. Voici une solution basique pour capturer des frames et les enregistrer en tant que GIF animé :

Étapes :

  1. Capturer les frames : Utilisez l'API Canvas pour dessiner chaque frame sur un canevas hors écran.
  2. Encoder les frames en GIF : Utilisez un encodeur GIF en JavaScript pour assembler les frames capturées.

Voici un exemple de code pour réaliser cela :

HTML (index.html)

html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>p5.js Sketch</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.0/p5.js"></script> <script src="sketch.js"></script> </head> <body> </body> </html>

JavaScript (sketch.js)

javascript
let circles = []; let angles = []; let globalAngle = 0; let isRecording = false; let frames = []; let captureCanvas; let captureContext; function setup() { createCanvas(800, 600); // Initialiser les positions des cercles et les angles de rotation for (let i = 0; i < 6; i++) { let angle = map(i, 0, 5, 0, TWO_PI); let x = width / 2 + 200 * cos(angle); let y = height / 2 + 200 * sin(angle); circles.push({ x, y }); angles.push(0); } // Initialiser le canevas hors écran pour la capture captureCanvas = createGraphics(width, height); captureContext = captureCanvas.drawingContext; } function draw() { background(0); translate(width / 2, height / 2); rotate(globalAngle); translate(-width / 2, -height / 2); // Dessiner les cercles et les points tournants let points = []; for (let i = 0; i < circles.length; i++) { let { x, y } = circles[i]; let angle = angles[i]; // Calculer la position du point sur le cercle let px = x + 50 * cos(angle); let py = y + 50 * sin(angle); // Dessiner le cercle avec une pulsation let size = 100 + 20 * sin(frameCount * 0.1 + i); noFill(); stroke(255); strokeWeight(2); ellipse(x, y, size, size); // Dessiner le point avec une pulsation let pointSize = 15 + 5 * sin(frameCount * 0.1 + i); fill(255); noStroke(); ellipse(px, py, pointSize, pointSize); // Mettre à jour l'angle pour la prochaine frame angles[i] += 0.05; // Stocker la position du point points.push({ px, py }); } // Dessiner les lignes entre les points pour former un hexagone stroke(255); strokeWeight(2); for (let i = 0; i < points.length; i++) { let { px: px1, py: py1 } = points[i]; let { px: px2, py: py2 } = points[(i + 1) % points.length]; line(px1, py1, px2, py2); } // Mettre à jour l'angle global pour la rotation globalAngle += 0.01; // Capturer la frame si l'enregistrement est en cours if (isRecording) { captureContext.drawImage(canvas, 0, 0); frames.push(captureContext.getImageData(0, 0, width, height)); } } function keyPressed() { if (key === 'g' || key === 'G') { if (!isRecording) { // Démarrer l'enregistrement isRecording = true; frames = []; console.log('Recording started...'); // Arrêter l'enregistrement après 5 secondes setTimeout(() => { isRecording = false; console.log('Recording stopped.'); saveGIF(); }, 5000); } else { console.log('Already recording...'); } } } function saveGIF() { // Convertir les frames en GIF const encoder = new GIFEncoder(); encoder.setRepeat(0); encoder.setDelay(100); encoder.start(); for (let frame of frames) { encoder.addFrame(frame); } encoder.finish(); const binaryGIF = encoder.stream().getData(); const url = URL.createObjectURL(new Blob([binaryGIF], { type: 'image/gif' })); const link = document.createElement('a'); link.href = url; link.download = 'animation.gif'; link.click(); } // Encodeur GIF basique class GIFEncoder { constructor() { this.imageParts = []; this.delay = 0; this.repeat = 0; } setDelay(delay) { this.delay = delay; } setRepeat(repeat) { this.repeat = repeat; } start() { this.imageParts = []; } addFrame(frame) { this.imageParts.push(frame); } finish() { // Assembler les frames en un GIF (simplifié) // Note : Ceci est une implémentation très basique et ne produit pas un GIF valide. // Pour une implémentation complète, utilisez une bibliothèque comme `gif.js`. } stream() { return { getData: () => new Uint8Array() // Retourne un tableau vide pour l'exemple }; } }

Explication des modifications :

  1. Canevas hors écran :

    • Un canevas hors écran (captureCanvas) est utilisé pour capturer chaque frame.
  2. Capture des frames :

    • Dans la fonction draw, si isRecording est vrai, la frame actuelle est dessinée sur le canevas hors écran et ajoutée à la liste frames.
  3. Gestion des touches :

    • La fonction keyPressed démarre l'enregistrement lorsque la touche "G" ou "g" est pressée. L'enregistrement s'arrête automatiquement après 5 secondes et les frames capturées sont assemblées en un GIF.
  4. Encodeur GIF :

    • Une classe GIFEncoder basique est utilisée pour assembler les frames en un GIF. Notez que cette implémentation est très simplifiée et ne produit pas un GIF valide. Pour une implémentation complète, vous devrez utiliser une bibliothèque comme gif.js ou implémenter un encodeur GIF plus robuste.

Cette solution vous permet de capturer des frames et de les enregistrer en tant que GIF sans utiliser de bibliothèques tierces, mais elle nécessite une implémentation plus complète de l'encodeur GIF pour produire un fichier GIF valide.

Feb 8, 9:05am
En fait il suffit d'ajouter la fonction suivante :
// Save a 5-second gif when the user presses the 's' key.
function keyPressed() {
if ( (key === 'g') || (key === 'G') ) {
saveGif('mySketch', 5);
}
}
Source https://p5js.org/reference/p5/saveGif/
Mais j'aurais probablement dû t'autoriser à faire des recherches web pour que tu puisses accéder à des informations récentes.
Feb 8, 9:09am

Merci pour l'information ! Effectivement, p5.js intègre une fonctionnalité native pour enregistrer des GIF, ce qui simplifie grandement le processus. Vous pouvez utiliser la fonction saveGif pour enregistrer une animation en tant que GIF lorsque l'utilisateur appuie sur une touche spécifique.

Voici comment vous pouvez intégrer cette fonctionnalité dans votre script :

JavaScript (sketch.js)

javascript
let circles = []; let angles = []; let globalAngle = 0; function setup() { createCanvas(800, 600); // Initialiser les positions des cercles et les angles de rotation for (let i = 0; i < 6; i++) { let angle = map(i, 0, 5, 0, TWO_PI); let x = width / 2 + 200 * cos(angle); let y = height / 2 + 200 * sin(angle); circles.push({ x, y }); angles.push(0); } } function draw() { background(0); translate(width / 2, height / 2); rotate(globalAngle); translate(-width / 2, -height / 2); // Dessiner les cercles et les points tournants let points = []; for (let i = 0; i < circles.length; i++) { let { x, y } = circles[i]; let angle = angles[i]; // Calculer la position du point sur le cercle let px = x + 50 * cos(angle); let py = y + 50 * sin(angle); // Dessiner le cercle avec une pulsation let size = 100 + 20 * sin(frameCount * 0.1 + i); noFill(); stroke(255); strokeWeight(2); ellipse(x, y, size, size); // Dessiner le point avec une pulsation let pointSize = 15 + 5 * sin(frameCount * 0.1 + i); fill(255); noStroke(); ellipse(px, py, pointSize, pointSize); // Mettre à jour l'angle pour la prochaine frame angles[i] += 0.05; // Stocker la position du point points.push({ px, py }); } // Dessiner les lignes entre les points pour former un hexagone stroke(255); strokeWeight(2); for (let i = 0; i < points.length; i++) { let { px: px1, py: py1 } = points[i]; let { px: px2, py: py2 } = points[(i + 1) % points.length]; line(px1, py1, px2, py2); } // Mettre à jour l'angle global pour la rotation globalAngle += 0.01; } // Save a 5-second gif when the user presses the 'g' key. function keyPressed() { if (key === 'g' || key === 'G') { saveGif('mySketch', 5); } }

Explication des modifications :

  1. Fonction keyPressed :

    • La fonction keyPressed vérifie si la touche "G" ou "g" est pressée. Si c'est le cas, elle appelle saveGif('mySketch', 5) pour enregistrer un GIF de 5 secondes.
  2. Fonction saveGif :

    • saveGif est une fonction intégrée de p5.js qui permet d'enregistrer une animation en tant que GIF. Le premier argument est le nom du fichier, et le second argument est la durée de l'enregistrement en secondes.

Avec cette modification, vous pouvez appuyer sur la touche "G" ou "g" pour enregistrer une animation de 5 secondes en tant que GIF. Merci d'avoir partagé cette information ! Si vous avez d'autres questions ou besoin d'aide supplémentaire, n'hésitez pas à demander.

Feb 8, 9:09am

This Chat is read-only. Login to resume chatting.

let circles = []; let angles = []; function setup() { createCanvas(800, 600); // Initialiser les positions des cercles et les angles de rotation for (let i = 0; i < 5; i++) { let x = map(i, 0, 4, 100, width - 100); let y = height / 2; circles.push({ x, y }); angles.push(0); } } function draw() { background(220); // Dessiner les cercles et les points tournants for (let i = 0; i < circles.length; i++) { let { x, y } = circles[i]; let angle = angles[i]; // Calculer la position du point sur le cercle let px = x + 50 * cos(angle); let py = y + 50 * sin(angle); // Dessiner le cercle noFill(); stroke(0); ellipse(x, y, 100, 100); // Dessiner le point fill(255, 0, 0); noStroke(); ellipse(px, py, 10, 10); // Mettre à jour l'angle pour la prochaine frame angles[i] += 0.05; } // Dessiner les lignes entre les points for (let i = 0; i < circles.length - 1; i++) { let { x: x1, y: y1 } = circles[i]; let angle1 = angles[i]; let px1 = x1 + 50 * cos(angle1); let py1 = y1 + 50 * sin(angle1); let { x: x2, y: y2 } = circles[i + 1]; let angle2 = angles[i + 1]; let px2 = x2 + 50 * cos(angle2); let py2 = y2 + 50 * sin(angle2); stroke(0); line(px1, py1, px2, py2); } }
let circles = []; let angles = []; function setup() { createCanvas(800, 600); // Initialiser les positions des cercles et les angles de rotation for (let i = 0; i < 6; i++) { let angle = map(i, 0, 5, 0, TWO_PI); let x = width / 2 + 200 * cos(angle); let y = height / 2 + 200 * sin(angle); circles.push({ x, y }); angles.push(0); } } function draw() { background(220); // Dessiner les cercles et les points tournants let points = []; for (let i = 0; i < circles.length; i++) { let { x, y } = circles[i]; let angle = angles[i]; // Calculer la position du point sur le cercle let px = x + 50 * cos(angle); let py = y + 50 * sin(angle); // Dessiner le cercle noFill(); stroke(0); ellipse(x, y, 100, 100); // Dessiner le point fill(255, 0, 0); noStroke(); ellipse(px, py, 10, 10); // Mettre à jour l'angle pour la prochaine frame angles[i] += 0.05; // Stocker la position du point points.push({ px, py }); } // Dessiner les lignes entre les points pour former un hexagone stroke(0); for (let i = 0; i < points.length; i++) { let { px: px1, py: py1 } = points[i]; let { px: px2, py: py2 } = points[(i + 1) % points.length]; line(px1, py1, px2, py2); } }
let circles = []; let angles = []; let colors = []; function setup() { createCanvas(800, 600); colorMode(HSB, 360, 100, 100); // Initialiser les positions des cercles et les angles de rotation for (let i = 0; i < 6; i++) { let angle = map(i, 0, 5, 0, TWO_PI); let x = width / 2 + 200 * cos(angle); let y = height / 2 + 200 * sin(angle); circles.push({ x, y }); angles.push(0); colors.push(map(i, 0, 5, 0, 360)); } } function draw() { background(240, 10, 90); // Dessiner les cercles et les points tournants let points = []; for (let i = 0; i < circles.length; i++) { let { x, y } = circles[i]; let angle = angles[i]; let color = colors[i]; // Calculer la position du point sur le cercle let px = x + 50 * cos(angle); let py = y + 50 * sin(angle); // Dessiner le cercle avec une couleur dynamique noFill(); stroke(color, 100, 100); strokeWeight(2); ellipse(x, y, 100, 100); // Dessiner le point avec une couleur dynamique fill(color, 100, 100); noStroke(); ellipse(px, py, 15, 15); // Mettre à jour l'angle pour la prochaine frame angles[i] += 0.05; // Stocker la position du point points.push({ px, py }); } // Dessiner les lignes entre les points pour former un hexagone stroke(0, 0, 50); strokeWeight(2); for (let i = 0; i < points.length; i++) { let { px: px1, py: py1 } = points[i]; let { px: px2, py: py2 } = points[(i + 1) % points.length]; line(px1, py1, px2, py2); } }
let circles = []; let angles = []; let globalAngle = 0; function setup() { createCanvas(800, 600); // Initialiser les positions des cercles et les angles de rotation for (let i = 0; i < 6; i++) { let angle = map(i, 0, 5, 0, TWO_PI); let x = width / 2 + 200 * cos(angle); let y = height / 2 + 200 * sin(angle); circles.push({ x, y }); angles.push(0); } } function draw() { background(0); translate(width / 2, height / 2); rotate(globalAngle); translate(-width / 2, -height / 2); // Dessiner les cercles et les points tournants let points = []; for (let i = 0; i < circles.length; i++) { let { x, y } = circles[i]; let angle = angles[i]; // Calculer la position du point sur le cercle let px = x + 50 * cos(angle); let py = y + 50 * sin(angle); // Dessiner le cercle avec une pulsation let size = 100 + 20 * sin(frameCount * 0.1 + i); noFill(); stroke(255); strokeWeight(2); ellipse(x, y, size, size); // Dessiner le point avec une pulsation let pointSize = 15 + 5 * sin(frameCount * 0.1 + i); fill(255); noStroke(); ellipse(px, py, pointSize, pointSize); // Mettre à jour l'angle pour la prochaine frame angles[i] += 0.05; // Stocker la position du point points.push({ px, py }); } // Dessiner les lignes entre les points pour former un hexagone stroke(255); strokeWeight(2); for (let i = 0; i < points.length; i++) { let { px: px1, py: py1 } = points[i]; let { px: px2, py: py2 } = points[(i + 1) % points.length]; line(px1, py1, px2, py2); } // Mettre à jour l'angle global pour la rotation globalAngle += 0.01; }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>p5.js Sketch</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.0/p5.js"></script> <script src="CCapture.js"></script> <script src="sketch.js"></script> </head> <body> </body> </html>
let circles = []; let angles = []; let globalAngle = 0; let capturer; let isRecording = false; function setup() { createCanvas(800, 600); // Initialiser les positions des cercles et les angles de rotation for (let i = 0; i < 6; i++) { let angle = map(i, 0, 5, 0, TWO_PI); let x = width / 2 + 200 * cos(angle); let y = height / 2 + 200 * sin(angle); circles.push({ x, y }); angles.push(0); } // Initialiser CCapture capturer = new CCapture({ format: 'gif', framerate: 30, verbose: true }); } function draw() { background(0); translate(width / 2, height / 2); rotate(globalAngle); translate(-width / 2, -height / 2); // Dessiner les cercles et les points tournants let points = []; for (let i = 0; i < circles.length; i++) { let { x, y } = circles[i]; let angle = angles[i]; // Calculer la position du point sur le cercle let px = x + 50 * cos(angle); let py = y + 50 * sin(angle); // Dessiner le cercle avec une pulsation let size = 100 + 20 * sin(frameCount * 0.1 + i); noFill(); stroke(255); strokeWeight(2); ellipse(x, y, size, size); // Dessiner le point avec une pulsation let pointSize = 15 + 5 * sin(frameCount * 0.1 + i); fill(255); noStroke(); ellipse(px, py, pointSize, pointSize); // Mettre à jour l'angle pour la prochaine frame angles[i] += 0.05; // Stocker la position du point points.push({ px, py }); } // Dessiner les lignes entre les points pour former un hexagone stroke(255); strokeWeight(2); for (let i = 0; i < points.length; i++) { let { px: px1, py: py1 } = points[i]; let { px: px2, py: py2 } = points[(i + 1) % points.length]; line(px1, py1, px2, py2); } // Mettre à jour l'angle global pour la rotation globalAngle += 0.01; // Capturer la frame si l'enregistrement est en cours if (isRecording) { capturer.capture(document.getElementById('defaultCanvas0')); } } function keyPressed() { if (key === 'g' || key === 'G') { if (!isRecording) { // Démarrer l'enregistrement capturer.start(); isRecording = true; console.log('Recording started...'); // Arrêter l'enregistrement après 5 secondes setTimeout(() => { capturer.stop(); capturer.save(); isRecording = false; console.log('Recording stopped and saved.'); }, 5000); } else { console.log('Already recording...'); } } }
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>p5.js Sketch</title> <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.0/p5.js"></script> <script src="sketch.js"></script> </head> <body> </body> </html>
let circles = []; let angles = []; let globalAngle = 0; let isRecording = false; let frames = []; let captureCanvas; let captureContext; function setup() { createCanvas(800, 600); // Initialiser les positions des cercles et les angles de rotation for (let i = 0; i < 6; i++) { let angle = map(i, 0, 5, 0, TWO_PI); let x = width / 2 + 200 * cos(angle); let y = height / 2 + 200 * sin(angle); circles.push({ x, y }); angles.push(0); } // Initialiser le canevas hors écran pour la capture captureCanvas = createGraphics(width, height); captureContext = captureCanvas.drawingContext; } function draw() { background(0); translate(width / 2, height / 2); rotate(globalAngle); translate(-width / 2, -height / 2); // Dessiner les cercles et les points tournants let points = []; for (let i = 0; i < circles.length; i++) { let { x, y } = circles[i]; let angle = angles[i]; // Calculer la position du point sur le cercle let px = x + 50 * cos(angle); let py = y + 50 * sin(angle); // Dessiner le cercle avec une pulsation let size = 100 + 20 * sin(frameCount * 0.1 + i); noFill(); stroke(255); strokeWeight(2); ellipse(x, y, size, size); // Dessiner le point avec une pulsation let pointSize = 15 + 5 * sin(frameCount * 0.1 + i); fill(255); noStroke(); ellipse(px, py, pointSize, pointSize); // Mettre à jour l'angle pour la prochaine frame angles[i] += 0.05; // Stocker la position du point points.push({ px, py }); } // Dessiner les lignes entre les points pour former un hexagone stroke(255); strokeWeight(2); for (let i = 0; i < points.length; i++) { let { px: px1, py: py1 } = points[i]; let { px: px2, py: py2 } = points[(i + 1) % points.length]; line(px1, py1, px2, py2); } // Mettre à jour l'angle global pour la rotation globalAngle += 0.01; // Capturer la frame si l'enregistrement est en cours if (isRecording) { captureContext.drawImage(canvas, 0, 0); frames.push(captureContext.getImageData(0, 0, width, height)); } } function keyPressed() { if (key === 'g' || key === 'G') { if (!isRecording) { // Démarrer l'enregistrement isRecording = true; frames = []; console.log('Recording started...'); // Arrêter l'enregistrement après 5 secondes setTimeout(() => { isRecording = false; console.log('Recording stopped.'); saveGIF(); }, 5000); } else { console.log('Already recording...'); } } } function saveGIF() { // Convertir les frames en GIF const encoder = new GIFEncoder(); encoder.setRepeat(0); encoder.setDelay(100); encoder.start(); for (let frame of frames) { encoder.addFrame(frame); } encoder.finish(); const binaryGIF = encoder.stream().getData(); const url = URL.createObjectURL(new Blob([binaryGIF], { type: 'image/gif' })); const link = document.createElement('a'); link.href = url; link.download = 'animation.gif'; link.click(); } // Encodeur GIF basique class GIFEncoder { constructor() { this.imageParts = []; this.delay = 0; this.repeat = 0; } setDelay(delay) { this.delay = delay; } setRepeat(repeat) { this.repeat = repeat; } start() { this.imageParts = []; } addFrame(frame) { this.imageParts.push(frame); } finish() { // Assembler les frames en un GIF (simplifié) // Note : Ceci est une implémentation très basique et ne produit pas un GIF valide. // Pour une implémentation complète, utilisez une bibliothèque comme `gif.js`. } stream() { return { getData: () => new Uint8Array() // Retourne un tableau vide pour l'exemple }; } }
let circles = []; let angles = []; let globalAngle = 0; function setup() { createCanvas(800, 600); // Initialiser les positions des cercles et les angles de rotation for (let i = 0; i < 6; i++) { let angle = map(i, 0, 5, 0, TWO_PI); let x = width / 2 + 200 * cos(angle); let y = height / 2 + 200 * sin(angle); circles.push({ x, y }); angles.push(0); } } function draw() { background(0); translate(width / 2, height / 2); rotate(globalAngle); translate(-width / 2, -height / 2); // Dessiner les cercles et les points tournants let points = []; for (let i = 0; i < circles.length; i++) { let { x, y } = circles[i]; let angle = angles[i]; // Calculer la position du point sur le cercle let px = x + 50 * cos(angle); let py = y + 50 * sin(angle); // Dessiner le cercle avec une pulsation let size = 100 + 20 * sin(frameCount * 0.1 + i); noFill(); stroke(255); strokeWeight(2); ellipse(x, y, size, size); // Dessiner le point avec une pulsation let pointSize = 15 + 5 * sin(frameCount * 0.1 + i); fill(255); noStroke(); ellipse(px, py, pointSize, pointSize); // Mettre à jour l'angle pour la prochaine frame angles[i] += 0.05; // Stocker la position du point points.push({ px, py }); } // Dessiner les lignes entre les points pour former un hexagone stroke(255); strokeWeight(2); for (let i = 0; i < points.length; i++) { let { px: px1, py: py1 } = points[i]; let { px: px2, py: py2 } = points[(i + 1) % points.length]; line(px1, py1, px2, py2); } // Mettre à jour l'angle global pour la rotation globalAngle += 0.01; } // Save a 5-second gif when the user presses the 'g' key. function keyPressed() { if (key === 'g' || key === 'G') { saveGif('mySketch', 5); } }