1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
   |  
class Mesh
{
 
private:
 
    struct HalfEdge
    {
        // first, c'est les coordonnées du point de départ de l'HalfEdge. Il pointe sur un élément de "points".
        sf::Vector2i* first;
        HalfEdge* next;
        HalfEdge* pair;
        bool fixed; // inutile ici, c'est juste pour savoir si l'HalfEdge est un mur ou non.
    };
 
    std::vector<HalfEdge> mesh;
    std::vector<sf::Vector2i> points;
 
public:
 
    /* IntRect est une classe de la bibli SFML : c'est un simple rectangle. left = coordonnées x du coté de tout à gauche, top = coordonnées en y du coté tout en haut, width = longueur et height = hauteur */
/* ce superRectangle que je construit est destiné à recevoir tous les autres points que j'insèrerai par la suite et qui devront être triangulés. */
    Mesh(sf::IntRect const &superRectangle)
    {
        // Encore une classe de la SFML : sf::Vector2i c'est comme un std::pair<int,int>, sauf qu'on écrit .x et .y pour .first et .second
        sf::Vector2i A,B,C,D;
 
        A = {superRectangle.left,superRectangle.top};                                               // haut-gauche
        B = {superRectangle.left+superRectangle.width,superRectangle.top};                          // haut-droite
        C = {superRectangle.left,superRectangle.top+superRectangle.height};                         // bas-gauche
        D = {superRectangle.left+superRectangle.width,superRectangle.top+superRectangle.height};    // bas-droite
 
        points = {A,B,C,D};
 
        // ici, je suis obligé de créer en avance les 6 éléments du vector, parce que les tous éléments pointent sur les autres.
        mesh.resize(6);
 
        mesh[0] = {&points[0],&mesh[1],NULL,true};          // 0
        mesh[1] = {&points[1],&mesh[2],&mesh[3],false};     // 1
        mesh[2] = {&points[2],&mesh[0],NULL,true};          // 2
        mesh[3] = {&points[2],&mesh[4],&mesh[1],false};     // 3
        mesh[4] = {&points[1],&mesh[5],NULL,true};          // 4
        mesh[5] = {&points[3],&mesh[3],NULL,true};          // 5
 
        /* Supposons maintenant que je veuille ajouter un HalfEdge qui partirait du point {50,50}, et dont le HalfEdge suivant serait celui qui part du point {0,0}. Voici ce que ça donne : */
        points.push_back({50,50});
        mesh.push_back({&points[4],&mesh[0],NULL,false});   // 6
 
        /* on vérifie que les insertions se sont faites normalement, et là c'est le drame... */
        this->test();
    }
 
    void test()
    {
        for (auto i : mesh)
        {
            std::cout<<"edge("<<i.first->x<<","<<i.first->y<<")->("<<i.next->first->x<<","<<i.next->first->y<<") | ";
            std::cout<<std::endl;
        }
    }
};
 
int main()
{
    Mesh mesh(sf::IntRect(0,0,800,600));
 
return 0;
} | 
Partager