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