Dessiner des fractales
Le Flocon de Von Koch ?
Le flocon de Von Koch est une courbe fractale, c’est-à -dire une figure géométrique dont la structure se répète à l’infini à différentes échelles. Il a été décrit pour la première fois par le mathématicien suédois Helge von Koch en 1904.
La construction du flocon de Von Koch commence avec un segment de droite. À chaque itération, chaque segment est divisé en trois parties égales, et le segment central est remplacé par deux segments formant un triangle équilatéral (sans la base). En répétant ce processus, on obtient une courbe de plus en plus complexe, qui finit par ressembler à un flocon de neige.

En utilisant les modules numpy et matplotlib.pytplot et la récursivité, on obtient le tracé du flocon.
Étape 1 : Importation des bibliothèques
Pour commencer, il faut importer les bibliothèques nécessaires :
| Python |
|---|
| import numpy as np
import matplotlib.pyplot as plt
|
Étape 2 : Fonction pour tracer un segment
À compléter : Écrire la fonction trace_segment(pta, ptb) qui prend deux points en entrée et trace le segment les reliant. Pour cela, il faut placer les deux abscisses dans la liste x et les ordonnées dans la liste y.
.128013it3a;dv,n2.S5wbcy14q: f-up0)_eklohxrP=[s6(]/mg7050g0E0c0e0b0G0O0w0q0G0e0O0O0M010c0b0A010406050O0z0T0T0e0K0r040m0H0G0z0:0H0j050S0`0|0~100^0A04051g191j0S1g0^0g0b0h0(0*0,0.0*0j0U0z0e0U0E0y0A0r0c0I170w0I0b0U0I0G1L0I0c0?050Z0p0G0E1s0+0-011K1M1O1M0c1U1W1S0c0K1h1G0(130O0A0e0j0.0k011Y1u010x0#0E0j0e0T0E1S1@1_1~1!211W24260?0a0w0L0K0H0A0H0O0b160j0w0X1=0K0K0E0q2r19290j1h0S1G2E1.1:1/1T0g2b1v0b0j232o1S1p1r0)1Z2O2Q0j0H2U1S0A2x1h2C2E2+0_1^2s2W1 2!0K0}0G1S0e1J2x0x0.030D0D0q2#0E1O2Z0H0y0s390?0s190e2,2/0@2.2a2;1!2?2^2`2|0E2~01303234362R390y1|040k3e3g1_3i2C2N013n0e2_1h2{0I2}2 31330X3x2!3z0d0?0d3E2B3h0^3I3l0.3L3N053P3R3t3T3w2P3y3a0t0?0t3$1a3(3j2:1t3m0H2@3M3p3Q3r3S3v3V3^3X3a0n0?0n3~2+3)2/3J3-483;3u3U354e383a0P0?0P4k403*433,453o3O3q3s4s3@373z0V0?0V4B3G1k2)192U2H0g1:2M3+014t2T1q1h2(0E2*3h3%4T4t4.2a0b0g0.312C3z0s3p4^4`4c4u4N3a4~0w2f0E514t3W4w3b2E3f413J0F0j0?0b0T2n0K0c4:2D5h4$0o0?0w5r4?422X3K5k040j0{1E5y5t4E015v045x3 4T4D5B0F0?0+5I5R1 5M5O2-5X3m5D0j0A5y0^5P5s3I50014{2/3z3B3/0w5:3?4d543A1}585a4M3_5 5f5z5i5D5m5o5q5-675u5w5W4n4$0j5D0}0c0A0G0H0c1O0p0l1E6o6q6h3k5K5Z6y5A1 5T045V6d5J5B6B6I5$3,5D6o6c4l6C5`4_5;0D4|3a3Z4I5{525c3Y6025596W5b4v6)665,5#4n6$6Y0y3{6#6V5|53643{576+625}701S0S5g6N016F0X0x6T6f5N7f5K0j0x0?1.0e0q0E6X0E0U260j6R4/7a0=040Q7i5B6P0Z7C1 7z0i5y5x7a7E0p7G1!7z0C0v5+6T6^5?4g4 6}6%6/7Y7226746 4f0y4h660w7:7L6i7j0?0J7K6J1 0H0?0M7`7y0?0N7P3,0?0A7F6M7?5B7z83896z5B0T0b0?0B84017z0R7J6d7=8f2=860c7O8e6D7Q828l8h8j8l8n0R7U8x6U516_4y6|7*6(4x6*7)6-637,8M3E7;8r8y85040r808a7|7~8(8s8z048d6?8-8#870e8E8A8I4$8C043d8{5K8n8p2+8Z4o8u8w8;8!8m8`993J8}8 9d4$8F8H9d7W1_4O7Z8O7$0y4P7(6,6~8P9s773f8Y7{3m860G7w5Q8)1!7}040l8l6P6p9G5.9I0.7z7B907D7^8_04937x9S3K0?8%9W7H0?9#3G956j0?336p0K8l9K7 9+1!0O3B020u0z6q0f1V0z0Ea0a20c0f9Z0C9k4/0S4=4U4-4W4*190c4Zam2K2F0e1Vaj0S4X5,0X0Z0#0O04.
Étape 3 : Rotation d’un vecteur de 90 degrés
Pour l'étape 4, on a besoin de tourner un vecteur de 90 degrés dans le sens trigonométrique.
Rappel si \(\overrightarrow{u}\) a pour coordonnées \((x,y)\), son image par la rotation de 90 degrés dans le sens trigonométrique a pour coordonnées \((-y,x)\).
À compléter : Écrivez une fonction rot_90(vecteur) qui retourne le vecteur tourné de 90 degrés.
.128013itadv,n2.Swbcy1: f-up0)_9elohrP=[s(]/mgk050e0A0c0d0b0B0I0r0n0B0d0I0I0G010c0b0v010406050I0u0M0M0d0E0o040k0C0B0u0)0C0h050L0:0=0@0_0.0v040519121c0L190.0e0b0f0X0Z0#0%0Z0h0N0u0d0N0A0t0v0o0c0D100r0D0b0N0D0B1E0D0c0,050S0m0B0A1l0!0$011D1F1H1F0c1N1P1L0c0E1a1z0X0|0I0v0d0h0%0i011R1n010s0U0A0h0d0M0A1L1-1/1@1T1`1P1}1 0,0a0r0F0E0C0v0C0I0b0 0h0r0Q1+0E0E0A0n2k12220h1a0L1z2x1%1)1(1M0e241o0b0h1|2h1L1i1k0Y1S2H2J0h0C2N1L0v2q1a2v2x2!0/1.2l2P1^2T0E0?0B1L0d1C2q0s0%030y0y0n2U0A1H2S0C0t0i0t0p0,0p120d2#2(0-2%232*1T2,2.2:2=0A2@012_2{2}2 2K32320,0i383a1/2x2X0A2x2N2A0e1)2F3f0%2|0Q2M1j1a3B2Z3b2u3S3L3C3d2l0b0e0%2`2v3t351a2;3Z3#3p0Q3r2T3(1?280A3-3V3:31333)3x3X2G010O0,0Q0s3T3z403J010l0,0r472w491m3g0s0,2e0c0y0z0w4f3R3e4i0%0+040J4r4h2Q010h0,0f2r0c0A0u0E4z2v414w0q4r4e4M4a4D040h0v4L2(410C0,0j4Y4t4B4U0@0E0d0o4(2)4u014w0x4P133b0.4`484M3,013$2(3t1=3*0r502`3`2I3s331=0r3@3_3q5b3;5d1L0L390r5p4R4Z4a43042q0c4J114}4g4S4=4w4y5A4s4;4*0,4W4:4!4$5M4T0,4,4.5P5D0,0J0H5U4B4#040t5Z2+4E4G4I4K5G4A1^4w5Y5.5C4B0M0b365(1T4w0K0g4Q5/3g5*2s5,5|4v0,5=2$5@1^5_0,4q5?5s5V040K0K0x0x4r4|2$0L3V3A2Y123E120c3G6y2D2y0d1O3W0L3E4|0Q0S0U0I04.

Pour chaque segment, on veut calculer les cinq points \(M1,M2...,M5\) qui permettent de construire le motif du flocon.
À compléter : Écrivez une fonction cinq_points(pta, ptb) qui retourne les cinq points m1, m2, m3, m4, m5 à partir des points pta et ptb.
m1 et m2 sont les points de départ et d’arrivée.
m3 et m4 divisent le segment en trois parties égales.
m5 est le sommet du triangle équilatéral construit sur le segment central.
.128013it3adv,n2.S5wb*cy+14q: f-up0)_9eklohrP=s6(/mg7050f0G0c0e0b0I0O0x0q0I0e0O0O0N010c0b0B010406050O0A0S0S0e0L0r040l0J0I0A0/0J0i050R0_0{0}0 0@0B04051f181i0R1f0@0f0b0g0%0)0+0-0)0i0T0A0e0T0G0z0B0r0c0K160x0K0b0T0K0I1K0K0c0=050Y0o0I0G1r0*0,011J1L1N1L0c1T1V1R0c0L1g1F0%120O0B0e0i0-0j011X1t010y0!0G0i0e0S0G1R1?1^1}1Z201V23250=0a0x0M0L0J0B0J0O0b150i0x0W1;0L0L0G0q2q18280i1g0R1F2D1-1/1.1S0f2a1u0b0i222n1R1o1q0(1Y2N2P0i0J2T1R0B2w1g2B2D2*0^1@2r2V1~2Z0L0|0I1R0e1I2w0y0-030E0E0q2!0G1N2Y0J0z0d0z0t0=0t180e2+2.0?2-292:1Z2=2@2_2{0G2}012 3133352Q380z1{040j3e3g1^3i2B2M013n0e2^1g2`0K2|2~30320W3x2Z3z0d0=0d3E2A3h0@3I3l0-3L3N053P3R3t3T3w2O3y390u0=0u3$193(3j2/1s3m0J2?3M3p3Q3r3S3v3V3^3X390m0=0m3~2*3)2.3J3-483;3u3U344e37390P0=0P4k403*433,453o3O3q3s4s3@363z0U0=0U4B3G1j2(182T2G0f1/2L3+014t2S1p1g2%0G2)3h3%4T4t4.290b0f0-302B3z3b4I4^4`4c4u4N393b0x2e0G514t3W4w3a1R0R3f413J0H0=0W0y4:2C5i4$0n0=0x5o4?422W3K0y0=0q2O0v0E2m2O0c0O5v5q4E010;040Q5K4D5y0i0=0B0Y5R4n4$5O0h5v5u5S2;5V0c0o5Y3k5M5O0D0w5v0@3 4T3I50014{2.3z3B3/0x5|3?4d543A1|585a4M3_682D3f0x6h5(5Z5M5U040S3d5_2C6j5/5y0J0=0N5%5L5T5+0e5@5.2r640E4|393Z4 4_5}525c3Y6924596N5b4v6Q6f046i6s5x5*6n3#6q6Z6z1~6v046x6*6#4o6B6y5)1Z6.0s6^6k5y5O5Q6*6,3m5+5-6;730-6.0z6}6t6%5W6C726_0-5;7c6$6`0=0R7l3J0S0b3!6D7h4n6G6I0z3{6L6b666d3{576S7D537F5f6g6i783K0=0S4j777i016.6:2*6=4$6m7f7q4$6{7(5:0=712,7V7$5,7+6u0=7b7U6~7e5X7w7d1Z7k7`7 797o7?1~7s0=3D827m84046|8b6?042k0c0E0F0C6E3J707.4/7:75867n047_7Z7P7;7g7/7{800=0D8v8d0p8I0188046)8z7V6.0p8K8g4$0S5A040C0k7T8D837W858V5M8N4A7~8c5N8G7v8%6F6M5~1^3z4h7C6U6c4f0z4h7H257J6P4g7M6Z7O8t6n3}8+7@6/8L8B8L7*9f1~708o7#8u9m8w8y3h7!6l6@8/8p8=9s8J8L8N8a8Q8E8d7p9C8M7t8O8?8s7x8_6H5 4x3p6G6V674y946T657K914y6Y6!8A7R9G9v7P7X9i9r4l8o7y9U0z4P8~9%979|6R958 7E919}3E9,7V5k8i0X0A0L179L6m6o9p7,045$ah9.ak6 0=an9H8(ai8P9Q8(5#9?9daq9nasaB7S9P4T0R4=4U4-4W4*180c4ZaQ2J2E0e1UaN0R4X5^0W0Y0!0O04.
Étape 5 : Construction récursive du flocon
Compléter la fonction récursive flocon(pta, ptb, n) qui trace un coté du flocon de Von Koch entre les points pta et ptb pour n itérations.
- Si
n == 0, on trace simplement le segment.
- Sinon, on calcule les cinq points intermédiaires et on appelle récursivement
flocon sur chaque nouveau segment.
.128013it3adv,n2S5wbcy14q: f-up08)_9eklohrP=s6(/mg7050f0E0c0e0b0G0M0u0o0G0e0M0M0L010c0b0y010406050M0x0Q0Q0e0J0p040k0H0G0x0-0H0i050P0@0_0{0}0=0y04051d161g0P1d0=0f0b0g0#0%0)0+0%0i0R0x0e0R0E0w0y0p0c0I140u0I0b0R0I0G1I0I0c0:050W0n0G0E1p0(0*011H1J1L1J0c1R1T1P0c0J1e1D0#100M0y0e0i0+0j011V1r010v0Y0E0i0e0Q0E1P1;1?1{1X1~1T21230:0a0u0K0J0H0y0H0M0b130i0u0U1/0J0J0E0o2o16260i1e0P1D2B1+1-1,1Q0f281s0b0i202l1P1m1o0$1W2L2N0i0H2R1P0y2u1e2z2B2(0?1=2p2T1|2X0J0`0G1P0e1G2u0v0+030C0C0o2Y0E1L2W0H0w0r0w0q0:0q160e2)2,0;2+272.1X2:2=2@2_0E2{012}2 31332O360w1_040j3c3e1?3g2z2K013l0e2?1e2^0I2`2|2~300U3v2X3x0d0:0d3C2y3f0=3G3j0+3J3L053N3P3r3R3u2M3w370r0:0r3!173$3h2-1q3k0H2;3K3n3O3p3Q3t3T3?3V370l0:0l3|2(3%2,3H3+463/3s3S324c35370N0:0N4i3~3(413*433m3M3o3q4q3=343x0S0:0S4z3E4k3i4C3I4E454G474I3;4b4L370A0:0A4Q2A4S402U4V443,3.483:4a4s4%0w0D0:0D4,2B2#0E2B2R2E0f1-2J3)014r2Q1n1e532%3f3#3E054r5i270b0f0+2~2z3x394G5q5s4`3U4u381`2c0E5z4r5B5v1P0P3d3 3H0F0:0U0v5k2A5O5b0m0:0u5U5o4/2/0v0:0v0G0H30153}5l4B4:0/040O5#5W4U0i0:0y0W5`5=1|5@0h5#5!623k5~0c0n614l5b64665{4:5}045/2*680+5@0B0t5#0=5:5V3G5y015t2,3x3z3-0u6y4#4{3@3y5E225G6z5A4t6C5L3d0u6U676e4U5Q040b5T6v046W4T6j0:6m3f6)5%1X0H0:0L0L6h6o010Q0b0:0z6d6*630:6s6%6u6n4l6G0C5u373X5x5r6O5I6Q7c6L235H4K6J7d3C6V7r6/4m0:1+0e0o0E7a0E0R230i0c706:6p0:5_6%6i2/6a0e7G3H6g6%7t5b6k5 6c7L6`6q6t7Q797b363n797h4|3_0u5F7m4$6J3_2B6T6V7M1X6Z320M0E7Q6f737$7Z787f6A1?3x4f7e7=6I4d0w4f7:6M8e5J4e6S6(7s6U7|3*0:0Q3b86711X7S2(7U5|8u3B8x7H018A6.8s3I8u3Z8G7R0:657T8L6k0Q3{8P83048S8B8U8u4h8T6`6=046^8*6X6+040o2M0s0C2k2M0c0M824U5@7K778y8t045 7P8Y8 8R6_8:7N956b8~5?0:0B85922p7(6B4v7+886P4|4w8j7l7g7n8g4w7_8p8q8%045+5-149g725^9J69048v9M7I8!9b938M9O8O9l8Q9S8/9U6k6-3E8C4:8,0w9T8H6|3a9Q8I9i9k5j6x9r7)4N8d9x7?8g4N9v6N6H8m0w9}7q8q9*9d9G5.9=909=8V9X9_9c8z9a9#8H8V8)9Y8Z8#8K6`9%9.3H9,ay5b9:048was99049j757%9{9o0w4)9~a57iaO7ka49s6JaPa99Daw5*5,ae989h9La)9d0Qarak9U8J9)9E8Wafan8$a#6laB4UaAao3HaDaFa:8H7#aK8P9n8a374~aQaW8g4~a38laSbdaZ7s9Ead9Ia,ama+aG8;a^br9Raua?a|0Q8Fbu9Kbz2Aab9N9(bH8Lb0a{al0+b3a_aI9^5l0P5n1h2$1656160c58b$2H2C0e1S54b!5f6u0U0W0Y0M04.
Étape 6 : Affichage
On affiche le flocon complet avec les appels suivants:
| Python |
|---|
| flocon(np.array([0,0]), np.array([1000,1732]), 5)
flocon(np.array([1000,1732]), np.array([2000,0] ), 5)
flocon(np.array([2000,0]), np.array([0,0] ), 5)
plt.show()
|
Activité 2
En reprenant les codes des fonctions trace_segment et rot_90 on va tracer l'arbre fractale suivant:

La fonction trace_tronc dessine un arbre fractal en utilisant la récursivité : chaque "tronc" se divise en deux branches plus petites à son extrémité, et ce processus se répète jusqu'à ce qu'un certain niveau de profondeur (nb) soit atteint.
Pour tracer les deux branches issues de chaque branche:
-
On crée un vecteur perpendiculaire (sens_trigo) en rotatant le vecteur actuel de 90° (sens trigonométrique) et en le divisant par 3.
-
On appelle récursivement trace_tronc deux fois :
-
Une première fois depuis le haut du tronc et avec un vecteur réduit de moitié et auquel on ajoute sens_trigo (cela fait tourner vers la gauche).
-
Une secone fois depuis le haut du tronc et avec un vecteur réduit de moitié et auquel on retranche sens_trigo (cela faut tourner vers la droite).
À chaque appel, on décrémente nb pour limiter la profondeur de récursion.
Compléter le code suivant
.128013it3a;dv,n2S5wb*cy+14: f-up0)_9eklohrP=s6(/mg7050g0F0c0e0b0H0N0w0q0H0e0N0N0M010c0b0A010406050N0z0R0R0e0K0r040l0I0H0z0.0I0j050Q0^0`0|0~0?0A04051e171h0Q1e0?0g0b0h0$0(0*0,0(0j0S0z0e0S0F0y0A0r0c0J150w0J0b0S0J0H1J0J0c0;050X0o0H0F1q0)0+011I1K1M1K0c1S1U1Q0c0K1f1E0$110N0A0e0j0,0k011W1s010x0Z0F0j0e0R0F1Q1=1@1|1Y1 1U22240;0a0w0L0K0I0A0I0N0b140j0w0V1:0K0K0F0q2p17270j1f0Q1E2C1,1.1-1R0g291t0b0j212m1Q1n1p0%1X2M2O0j0I2S1Q0A2v1f2A2C2)0@1?2q2U1}2Y0K0{0H1Q0e1H2v0x0,030D0D0q2Z0F1M2X0I0y0O0y0t0;0t170e2*2-0=2,282/1Y2;2?2^2`0F2|012~3032342P370y1`040k3d3f1@3h2A2L013m0e2@1f2_0J2{2}2 310V3w2Y3y0d0;0d3D2z3g0?3H3k0,3K3M053O3Q3s3S3v2N3x380u0;0u3#183%3i2.1r3l0I2=3L3o3P3q3R3u3U3@3W380m0;0m3}2)3(2-3I3,473:3t3T334d36380O0;0O4j3 3)423+443n3N3p3r4r3?353y0T0;0T4A3F1i2%172S2F0g1.2K3*014s2R1o1f2$0F2(3g3$4S4s4-280b0g0,2 2A3y3a4H4@4_4b4t4M383a0w2d0F504s3V4v391Q0Q3e403I0G0;0V0x4/2B5h4#0n0;0w5n4=412V3J0x0;1,0e0q0F0D1,150q5u5p4D010:040P5J4C5x0j0;0o0)5F2j0j5I3~4S5R1}5N0i5u5t5%3l0;0h2w0c0F0z0K5Q4m4#5)5+5K5S0;0j0o5_3j5L5N0C0v5u0?5#5o3H4 014`2-3y3A3.0w6e3=4c533z1{57594L3^6q2C3e0w6z5,5`5L5T040J0e135X5H5}5-0,0I0;0M6L6C5 045V0N6J5Z6R645x6O040s6Z5w2:5/5;5?5^6b3h6:5h6m0D4{383Y4~4^6f515b3X6r23586~5a4u716x046A6B6!1}5j040b5m6:7c6*5.04616)3I6$020S0c0f7p4#0R0b0;0B637l0,5N686:6a2+6d6}6g1@3y3`6|6t6o6v3`56737R527T5e6y7b6A5~6+045B5D6^0F0S240j0c7C3I5N5P6=6M3J5U5W5G6Y7`6S5(0;5*7j7(7m6G6I7 5!7J821Y66697?6@6_0y4g7Q756u4e8l72247X704f7!7a7$6z873+0;0N216W1,1J0I7w5L6$6Q867{6E2j0c0D0E7B817d8f0;7_8d8X8C045:2x6.8K6#0;0Q7?7x7z043!8W7D5M0;0C8h8^6l7L6^6h4w3o6@766p4x7V8t8o7S8q4x798z8A8P5A0K5C5E8b8:658Z9o6T898S9n8~5{848,7)8)5=5@9z1Y6$0p9E0,7y3b9I016$8/8O8e9J8=3C9Q8$9N0;6(9V8_6E8E0j8G0K8I9r8304852)7k4n60629!7q0;0y9M9K043c9w9p048|7H8i908k4O8n6n7Y8q4O9974aa8v0ya83D9g9;4#6E7+9m5Y8c4.7{7^9,886H9uaraw7E9y9^an6,8*9DaE8L0;9HaJ5x9}9 9:8B9X049PaR7{9}9UaW9RaT9{aN7)9%9)9+a05x5|a(7m7oa:6N9`9|8=aQata#8ga46=0Q4;4T4,4V4)170c4Yb72I2D0e1Tb40Q4W6a0V0X0Z0N04.
Il est possible d'obtenir des variations en changeant les coefficent de multiplication scalaire pour les branches.
Ici un exemple avec tronc * 2 / 3 +/- rot_90(tronc) / 4)

# Tests(insensible Ă la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)