{"id":2079,"date":"2015-04-10T18:27:58","date_gmt":"2015-04-10T18:27:58","guid":{"rendered":"http:\/\/anthroponaute.fr\/blog-informatique\/?p=2079"},"modified":"2015-04-17T16:13:42","modified_gmt":"2015-04-17T16:13:42","slug":"generation-procedurale-dun-labyrinthe","status":"publish","type":"post","link":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/?p=2079","title":{"rendered":"G\u00e9n\u00e9ration proc\u00e9durale d&rsquo;un labyrinthe 3D"},"content":{"rendered":"<p><a href=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/04\/laby.png\"><img decoding=\"async\" loading=\"lazy\" class=\"alignnone  wp-image-2118\" src=\"https:\/\/anthropoya.cluster014.ovh.net\/blog-informatique\/wp-content\/uploads\/2015\/04\/laby.png\" alt=\"laby\" width=\"458\" height=\"333\" srcset=\"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/04\/laby.png 1220w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/04\/laby-300x218.png 300w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/04\/laby-1024x744.png 1024w, https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/wp-content\/uploads\/2015\/04\/laby-624x454.png 624w\" sizes=\"(max-width: 458px) 100vw, 458px\" \/><\/a><\/p>\n<p><strong>Intro :<\/strong><\/p>\n<p>La g\u00e9n\u00e9ration proc\u00e9durale d&rsquo;un contenu par un quelconque algorithme permet de le cr\u00e9er de mani\u00e8re intelligente !<\/p>\n<p>Dans cet article nous allons voir comment g\u00e9n\u00e9rer \u00e0 la vol\u00e9e un labyrinthe en 3D.<\/p>\n<p><strong>Pr\u00e9requis :<\/strong><\/p>\n<p>\u2013 Savoir lire du C++.<\/p>\n<p>&#8211; Savoir ce qu&rsquo;est un <strong>vertex buffer<\/strong> et un <strong>index buffer<\/strong>.<\/p>\n<p>&#8211; Savoir manipuler un tableau \u00e0 deux dimensions.<\/p>\n<p><strong>Explications :<\/strong><\/p>\n<p>Nous allons utiliser une <strong>classe Array2D<\/strong> qui nous permettra de manipuler un tableau \u00e0 deux dimensions.<\/p>\n<p>Voil\u00e0 le code pour ce tableau sp\u00e9cial et simple d&rsquo;utilisation (Array2D.h) :<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#ifndef ARRAY_2D_H\r\n#define ARRAY_2D_H\r\n\r\n\/\/ Classe pour g\u00e9rer facilement un tableau \u00e0 deux dimensions.\r\ntemplate&lt;typename T&gt;\r\nclass Array2D\r\n{\r\npublic:\r\n\u00a0\u00a0\u00a0 \/\/ Constructeur.\r\n\u00a0\u00a0\u00a0 Array2D(int iWidth = 0, int iHeight = 0) :\r\n\u00a0\u00a0\u00a0 m_iWidth(iWidth),\r\n\u00a0\u00a0\u00a0 m_iHeight(iHeight),\r\n\u00a0\u00a0\u00a0 m_vArray(iWidth*iHeight)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 \/\/ Redimensionner.\r\n\u00a0\u00a0\u00a0 void resize(int iWidth, int iHeight)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_iWidth = iWidth;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_iHeight = iHeight ;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 m_vArray.resize(iWidth*iHeight);\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 inline T&amp; operator() (unsigned int x, unsigned int y)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 assert(((y*m_iWidth) + x) &lt; m_vArray.size());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return m_vArray[ (y*m_iWidth) + x ];\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 inline T&amp; operator[] (int pos)\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return m_vArray[pos];\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 inline const T&amp; operator() (unsigned int x, unsigned int y) const\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 assert(((y*m_iWidth) + x) &lt; m_vArray.size());\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return m_vArray[ (y*m_iWidth) + x ];\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 inline const T&amp; operator[] (int x) const\r\n\u00a0\u00a0\u00a0 {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return m_vArray[pos];\r\n\u00a0\u00a0\u00a0 }\u00a0 \u00a0\r\n\r\n\u00a0\u00a0\u00a0 inline int getWidth() const { return m_iWidth; }\r\n\u00a0\u00a0\u00a0 inline int getHeight() const { return m_iHeight; }\r\n\r\nprivate:\r\n\u00a0\u00a0\u00a0 int m_iWidth; \/\/ Largeur.\r\n\u00a0\u00a0\u00a0 int m_iHeight; \/\/ Hauteur.\r\n\u00a0\u00a0\u00a0 std::vector&lt;T&gt; m_vArray; \/\/ Le vecteur qui va servir de tableau \u00e0 deux dimensions.\r\n};\r\n\r\n#endif\r\n<\/pre>\n<p>Voici le fichier d&rsquo;en-t\u00eate MazeGenerator.h<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\n#ifndef MAZE_GENERATOR_H\r\n#define MAZE_GENERATOR_H\r\n\r\n#include &quot;Array2D.h&quot;\r\n\r\nclass MazeGenerator\r\n{\r\npublic:\r\n\u00a0\u00a0 \u00a0MazeGenerator();\r\n\u00a0\u00a0 \u00a0virtual ~MazeGenerator() {};\r\n\r\n\u00a0\u00a0 \u00a0void generate(const int iRowCellNumber, const int iColumnCellNumber);\r\n\r\n\u00a0\u00a0 \u00a0void computeNeighbourgsCeils();\r\n\r\n\u00a0\u00a0 \u00a0void createMazeNode(scene::ISceneManager* pSceneManager, NewtonWrapper::CollisionManager* pCollisionManager);\r\n\r\n\u00a0\u00a0 \u00a0int generateRandomCellNumber()\r\n\u00a0\u00a0 \u00a0{\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0assert(m_iRowCellNumber &amp;&amp; m_iColumnCellNumber);\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0return rand() % m_iCellNumber;\r\n\u00a0\u00a0 \u00a0}\r\n\r\n\u00a0\u00a0\u00a0 scene::CDynamicMeshBuffer* createMeshBuffer();\r\n\r\nprivate:\r\n\u00a0\u00a0\u00a0 Array2D&lt;MazeCell*&gt; m_aMaze;\r\n\u00a0\u00a0 \u00a0int m_iRowCellNumber;\r\n\u00a0\u00a0 \u00a0int m_iColumnCellNumber;\r\n\u00a0\u00a0 \u00a0int m_iCellNumber;\r\n};\r\n\r\n#endif\r\n<\/pre>\n<p><strong>R\u00e9f\u00e9rences :<\/strong><\/p>\n<p>&#8211; http:\/\/www.mazeworks.com\/mazegen\/mazetut\/<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Intro : La g\u00e9n\u00e9ration proc\u00e9durale d&rsquo;un contenu par un quelconque algorithme permet de le cr\u00e9er de mani\u00e8re intelligente ! Dans cet article nous allons voir comment g\u00e9n\u00e9rer \u00e0 la vol\u00e9e un labyrinthe en 3D. Pr\u00e9requis : \u2013 Savoir lire du C++. &#8211; Savoir ce qu&rsquo;est un vertex buffer et un index buffer. &#8211; Savoir manipuler [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4],"tags":[],"_links":{"self":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/2079"}],"collection":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2079"}],"version-history":[{"count":26,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/2079\/revisions"}],"predecessor-version":[{"id":2254,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=\/wp\/v2\/posts\/2079\/revisions\/2254"}],"wp:attachment":[{"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2079"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2079"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.la-porte-des-nebuleuses.net\/blog-informatique\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2079"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}