Premiers graphiques avec Jupyter#
Dans cette feuille, nous allons reprendre l’exercice 2 du TD et effectuer un premier dessin.
Attention
Les coordonnées des points ont été changées (pour l’essentiel divisées par 2) par rapport à la feuille de TD. Veillez à utiliser les coordonnées données ici.
Commençons par créer un canvas vert de taille 320 x 240 :
#include "primitives_jupyter.hpp"
RenderWindow window(VideoMode(320, 240), "Ma super fenêtre");
window.canvas
window.clear(Color::Green);
puis dessinons un point noir de coordonnées (209, 71). Ce point est tout petit, vous aurez peut-être un peu de mal à le distinguer :
draw_point(window, {209, 71}, Color::Black );
window.display();
Dessinez un segment blanc entre les points de coordonnées respectives (50,100) et (100,100) :
/// BEGIN SOLUTION
for(int x = 50; x <= 100; x++)
draw_point(window, {x, 100}, Color::White );
/// END SOLUTION
window.display();
Astuce
Astuce
Pour éviter de monter et descendre constamment dans cette feuille, faites un clic droit sur le canvas et cliquez sur «Créer une nouvelle vue pour la sortie» (ou «Create new view for output»). Puis disposez la copie obtenue du canvas sur votre espace de travail de sorte à voir simultanément votre code et le canvas.
Dessinez un segment rouge entre les points (100,150) et (100,200) :
/// BEGIN SOLUTION
for(int y = 150; y <= 200; y++)
draw_point(window, {100, y}, Color::Red );
/// END SOLUTION
window.display();
Dessinez un rectangle horizontal vide de sommets diagonaux (100,100) et (200,150) et de contour rouge :
/// BEGIN SOLUTION
for ( int x = 100; x <= 200; x++ ) {
draw_point(window, {x, 100}, Color::Red);
draw_point(window, {x, 150}, Color::Red);
}
for ( int y = 100; y <= 150; y++ ) {
draw_point(window, {100, y}, Color::Red);
draw_point(window, {200, y}, Color::Red);
}
/// END SOLUTION
window.display()
Dessinez un rectangle horizontal plein noir de sommets diagonaux (200,75) et (250,100) :
/// BEGIN SOLUTION
for ( int x = 200; x <= 250; x++ )
for ( int y = 75; y <= 100; y++ )
draw_point(window, {x, y}, Color::Black);
/// END SOLUTION
window.display()
Dessinez un segment rouge entre les points (200,150) et (250,200) :
/// BEGIN SOLUTION
for ( int t = 0; t <= 50; t++ )
draw_point(window, {200 + t, 150 + t}, Color::Red);
/// END SOLUTION
window.display()
♣ Dessinez un triangle bleu entre les points (0,0), (320,0) et (320,80) :
/// BEGIN SOLUTION
for ( int x = 0; x <= 320; x++ )
for ( int y = 0; y < x / 4; y++ )
draw_point(window, {x, y}, Color::Blue);
/// END SOLUTION
window.display()
Dessinez un cercle noir de centre (207,72) et de rayon 5 :
/// BEGIN SOLUTION
double pi = 3.14159;
int rayon = 5;
double dt = .5 / rayon;
for ( double t = 0; t <= 2*pi; t += dt )
draw_point(window, {207 + rayon * cos(t),
72 + rayon * sin(t)},
Color::Black);
/// END SOLUTION
window.display()
Dessinez un disque jaune de centre (275, 37) et de rayon 25 :
/// BEGIN SOLUTION
int rayon = 25;
for ( int x = -rayon; x <= rayon; x++ )
for ( int y = -rayon; y <= rayon; y++ )
if ( x*x + y*y <= rayon * rayon )
draw_point(window, {275 + x, 37 + y}, Color::Yellow);
/// END SOLUTION
window.display()
Attention
Comme vous l’avez constaté, les performances sont lamentables. C’est parce que nous avons abusé des canvas de HTML : alors que ceux-ci sont conçus pour du dessin vectoriel, nous approximons les figures vectorielles (lignes, triangles, …) par des accumulations d’un très grand nombre de pixels (combien pour le triangle bleu?), sachant que chacun de ces pixels est en fait représenté en interne par un petit rectangle.
En dehors de ce premier dessin – dont l’objectif pédagogique était de faire un peu d’algorithmique – il faut au contraire utiliser les primitives vectorielles fournies.