From cd73c7c40d4776402d511e0364f72f698308b0fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicolas=20M=2E=20Thi=C3=A9ry?= <nthiery@users.sf.net> Date: Sun, 26 Nov 2023 23:07:17 +0100 Subject: [PATCH] =?UTF-8?q?Pr=C3=A9paration?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gradebook.db | Bin 192512 -> 196608 bytes premier-dessin.md | 127 +++++++++++++++++++++++++++++++++++------ primitives_jupyter.hpp | 103 +++++++++++---------------------- 3 files changed, 142 insertions(+), 88 deletions(-) diff --git a/.gradebook.db b/.gradebook.db index d6d2109f19e0816f026e2148fb689d56f33ff532..411a3a6152bf69f0c4cbc8e6d4ab9f26c7931425 100644 GIT binary patch delta 7358 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 H^6vitP4vDS delta 2906 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 diff --git a/premier-dessin.md b/premier-dessin.md index 22ce573..1f8fbfe 100644 --- a/premier-dessin.md +++ b/premier-dessin.md @@ -14,6 +14,15 @@ kernelspec: # Premiers graphiques avec Jupyter ++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "f43a760bd6125e25df23a9ab2628c3e9", "grade": false, "grade_id": "cell-db040b06c5a92100", "locked": true, "schema_version": 3, "solution": false, "task": false}} + +Dans cette feuille, nous allons reprendre l'exercice 2 du TD et +effectuer un premier dessin. + ++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "f4cbf5563a6542f5c409f308fdca30a3", "grade": false, "grade_id": "cell-db040b06c5a92101", "locked": true, "schema_version": 3, "solution": false, "task": false}} + +Commençons par créer un canvas vert de taille 640 x 480 : + ```{code-cell} --- deletable: false @@ -37,35 +46,44 @@ deletable: false editable: false nbgrader: cell_type: code - checksum: bca96fdfc7023d461b707c8ae74b0caa + checksum: 9d359d2bf83f09dfcd9eb723473a197f grade: false grade_id: cell-c2afd88f340f46f4 locked: true schema_version: 3 solution: false task: false +tags: [] --- -RenderWindow window(VideoMode(900, 480), "Ma super fenêtre"); +RenderWindow window(VideoMode(640, 480), "Ma super fenêtre"); +window.canvas ``` -<canvas id='primitives_canvas'></canvas> - ```{code-cell} window.clear(Color::Green); ``` ++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "7df12946868397e5fbe4bc994fb8d19c", "grade": false, "grade_id": "cell-db040b06c5a92102", "locked": true, "schema_version": 3, "solution": false, "task": false}} + +puis dessinons un point noir de coordonnées (418, 143). Ce point est +tout petit, vous aurez peut-être un peu de mal à le distinguer : + ```{code-cell} -// Dessine un point noir de coordonnées (418, 143) draw_point(window, {418, 143}, Color::Black ); window.display(); ``` ++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "d8948ac8886182d90df0fb2bce302b52", "grade": false, "grade_id": "cell-db040b06c5a92103", "locked": true, "schema_version": 3, "solution": false, "task": false}} + +1. Dessinez un segment blanc entre les points de coordonnées + respsectives (100,200) et (200,200) : + ```{code-cell} --- deletable: false nbgrader: cell_type: code - checksum: b956b1c98520d602fab742ceb67096ed + checksum: ce1d6a0deeef3221d1ea8d9afbd40bce grade: true grade_id: cell-e77db2d9ed7265ac locked: false @@ -74,17 +92,31 @@ nbgrader: solution: true task: false --- -// Dessine un segment blanc entre les points (100,200) et (200,200) // REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE window.display(); ``` ++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "2be96f003c2555d67d32213924f40a59", "grade": false, "grade_id": "cell-db040b06c5a92104", "locked": true, "schema_version": 3, "solution": false, "task": false}} + +:::{tip} Astuce + +Pour éviter de monter et descendre constamment dans cette feuille, +faites un clic droit sur le canvas et cliquez sur «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. + +::: + ++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "fea5730c56d940cd6a18b432d9069629", "grade": false, "grade_id": "cell-db040b06c5a92105", "locked": true, "schema_version": 3, "solution": false, "task": false}} + +2. Dessinez un segment rouge entre les points (200,300) et (200,400) : + ```{code-cell} --- deletable: false nbgrader: cell_type: code - checksum: 85bdbd533e19a61d9a8a460522c51477 + checksum: 90954d14f326667b7a51643cd5d83bc0 grade: true grade_id: cell-03b3d3f225c29d1d locked: false @@ -93,17 +125,21 @@ nbgrader: solution: true task: false --- -// Dessine un segment rouge entre les points (200,300) et (200,400) // REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE window.display(); ``` ++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "0791571f18f4df2c2bfecb5a3ba9c0ff", "grade": false, "grade_id": "cell-db040b06c5a92106", "locked": true, "schema_version": 3, "solution": false, "task": false}} + +3. Dessinez un rectangle horizontal vide de sommets diagonaux + (200,200) et (400,300) et de contour rouge : + ```{code-cell} --- deletable: false nbgrader: cell_type: code - checksum: dea1bd15783375ceace4d093b9200ec4 + checksum: 4c65f8e4cec21af229e5a44dd7063a03 grade: true grade_id: cell-3606e0158c83309d locked: false @@ -112,17 +148,21 @@ nbgrader: solution: true task: false --- -// Dessine un rectangle horizontal vide de sommets diagonaux (200,200) et (400,300) et de contour rouge // REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE window.display() ``` ++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "4eda0a34767a781e0fd3c186999331e2", "grade": false, "grade_id": "cell-db040b06c5a92107", "locked": true, "schema_version": 3, "solution": false, "task": false}} + +4. Dessinez un rectangle horizontal plein noir de sommets diagonaux + (400,150) et (500,200) : + ```{code-cell} --- deletable: false nbgrader: cell_type: code - checksum: 8d1e034e1cda25ee20a1c154f6f26185 + checksum: f66e8172c61aca3cb946861a95326520 grade: true grade_id: cell-25abe8a7c6c8c617 locked: false @@ -131,17 +171,21 @@ nbgrader: solution: true task: false --- -// Dessine un rectangle horizontal plein noir de sommets diagonaux (400,150) et (500,200) // REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE window.display() ``` ++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "2f11cf73501e6fcc67b66d7ced218656", "grade": false, "grade_id": "cell-db040b06c5a92108", "locked": true, "schema_version": 3, "solution": false, "task": false}} + +5. Dessinez un segment rouge entre les points (400,300) et + (500,400) : + ```{code-cell} --- deletable: false nbgrader: cell_type: code - checksum: 196d46fbc53bc7393b523ace887864ab + checksum: 49650230393c3fc8d743c211525de50c grade: true grade_id: cell-c6d75131df2bea6d locked: false @@ -150,17 +194,42 @@ nbgrader: solution: true task: false --- -// Dessine un segment rouge entre les points (400,300) et (500,400) // REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE window.display() ``` ++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "34955bd551a86d7f66e34edca2617cab", "grade": false, "grade_id": "cell-db040b06c5a92109", "locked": true, "schema_version": 3, "solution": false, "task": false}} + +6. ♣ Dessinez un triangle bleu entre les (0,0), (640,0) et (0,160) : + +```{code-cell} +--- +deletable: false +nbgrader: + cell_type: code + checksum: de3439e6f2af1c2ebadec5e92840b900 + grade: true + grade_id: cell-c6d75131df2bea6e + locked: false + points: 1 + schema_version: 3 + solution: true + task: false +--- +// REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE +window.display() +``` + ++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "16aaa6f47064b571ba75a417797361e4", "grade": false, "grade_id": "cell-db040b06c5a92110", "locked": true, "schema_version": 3, "solution": false, "task": false}} + +7. Dessinez un cercle noir de centre (415,145) et de rayon 10 : + ```{code-cell} --- deletable: false nbgrader: cell_type: code - checksum: 783c0f2dd02e54533dd5243b34fe2ccd + checksum: e56a4a8d478945ff8d1ef1c4497dcf05 grade: true grade_id: cell-63406c09d76b868b locked: false @@ -169,17 +238,20 @@ nbgrader: solution: true task: false --- -// Dessine un cercle noir de centre (415,145) et de rayon 10 // REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE window.display() ``` ++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "92e964b26520043007e0fe1972b38638", "grade": false, "grade_id": "cell-db040b06c5a92111", "locked": true, "schema_version": 3, "solution": false, "task": false}} + +8. Dessinez un disque jaune de centre (550, 75) et de rayon 50 : + ```{code-cell} --- deletable: false nbgrader: cell_type: code - checksum: cfc9ac790998bab53ad2de41b30f2f6d + checksum: 6419729d5f34a928308cdd11942a3f1a grade: true grade_id: cell-4f7332edb4646cbf locked: false @@ -188,8 +260,25 @@ nbgrader: solution: true task: false --- -// Dessine un disque jaune de centre (700, 100) et de rayon 50 // REMPLACEZ CETTE LIGNE PAR VOTRE RÉPONSE window.display() ``` ++++ {"deletable": false, "editable": false, "nbgrader": {"cell_type": "markdown", "checksum": "ef878f93df33be50d5262273cefbc00a", "grade": false, "grade_id": "cell-db040b06c5a92112", "locked": true, "schema_version": 3, "solution": false, "task": false}} + +:::{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. + +::: + diff --git a/primitives_jupyter.hpp b/primitives_jupyter.hpp index 99679ab..a097185 100644 --- a/primitives_jupyter.hpp +++ b/primitives_jupyter.hpp @@ -1,3 +1,6 @@ +#ifndef PRIMITIVES_JUPYTER_H +#define PRIMITIVES_JUPYTER_H + /** Variante de primitives.h pour dessiner dans Jupyter, sans la SFML @@ -11,48 +14,16 @@ NE PRENNEZ PAS EXEMPLE DESSUS! **/ -#include <iostream> -#include <sstream> -#include <xwidgets/xhtml.hpp> - -/** Execute javascript code in the Jupyter window - **/ -void execute_javascript(std::string js) { - nl::json mime_bundle; - mime_bundle["application/javascript"] = js; - ::xeus::get_interpreter().display_data(mime_bundle, - nl::json::object(), - nl::json::object()); -} - -void load_javascript_library() { - execute_javascript(R"js( -document.primitives_get_context = function() { - return document.primitives_canvas.getContext('2d'); -} -document.primitives_draw_rectangle = function(x, y, width, height, color) { - var ctx = document.primitives_get_context(); - ctx.strokeStyle = color; - ctx.strokeRect(x, y, width, height); -} -document.primitives_draw_filled_rectangle = function(x, y, width, height, color) { - var ctx = document.primitives_get_context(); - ctx.fillStyle = color; - ctx.fillRect(x, y, width, height); -} -document.primitives_draw_point = function(x, y, color) { - document.primitives_draw_rectangle(x, y, 1, 1, color); -} -)js"); -} +#include <xcanvas/xcanvas.hpp> namespace Color { using Color = std::string; - Color White = "white"; - Color Red = "red"; - Color Yellow = "yellow"; - Color Green = "#00FF00"; - Color Black = "black"; + Color White = "White"; + Color Blue = "Blue"; + Color Red = "Red"; + Color Yellow = "Yellow"; + Color Green = "#00CC00"; + Color Black = "Black"; } class Point { @@ -70,49 +41,43 @@ class VideoMode { VideoMode(int w, int h): width(w), height(h) {} }; +using Canvas = xw::xmaterialize<xc::xcanvas>; + class RenderWindow { - xw::html html; VideoMode vm; public: - // A buffer of javascript commands to execute - std::ostringstream buffer; + Canvas canvas; + RenderWindow(VideoMode _vm, std::string s) : vm(_vm) { - std::ostringstream canvas; - // canvas << "<canvas id='primitives_canvas'" - // << " width=" << vm.width << " height=" << vm.height - // << " style='border:1px solid #000000;'></canvas>"; - load_javascript_library(); - buffer << "document.primitives_canvas = document.getElementById('primitives_canvas');"; - buffer << "document.primitives_canvas.height = " << vm.height << ";"; - buffer << "document.primitives_canvas.width = " << vm.width << ";"; - buffer << "document.primitives_canvas.style = 'border:1px solid #000000';"; - display(); - // Disabled until xwidgets is functional again - // For now, the canvas needs to be created in a markdown cell of the notebook - // html.value = canvas.str(); - // html.display(); + vm = _vm; + canvas = xc::canvas().initialize() + .width(vm.width) + .height(vm.height) + .finalize(); + canvas.cache(); } - // Update the canvas by executing all javascript commands in the buffer - void display() { - execute_javascript(buffer.str()); - buffer = std::ostringstream(); + Canvas& get_canvas() { + return canvas; } // Clear the canvas with the given color void clear(Color::Color color) { - buffer << "document.primitives_draw_filled_rectangle(0, 0, " - << vm.width << ", " - << vm.height << ", '" - << color << "');"; - display(); + canvas.fill_style = color; + canvas.fill_rect(0, 0, vm.width, vm.height); + display(); + } + + void display() { + canvas.flush(); + canvas.cache(); } }; void draw_point(RenderWindow &window, Point p, Color::Color color) { - window.buffer << "document.primitives_draw_point(" - << p.x << ", " - << p.y << ", '" - << color << "');"; + window.canvas.fill_style = color; + window.canvas.fill_rect(p.x, p.y, 1, 1); } + +#endif -- GitLab