Generative Design

Formes complexes

2526 · INMI · Dekens Antoine

Les objets

C'est quoi ?

Un objet permet de stocker et manipuler des données dans une variable. Il est plus facile à gérer que des dizaines de variables directement dans votre code.

// Crée une variable "myPokemon" qui contient
// un objet d'informations sur mon pokemon.
const myPokemon = {
  name: "Carapuce",
  canEvolve: true,
  nationalNumber: 007,
  types: [ "eau" ],
  evolution: {
    name: "Carabaffe"
  }
};
// Pour accéder à nos propriétés, vous utiliser
// le nom de votre variable qui contient votre objet
// suivi d'un point "." et du nom de la propriété qui vous intéresse
// {myObject}.{property}

console.log( myPokemon.name );
// Affiche 'Carapuce' dans la console

console.log( myPokemon.evolution.name );
// Affiche 'Carabaffe' dans la console

Traits et formes complexes

Trait simple

Pour faire un simple trait, il faut définir un point de départ et au moins un point d'arrivée.

// Indique que nous commençons une nouvelle forme
ctx.beingPath();

// Le point de départ
ctx.moveTo( x, y );

// Le point d'arrivée
ctx.lineTo( x, y );

// Dessine le trait
ctx.stroke();

Forme complexe

lineTo( ) peut être appelé plusieurs fois de suite pour connecter plusieurs points les uns à la suite des autres.

	// Indique que nous commençons une nouvelle forme
  ctx.beingPath();

  // Le point de départ
  ctx.moveTo( x, y );

  // Le prochain point à connecter
  ctx.lineTo( x, y );

  // On continue de lier des points ensemble
  ctx.lineTo( x, y );
  ctx.lineTo( x, y );
  ctx.lineTo( x, y );
  …

  ctx.stroke();

Exercices A

Trigonométrie

Coordonnées sur un cercle

Placer un point

On a besoin de 2 informations: le radius du cercle et l'angle (en radian) où le placer. Ensuite on peut récupérer les coordonées x et y via 2 formules:

	// Retourne la coordonnées
  // horizontal sur notre cercle
  const x = Math.cos( angle * Math.PI ) * radius;

  // Retourne la coordonnées
  // vertical sur notre cercle
  const y = Math.sin( angle * Math.PI ) * radius;

Plus de points

Nous allons calculer l'angle qui sépare nos particules pour savoir où les placer en divisant un tour complet (2 * PI) par le nombre de particules.

// Le nombre total de particules à placer
const nParticles = 5;

// L'angle entre nos particules (déjà multiplié par PI)
const angleStep = 2 * PI / nParticules;

Et englobant notre code d'une boucle for et en multipliant l'index avec angleStep, nous aurons nos particules parfaitement espacées autour de notre cercle.

const nParticles = 5;
const angleStep = 2 * PI / nParticules;

for( let i = 0; i < nParticles; i++ ){
  // Mutliplier angleStep par l'index permet
  // de s'assurer d'avoir l'espacement voulu.
  const angle = angleStep * i;
  const x = cos( angle ) * radius;
  const y = sin( angle ) * radius;
}

Connecter les points

Maintenant que nous avons les coordonnées de nos points, nous pouvons les connecter entre eux via les méthodes moveTo et lineTo dans notre boucle.

Une condition if / else sera utile pour détecter le premier point.

Toolbox

Mélanger un tableau

const shuffleArray = ( array ) => {
  array.sort( () => {
    return Math.random() - 0.5;
  } );
};

const pokedex = [ 'Onyx', 'Magicarpe', 'Pikachu', 'Tortank' ];
shuffleArray( pokedex );

Exercices B

1/6

1/1