Kamis, 13 September 2018

Belajar Pemrograman Python: membuat fractal segitiga (Rekursif)

Postingan ini adalah kelanjutan dari postingan sebelumnya Belajar Pemrograman Python: membuat fractal segitiga. Pembahasan kali ini lebih ke arah penggunaan teknik rekursif untuk pemecahan masalah yang sama. (Sebaiknya pelajari terlebih dahulu postingan sebelumnya tentang Belajar Pemrograman Python: membuat fractal segitiga)

Pada postingan sebelumnya terdapat lima (5) buah function utama untuk bisa menggambar (membuat fractal segitiga). kelima function itu adalah:

      triangle_1(some_pen,size)   #untuk membuat segitiga kecil (level 0)
      triangle_2(some_pen,size)   #untuk membuat segitiga lebih besar (level 1)
      triangle_3(some_pen,size)   #untuk membuat segitiga lebih besar (level 2)
      triangle_4(some_pen,size)   #untuk membuat segitiga lebih besar (level 3)
      draw()                      #untuk setting pena dan menjalankan triangle_4

dari kelima function tersebut, Kita akan fokus pada 4 function utama untuk membuat susunan segitiga fractal yaitu triangle+1, triangle_2, triangle_3, dan triangle_4. Perhatikan lagi bahwa function yang dipanggil adalah triangle_4, dan saat triangle_4 dieksekusi maka dia akan memanggil triangle_3, saat triangle_3 dieksekusi maka akan memanggil triangle_2, dan saat triangle_2 dieksekusi akan memanggil triangle_1. 

Dari sini dapat kita pelajari bahwa function triangle_2, triangle_3, dan triangle_4 sangat identik sehingga dapat diringkas menjadi suatu function yang bersifat rekursif. 

Sedangkan triangle_1 adalah sebagai function paling dasar. Oleh karena itu pada saat membuat function rekursif maka triangle_1 akan menjadi bagian paling ujung (stoping, penyetop fungsi rekursif).

Baik, berikut adalah function rekursif (saya namakan fractal) yg sudah Saya buat berdasar function triangle sebelumnya.

def fractal(level,some_pen,size):
    if (level==0):
        some_pen.begin_fill()
        some_pen.right(60)
        for i in range(1,3):
            some_pen.forward(size)
            some_pen.right(120)
        some_pen.forward(size)
        some_pen.end_fill()
    else:
        fractal(level-1,some_pen,size)
        some_pen.right(120)
        some_pen.forward((2**(level-1))*size)
        some_pen.left(60)
        fractal(level-1,some_pen,size)
        some_pen.left(120)
        some_pen.forward((2**(level-1))*size)
        some_pen.right(180)
        fractal(level-1,some_pen,size)
        some_pen.forward((2**(level-1))*size)



function ini memiliki tiga parameter input yaitu level, some_pen, dan size. Kalo dibandingkan dengan function triangle sebelumnya yang hanya dua parameter maka ada satu parameter tambahan yang berbeda yaitu "level". Parameter "level" ini menentukan mau membuat gambar segitiga fraktal sampai level berapa. Dengan catatan level 0 adalah saat hanya menggambar segitiga kecil saja. sebagai contoh dipostingan sebelumnya Saya hanya menggambar segitiga fraktal sampai dilevel 3 atau sampai di triangle_4.

Perhatikan bahwa if (level==0) berisi barisan perintah persis seperti function triangle_1. Karena ini akan menjadi bagian ujung (tidak lagi memanggil function yang lain saat dijalankan).

Sedangkan pada bagian else, berisi barisan perintah yang hampir sama dengan function triangle_2, triangle_3 dan triangle_4. Yang mana "function fractal" ini juga memanggil "dirinya sendiri" pada level yang lebih rendah. Hal ini juga terjadi pada function triangle_4 yang memanggil triangle_3 dan seterusnya.

Dengan menggunakan "function fractal" ini, jika kita ingin membuat segitiga fraktal level 7 misalnya, maka cukup memanggil function ini dengan menyertakan level 7 sebagai input. Tidak perlu membuat function ulang triangle_7, triangle_6, triangle_5, dan seterunya. Sehingga source code lebih ramping dan lebih mudah dibaca. (Pada contoh kasus ini lebih efisien).

Berikut adalah kode lengkapnya:


import turtle

def fractal(level,some_pen,size):
    if (level==0):
        some_pen.begin_fill()
        some_pen.right(60)
        for i in range(1,3):
            some_pen.forward(size)
            some_pen.right(120)
        some_pen.forward(size)
        some_pen.end_fill()
    else:
        fractal(level-1,some_pen,size)
        some_pen.right(120)
        some_pen.forward((2**(level-1))*size)
        some_pen.left(60)
        fractal(level-1,some_pen,size)
        some_pen.left(120)
        some_pen.forward((2**(level-1))*size)
        some_pen.right(180)
        fractal(level-1,some_pen,size)
        some_pen.forward((2**(level-1))*size)

def draw():
    window = turtle.Screen()
    window.bgcolor("red")

    pen = turtle.Turtle()

    pen.penup()
    pen.sety(200)
    pen.pendown()

    pen.shape("turtle")
    pen.color("blue")
    pen.speed(1)

    fractal(5,pen,10)

    window.exitonclick()

draw()
 


Dan berikut adalah hasil runningnya:




Developed by: 
Muhammad Nurul Puji
Project-H

Tidak ada komentar:

Posting Komentar

Selamat berinovasi :D Salam berbagi..

Cara mengetahui ip address raspberry atau perangkat lain yg terhubung pada wifi yg sama

1. Install nmap [jika belum ada]: sudo apt install nmap 2. Cek ip address komputer (yg akses ke wifi yang sama): ip addr misal hasilnya 192....