skip to main | skip to sidebar
Code 18
Manuel du savoir-faire à l'usage des geeks et des curieux
RSS
  • Accueil
  • Le web au Québec
  • Liens
  • Twitter
  • Facebook
  • À propos

samedi 28 janvier 2012

Emblème de Montréal en canvas HTML5

Publié par Infinite Loop, à 11:53 0 commentaire

Lorsque j'ai écrit mon dernier billet sur mes expérimentations HTML5, j'ai expliqué comment dessiner un coeur sous prétexte que la St-Valentin approchait. Pour être franc, ce n'était pas mon objectif principal. J'ai eu l'idée de dessiner un coeur lorsque j'ai reçu mon compte de taxes de la ville de Montréal et que j'ai aperçu le logo en forme de rosace composée de 4 coeurs. Le premier billet reflète donc le premier but à atteindre (bien que la façon d'y arriver et le résultat sont différents) et celui d'aujourd'hui démontre comment je suis arrivé à faire une reproduction approximative du logo de Montréal en utilisant le canvas HTML5.

Bien sûr, j'ai triché ici et là alors je laisserai le soin aux designers graphiques soucieux des détails de relever les imprécisions, mon approche de programmeur étant surtout basée sur l'apprentissage du calcul des arcs, cloner le canvas, la translation et rotation d'éléments ainsi que le calcul de courbes quadratiques. Je suis quand même assez satisfait du résultat.

Pour vous aider à suivre, j'ai préparé un graphique pour illustrer les étapes à suivre.



À partir d'un canvas de 500 pixels de côté, je récupère les références, j'applique la couleur rouge aux propriétés du trait et de remplissage et je définis l'épaisseur du tracé avec une valeur qui me semble raisonnable à l'oeil.

var canvas = document.getElementById('myCanvas');
var context = canvas.getContext('2d');

context.strokeStyle = '#CE2123';
context.fillStyle = '#CE2123';
context.lineWidth = 18;
Pour faciliter le travail et pour centrer le logo au milieu du canvas, je déplace mon origine au centre calculé.
context.translate(canvas.width/2, canvas.height/2);
Je crée les deux premiers arcs de cercles qui se trouvent complètement au haut du logo (étape 1).
// arc haut gauche
context.beginPath();
context.arc(-50, -150, 50, 130*(Math.PI/180), 0*(Math.PI/180));
context.stroke();
context.closePath();

// arc haut droit
context.beginPath();
context.arc(50, -150, 50, Math.PI, 50*(Math.PI/180));
context.stroke();
context.closePath();
À l'extrémité de l'arc gauche, je place un cercle central (étape 2). L'idée est que je clonerai ce gabarit pour le dupliquer pour compléter la rosace avec moins d'efforts.
// cercle interne
context.beginPath();
context.arc(-70, -98, 25, 0, Math.PI*2, false);
context.fill();
context.closePath();
Premier clonage et rotation (étape 3).
// copie à gauche avec rotation
context.save();

var canvas1 = canvas.getContext('2d');
context.rotate(270*Math.PI/180);
canvas1.drawImage(canvas, -221, -222);
Deuxième clonage (étape 4).
context.restore();

var canvas2 = canvas.getContext('2d');
context.rotate(180*Math.PI/180);
canvas1.drawImage(canvas, -250, -192);
Enfin, je trace la croix centrale qui donne l'illusion d'une juxtaposition de quatre coeurs (étape 5).
// lignes
context.beginPath();
context.moveTo(0, -100);
context.lineTo(0, 150);
context.closePath()
context.stroke();

context.rotate(90*Math.PI/180);

context.beginPath();
context.moveTo(29, -125);
context.lineTo(29, 125);
context.closePath()
context.stroke();

context.rotate(270*Math.PI/180);

context.translate(0, 27); // centre
context.save();
Ce n'est pas tout. Si on regarde comme il faut le croisement des deux axes qu'on vient de tracer, on voit que chaque angle a une courbure. C'est ici que j'ai utilisé les courbes quadratiques mais j'aurais très bien pu utiliser la composition avec globalCompositeOperation en source-in (étape 6).
// courbes quadratiques pour le centre
context.translate(7, 7);

// la preuve que j'y suis allé à tâton,
// j'étais tanné de remplacer la valeur dans les appels suivants!
var curve = 35;

context.beginPath();
context.moveTo(0, curve);
context.quadraticCurveTo(0, 0, curve, 0);
context.lineTo(0,0);
context.fill();

context.restore();
context.save();

context.translate(-7, 7);

context.beginPath();
context.moveTo(-curve, 0);
context.quadraticCurveTo(0, 0, 0, curve);
context.lineTo(0,0);
context.fill();

context.restore();
context.save();

context.beginPath();

context.arc(0, 0, 3, 0, Math.PI*2, false);
context.fill();
context.closePath();

context.translate(7, -7);

context.beginPath();
context.moveTo(0, -curve);
context.quadraticCurveTo(0, 0, curve, 0);
context.lineTo(0,0);
context.fill();

context.restore();
context.save();

context.translate(-7, -7);

context.beginPath();
context.moveTo(-curve, 0);
context.quadraticCurveTo(0, 0, 0, -curve);
context.lineTo(0,0);
context.fill();
Voilà le logo terminé.



Selon le site de la ville, l'emblème de Montréal, créé en 1981, s'inspire des armoiries et représente une fleur dont les quatre pétales forment une interprétation graphique des initiales de la Ville de Montréal: V et M. Au centre, un croisement rappelle que Montréal a toujours été au carrefour des grandes voies de communication et de civilisation.

Enfin, les quatre coeurs créés par le jeu des lignes représentent l'attachement des Montréalais et des Montréalaises à leur ville. La ligne ondoyante qui encercle l'ensemble stylisé rappelle que Montréal est une île; la forme à la fois végétale et aquatique exprime la richesse de l'environnement naturel et le souci qu'a la population de le préserver (source).


Tags: HTML, JavaScript, Montréal

0 réponse à "Emblème de Montréal en canvas HTML5"


Enregistrer un commentaire

Message plus récent Message plus ancien Accueil
Inscription à : Publier les commentaires (Atom)
    Suivre @code18 sur Twitter

    Catégories

    • Apache (21)
    • Citations (149)
    • Club Vidéo (21)
    • Coffre à outils (59)
    • CSS (8)
    • Curiosités (98)
    • Easter Eggs (23)
    • Extensions Firefox (20)
    • Histoire (14)
    • HTML (29)
    • Humour (53)
    • Intégration (34)
    • iPod (12)
    • JavaScript (107)
    • Jeu de combat (6)
    • Le coin du geek (94)
    • Liens (12)
    • Linux (56)
    • Livres (60)
    • Lois et principes (34)
    • Marché des saveurs (24)
    • Mathématique (17)
    • Montréal (18)
    • Musique (79)
    • Pancartes et écriteaux (14)
    • Perl (8)
    • PHP (126)
    • PostgreSQL (43)
    • Programmation (93)
    • Saviez-vous que (49)
    • SEO (5)
    • SQL Server (22)
    • Sécurité (22)
    • Vieilles publicités (6)
    • Virtualisation (8)
    • Zend Framework (26)

    Divers


    Archives

    • ▼  2012 (34)
      • ►  mars 2012 (6)
        • Citation no. 147 sur le choix d'une guitare
        • Dexter, le tueur qui connaît le HTML
        • Introduction aux CTE de Postgres
        • Mon frigo est plus cool que le vôtre
        • La semaine de travail de 7 jours comme solution
        • 10 constatations du Confoo Montréal 2012
      • ►  février 2012 (15)
        • Un dernier souffle pour mon iPod Touch
        • Zend_Date me fait perdre mon temps avec l'heure d'...
        • Aucun ingrédient imprononçable
        • L'affaire est ketchup
        • Citation no. 146 sur le guitariste
        • Personnage le plus vulgaire de tous les temps
        • Le piège des design patterns
        • Convertir une image couleur à grayscale avec le ca...
        • Mettre sa vie sur pause pendant un moment
        • Quoi faire quand le VPN nous déconnecte après 3 mi...
        • Effet miroir sur une image avec le canvas HTML5
        • Ces imbéciles qui veulent voir la vie en 3D
        • Citation no. 145 sur les langages de programmation...
        • Créer un fichier image à partir du dataURL avec PH...
        • Enregistrement du contenu d'un canvas HTML5
      • ▼  janvier 2012 (13)
        • Dans quel pays se cache André ?
        • Emblème de Montréal en canvas HTML5
        • Dessiner un coeur avec le canvas HTML5 et passer p...
        • Citation no. 144 sur les hommes politiques
        • Dessiner une spirale dans un canvas HTML5
        • L'arnaque des primes MTY dans les restaurants
        • Ahuntsic, d'hier à aujourd'hui
        • C'est urgent parce que ça ne l'est pas
        • Que contient le CV de Dieu ?
        • Logo de Radio-Canada en canvas HTML5
        • Canvas 2D HTML5 en 10 étapes faciles
        • Coup de coeur musical
        • Citation no. 143 sur le chien et le chat
    • ►  2011 (146)
      • ►  décembre 2011 (14)
        • Les bonnes parties de PHP, vraiment ?
        • Combien pèse le cerveau d'un imbécile ?
        • Les vrais programmeurs ninjas codent avec un verre...
        • Quand Google hurle, il faut être à l'affût
        • 32 gigaoctets de Coke = 4 Go diète
        • Faire pousser des légumes en hiver
        • Citation no. 142 sur la superstition
        • Vegemite, la mort noire
        • Cinéma-Twit et Parodies sur Terre
        • Preuve de concept : 1 guitare, 8 manches
        • L'humour du programmeur et son icône monstrueux
        • Citation no. 141 sur la merde
        • Retour vers le passé et voyage dans le temps avec ...
        • Fonction PHP pour formater l'heure
      • ►  novembre 2011 (11)
        • Le plaisir insoupçonné de manger du Velveeta
        • Choisir le bon symbole
      • ►  octobre 2011 (12)
      • ►  septembre 2011 (13)
      • ►  août 2011 (15)
      • ►  juillet 2011 (17)
      • ►  juin 2011 (18)
      • ►  mai 2011 (15)
      • ►  avril 2011 (9)
      • ►  mars 2011 (7)
      • ►  février 2011 (3)
      • ►  janvier 2011 (12)
    • ►  2010 (398)
      • ►  décembre 2010 (29)
      • ►  novembre 2010 (28)
      • ►  octobre 2010 (32)
      • ►  septembre 2010 (34)
      • ►  août 2010 (22)
      • ►  juillet 2010 (35)
      • ►  juin 2010 (42)
      • ►  mai 2010 (36)
      • ►  avril 2010 (37)
      • ►  mars 2010 (34)
      • ►  février 2010 (32)
      • ►  janvier 2010 (37)
    • ►  2009 (431)
      • ►  décembre 2009 (32)
      • ►  novembre 2009 (34)
      • ►  octobre 2009 (33)
      • ►  septembre 2009 (37)
      • ►  août 2009 (37)
      • ►  juillet 2009 (40)
      • ►  juin 2009 (38)
      • ►  mai 2009 (37)
      • ►  avril 2009 (35)
      • ►  mars 2009 (37)
      • ►  février 2009 (32)
      • ►  janvier 2009 (39)
    • ►  2008 (84)
      • ►  décembre 2008 (34)
      • ►  novembre 2008 (39)
      • ►  octobre 2008 (11)

    Membres

Copyright © All Rights Reserved. Code 18 | Converted into Blogger Templates by Theme Craft