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