From 3eaf77e4b27a9ed06e64dda2d31ce444b5e0010f Mon Sep 17 00:00:00 2001
From: BELARIBI NADJIB <nbelaribi@etu.unistra.fr>
Date: Sat, 4 Apr 2020 02:47:24 +0200
Subject: [PATCH] add recursive shapes

---
 TP_Geom3D_2018/Projet_modeling/main.cpp | 127 ++++++++++++++++++++----
 1 file changed, 109 insertions(+), 18 deletions(-)

diff --git a/TP_Geom3D_2018/Projet_modeling/main.cpp b/TP_Geom3D_2018/Projet_modeling/main.cpp
index 96eb4be..7ce6d68 100644
--- a/TP_Geom3D_2018/Projet_modeling/main.cpp
+++ b/TP_Geom3D_2018/Projet_modeling/main.cpp
@@ -20,13 +20,13 @@ const Vec3 NOIR    = {0,0,0};
 void draw_repere(const Primitives& prim, const Mat4& tr)
 {
     prim.draw_sphere(tr, BLANC);
-    prim.draw_cylinder(tr*translate(1,0,0)* scale(2,0.5,0.5) * rotateY(90) , ROUGE); // X
-    prim.draw_cylinder(tr*translate(0,1,0)*  scale(0.5,2,0.5) * rotateX(90)  , VERT); //Y
-    prim.draw_cylinder(tr*translate(0,0,1) * scale(0.5,0.5,2) , BLEU); //Z
+    prim.draw_cylinder(tr*translate(1,0,0)* scale(1,0.25,0.25) * rotateY(90) , ROUGE); // X
+    prim.draw_cylinder(tr*translate(0,1,0)*  scale(0.25,1,0.25) * rotateX(90)  , VERT); //Y
+    prim.draw_cylinder(tr*translate(0,0,1) * scale(0.25,0.25,1) , BLEU); //Z
 
-    prim.draw_cone(tr*translate(2,0,0)* rotateY(90), ROUGE);
-    prim.draw_cone(tr*translate(0,2,0)* rotateX(-90), VERT);
-    prim.draw_cone(tr*translate(0,0,2), BLEU);
+    prim.draw_cone(tr*translate(0,1,0)* rotateX(-90), VERT);
+    prim.draw_cone(tr*translate(1,0,0)* rotateY(90), ROUGE);
+    prim.draw_cone(tr*translate(0,0,1), BLEU);
 }
 
 
@@ -53,22 +53,76 @@ void spirale(MeshQuad& m)
      #pragma omp parallel for
     for(int i = 0 ; i < 250 ; i++)
     {
-          m.transfo_quad(4,rotateX(10)*translate(0.11,0,0)*scale(0.99)) ;
-          m.extrude_quad(4) ;
+          m.transfo_quad(12,rotateY(10)*translate(0,0.11,0)*scale(0.99)) ;
+          m.extrude_quad(12) ;
     }
 
 }
-void test(MeshQuad& m ,int q, int n )
+
+void inside_shape(MeshQuad& m,int q, int count)
+{
+    int index;
+    if(count > 0)
+    {
+        m.extrude_quad(q);
+        m.extrude_quad(q);
+        m.shrink_quad(q,0.9f);
+        m.tourne_quad(q,5) ;
+        m.extrude_quad(q);
+        m.shrink_quad(q,0.5f);
+        m.extrude_quad(q);
+        m.decale_quad(q,1.2f);
+
+       index = m.nb_quads()*4;
+
+       inside_shape(m,q, count-1);
+
+       inside_shape(m,index-4, count-1);
+       inside_shape(m,index-8, count-1);
+
+       inside_shape(m,index-12, count-1);
+       inside_shape(m,index-16, count-1);
+
+    }
+}
+
+void inside_shape2(MeshQuad& m,int q, int count)
 {
-    if(n > 0)
+    int index;
+    if(count > 0)
     {
         m.extrude_quad(q) ;
-        m.extrude_quad(q+16) ;
-        m.extrude_quad(q+8) ;
-        m.shrink_quad(q+4,0.85);
+        m.extrude_quad(q) ;
+        m.shrink_quad(q,0.5f) ;
+        m.extrude_quad(q) ;
+         m.decale_quad(q,5);
+
+       index = m.nb_quads()*4;
+
+       inside_shape2(m,q, count-1);
+
+       inside_shape2(m,index-4, count-1);
+       inside_shape2(m,index-8, count-1);
+
+       inside_shape2(m,index-12, count-1);
+       inside_shape2(m,index-16, count-1);
+    }
+}
+
+void inside_shape3(MeshQuad& m,int q, int count)
+{
+    if(count > 1){
 
+        #pragma omp parallel for
+        for(int i = 0 ; i < 17 ; i++)
+         {
+            m.extrude_quad(q) ;
+            m.transfo_quad(q,rotateX(20)) ;
+
+         }
+         int index = count * 16 ;
+         inside_shape3(m,index,count -1) ;
 
-      test(m,q+4,n-1) ;
     }
 
 }
@@ -76,9 +130,39 @@ void test(MeshQuad& m ,int q, int n )
 void shape1(MeshQuad& m )
 {
     m.create_cube() ;
-    test(m,4,3) ;
+    #pragma omp parallel for
+    for(int i = 0 ; i < 6 ; i++)
+        inside_shape(m,4*i,3) ;
+
+}
+
+void shape2(MeshQuad& m )
+{
+    m.create_cube() ;
+
+    for(int i = 0 ; i < 8; i++)
+     {
+       m.extrude_quad(12) ;
+       m.transfo_quad(12,rotateY(18)) ;
+       m.extrude_quad(16) ;
+       m.transfo_quad(16,rotateY(-18)) ;
+     }
+
+
+    inside_shape2(m,12,3) ;
+    inside_shape2(m,16,3) ;
+
 
 }
+
+void shape3(MeshQuad& m )
+{
+    m.create_cube() ;
+    inside_shape3(m,12,18) ;
+
+}
+
+
 int main(int argc, char *argv[])
 {
     Primitives prim;
@@ -104,7 +188,7 @@ int main(int argc, char *argv[])
         mesh.set_matrices(viewer.getCurrentModelViewMatrix(),viewer.getCurrentProjectionMatrix());
         prim.set_matrices(viewer.getCurrentModelViewMatrix(),viewer.getCurrentProjectionMatrix());
 
-        mesh.draw(CYAN);
+        mesh.draw(BLANC);
 
         if (selected_quad>=0)
         {
@@ -113,7 +197,6 @@ int main(int argc, char *argv[])
          }
     };
 
-    Mat4 transfo  =translate(0,1,0) ;
     // to do when key pressed
     viewer.f_keyPress = [&] (int key, Qt::KeyboardModifiers mod)
     {
@@ -164,7 +247,15 @@ int main(int argc, char *argv[])
             case Qt::Key_1:
                 shape1(mesh) ;
                 break ;
-             // ....
+
+            case Qt::Key_2:
+                 shape2(mesh) ;
+                 break ;
+
+            case Qt::Key_3:
+                shape3(mesh) ;
+                break ;
+                 // ....
 
                 // Attention au cas m_selected_quad == -1
             default:
-- 
GitLab