Pixel Art de triangle avec la libcaca en C++

On va apprendre à faire un peu de base pour le dessin en C++. C'est à dire tracer des lignes avec des coordonnées de points en orienté objet de notre fichier triangle.cpp . Une ligne est un ensemble de point. Et quand on représente une forme dans un terminal (cli) on obtient du pixel art.

Pour corser le tout, on va apprendre à utiliser un algorithme particulier: l'algorithme de Bresenham permet de tracer des lignes entre deux points avec un rendu lisse. L’algorithme ajuste la progression entre les pixels pour minimiser les interruptions et donne un résultat plus fluide.

caca (libcaca)

Description : libcaca (Colour ASCII Art library) est une bibliothèque permettant de convertir des images ou de créer des dessins en ASCII ou en blocs semi-graphiques. Elle est bien adaptée pour faire des graphismes de terminal plus avancés.

Fonctionnalités : support de couleurs, dessins en mode pixel avec des blocs ASCII, support de dessin de lignes et de formes plus fluides.

Installation :

sudo pacman -S libcaca

Exemple d'utilisation : tu peux dessiner des lignes, des cercles et des triangles avec une meilleure précision graphique en utilisant des caractères semi-graphiques.

PREREQUIS DU CODE: Clang en compilateur du fichier triangle.cpp

#include <caca.h>
#include <iostream>
#include <cmath>

class Point {
public:
    int x, y;
    Point(int x = 0, int y = 0) : x(x), y(y) {}
};

class Triangle {
private:
    Point p1, p2, p3;

public:
    Triangle(const Point& p1, const Point& p2, const Point& p3) : p1(p1), p2(p2), p3(p3) {}

    void draw(caca_canvas_t* cv) const {
        drawLine(cv, p1, p2);
        drawLine(cv, p2, p3);
        drawLine(cv, p3, p1);
    }

private:
    // Algorithme de Bresenham pour dessiner une ligne entre deux points
    void drawLine(caca_canvas_t* cv, const Point& start, const Point& end) const {
        int x = start.x, y = start.y;
        int dx = abs(end.x - start.x), dy = abs(end.y - start.y);
        int sx = (start.x < end.x) ? 1 : -1;
        int sy = (start.y < end.y) ? 1 : -1;
        int err = dx - dy;

        while (true) {
            // Dessine le point actuel avec un caractère plein
            caca_put_char(cv, x, y, '#');
            if (x == end.x && y == end.y) break;
            int e2 = 2 * err;
            if (e2 > -dy) { err -= dy; x += sx; }
            if (e2 < dx) { err += dx; y += sy; }
        }
    }
};

int main() {
    // Initialisation de l'écran
    caca_canvas_t *cv = caca_create_canvas(80, 24);
    caca_display_t *dp = caca_create_display(cv);

    if (!dp) {
        std::cerr << "Erreur d'initialisation de libcaca." << std::endl;
        return 1;
    }

    // Définir les sommets du triangle
    Point p1(10, 5);
    Point p2(70, 5);
    Point p3(40, 20);

    // Créer et dessiner le triangle
    Triangle triangle(p1, p2, p3);
    triangle.draw(cv);

    // Afficher le triangle
    caca_refresh_display(dp);

    // Attendre une touche pour quitter
    caca_get_event(dp, CACA_EVENT_KEY_PRESS, NULL, -1);

    // Libérer les ressources
    caca_free_display(dp);
    caca_free_canvas(cv);

    return 0;
}

Pour compiler le code:

clang++ -Wall -Wextra -pedantic -O2 -std=c++23 -o triangle triangle.cpp -lcaca