Senin, 10 September 2018

Belajar Pemrograman Python: membuat fractal segitiga

Saat ini banyak sekali media-media pembelajaran online baik gratis maupun berbayar. Nah saat ini Saya mencoba untuk memanfaatkan pembelajaran online melalui Udacity. Udacity menyediakan kursus gratis maupun paket berbayar. Yang akan Saya share di sini adalah salah satu tugas dari kursus "Programming Foundations with Python" di Udacity, kursus ini gratis kok (sejauh ini gratis.hehe). Nah kira-kira salah satu tugasnya adalah membuat program untuk menggambar segitiga sebagai berikut:

Salah satu tugas di Udacity
Sebenernya di forum diskusi yang disediakan sudah ada peserta lain yang share codenya sih, tapi karena agak ribet maka Saya putuskan untuk mencoba menyelesaikan tugas ini sendiri.
Baik, Kalo kita perhatikan maka komponen dasar pembentuk gambar tersebut adalah segitiga kecil berwarna biru. Kemudian segitiga kecil ini disusun sedemikian hingga, sehigga terbentuk segitiga besar. Oiya abaikan gambar kura-kura dibagian atas, karena itu hanya ujung pena untuk menggambar (library yang digunakan adalah turtle). Intinya library ini digunakan untuk menggambar hehe. Lebih detil silahkan pelajari dokumentasi Library turtle.

Pertama gambar segitiga kecil berikut:

segitiga kesatu

Berikut adalah function tiangle_1 untuk menggambar segitiga biru kecil (segitiga kesatu):

 def triangle_1(some_pen,size):
    some_pen.begin_fill()
    some_pen.right(60)

    some_pen.forward(size)
    some_pen.right(120)
    some_pen.forward(size)
    some_pen.right(120)

    some_pen.forward(size)
    some_pen.end_fill()

Penjelasan: Gambar kura-kura menunjukkan pena/bulpoint. Default awalnya adalah pena menghadap ke kanan secara horisontal. Oiya untuk membuat segitiga diperlukan tiga garis. Dalam program ini Saya menggambar dari atas, samping kanan, bawah, samping kiri, dan balik ke atas. 

Karena awalnya pena menghadap ke kanan, maka perlu Saya putar sebesar 60 derajat kekanan (some_pen.right(60)), kemudian pena saya gerakkan sepanjang ukuran yang dikehendaki (some_pen.forward(size)). Sampai sini terbentuk garis samping kanan.

Untuk melanjutkan pergerakan pena membentuk garis dibagian bawah maka pena diputar 120 derajat kekanan (some_pen.right(120)) dan kemudian pena saya gerakkan sepanjang ukuran yang dikehendaki (some_pen.forward(size)). Sampai sini terbentuk garis bagian bawah.

Sekarang saatnya melanjutkan untuk menggambar garis sebelah kiri. Untuk itu maka pena saya putar lagi sebesar 120 derajat kekanan (some_pen.right(120)) dan kemudian pena saya gerakkan sepanjang ukuran yang dikehendaki (some_pen.forward(size)). Sampai sini terbentuk garis samping kiri.

Posisi pena terakhir adalah di bagian puncak atas menghadap ke atas (miring)

Perhatikan dibagian awal terdapat perintah some_pen.begin_fill() dan dibagian akhir terdapat some_pen.end_fill(). Hal ini untuk membuat segitiga terisi dengan warna (biru) ditengahnya.

Sekali lagi perhatikan bahwa terdapat adanya pengulangan kode dibagian tengah, sehingga kode dapat disimplifikasi menggunakan loop. Berikut kode (function) membuat segitiga menggunakan loop:

def triangle_1(some_pen,size):
    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()


Kedua, Gambar susunan segitiga berikut: 

segitiga kedua

Berikut adalah function untuk menggambar segitiga kedua:

def triangle_2(some_pen,size):
    triangle_1(some_pen,size)
    some_pen.right(120)
    some_pen.forward(size)
    some_pen.left(60)
    triangle_1(some_pen,size)
    some_pen.left(120)
    some_pen.forward(size)
    some_pen.right(180)
    triangle_1(some_pen,size)
    some_pen.forward(size) 
Perhatikan bahwa gambar segitiga kedua tersusun dari tiga segitiga kesatu. Secara umum langkahnya adalah membuat segitiga kecil atas, kemudian kanan bawah, kemudian kiri bawah.

sehingga langkah pertama adalah menggambar segitiga atas dengan memanfaatkan function triangle_1:
    triangle_1(some_pen,size)

kemudian memindahkan pena kebagian bawah kanan dari segitiga kesatu (dan juga setelah sampai dibawah, arahkan pena kembali mendatar kearah kanan, karena untuk menggambar segitiga kecil defaultnya adalah pena mendatar kekanan):
    some_pen.right(120)
    some_pen.forward(size)
    some_pen.left(60)  #untuk mengarahkan pena kembali mendatar arah kanan

Kemudian menggambar segitiga kanan bawah dengan memanfaatkan function triangle_1:
    triangle_1(some_pen,size)

kemudian memindahkan pena kebagian bawah kiri dari segitiga kesatu (dan juga setelah sampai dibawah, arahkan pena kembali mendatar kearah kanan, karena untuk menggambar segitiga kecil defaultnya adalah pena mendatar kekanan):
    some_pen.left(120)
    some_pen.forward(size)
    some_pen.right(180) 
#untuk mengarahkan pena kembali mendatar arah kanan

Kemudian menggambar segitiga kiri bawah dengan memanfaatkan function triangle_1:
    triangle_1(some_pen,size)

Untuk memudahkan routing berikutnya maka dibagian akhir, Posisi pena adalah selalu di bagian puncak atas menghadap ke atas (miring):
    some_pen.forward(size)  #untuk memindahkan pena ke puncak atas (miring)


Ketiga, Gambar susunan segitiga berikut:
 
segitiga ketiga

Perhatikan dengan seksama bahwa gambar segitiga kedua tersusun dari tiga segitiga kedua. Secara umum langkahnya adalah membuat segitiga kedua dibagain atas, kemudian kanan bawah, kemudian kiri bawah. Langkah ini sangat mirip dengan langkah pada saat menggambar segitiga kedua.

Jika pada saat menggambar segitiga kedua adalah memanfaatkan segitiga kesatu (triangle_1). Maka untuk menggambar segitiga ketiga ini memanfaatkan segitiga kedua (triangle_2). 

Berikut adalah function untuk menggambar segitiga ketiga:

def triangle_3(some_pen,size):
    triangle_2(some_pen,size)
    some_pen.right(120)
    some_pen.forward(2*size)   #perpindahan masing-masing sisi menjadi dua kali
    some_pen.left(60)
    triangle_2(some_pen,size)
    some_pen.left(120)
    some_pen.forward(2*size)  
#perpindahan masing-masing sisi menjadi dua kali
    some_pen.right(180)
    triangle_2(some_pen,size)
    some_pen.forward(2*size)  
#perpindahan masing-masing sisi menjadi dua kali
 


Keempat, Gambar susunan segitiga berikut:
 
segitiga keempat
Berikut adalah function untuk menggambar segitiga keempat:

def triangle_4(some_pen,size):
    triangle_3(some_pen,size)
    some_pen.right(120)
    some_pen.forward(2*2*size)
    some_pen.left(60)
    triangle_3(some_pen,size)
    some_pen.left(120)
    some_pen.forward(2*2*size)
    some_pen.right(180)
    triangle_3(some_pen,size)
    some_pen.forward(2*2*size)

##pembahasan sama dengan bagian ketiga


Bagian kelima:
Bagian kelima ini adalah bertugas untuk mempersiapkan pena dan memanggil fungsi untuk menggambar (triangle_4). Disini Saya membuat function bernama draw sebagai berikut:

def draw():
    window = turtle.Screen()   #instansiasi screen (aktivasi screen)
    window.bgcolor("red")      #set background screen berwarna merah

    pen = turtle.Turtle()      #instansiasi pena

    pen.penup()                #angkat pena (supaya bisa dipindahkan posisinya)
    pen.sety(100)              #memindahkan posisi pena (optional)
    pen.pendown()              #menurunkan pena (siap untuk menulis/menggambar)

    pen.shape("turtle")        #set bentuk pena (berbentuk kura-kura)
    pen.color("blue")          #set warna pena
    pen.speed(1)               #set kecepatan gerak pena

    triangle_4(pen,20)         #memanggil fungsi triangle_4 untuk menggambar

    window.exitonclick()       #menutup window hanya jika diklik (setelah selesai menggambar)


Bagian keenam:
Dibagian ini Saya tunjukkan secara utuh source codenya. Termasuk import modul turtle. Dan dibagian akhir adalah dengan memanggil function draw().

Berikut source code keseluruhan:

import turtle

def triangle_1(some_pen,size):
    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()

def triangle_2(some_pen,size):
    triangle_1(some_pen,size)
    some_pen.right(120)
    some_pen.forward(size)
    some_pen.left(60)
    triangle_1(some_pen,size)
    some_pen.left(120)
    some_pen.forward(size)
    some_pen.right(180)
    triangle_1(some_pen,size)
    some_pen.forward(size)

def triangle_3(some_pen,size):
    triangle_2(some_pen,size)
    some_pen.right(120)
    some_pen.forward(2*size)
    some_pen.left(60)
    triangle_2(some_pen,size)
    some_pen.left(120)
    some_pen.forward(2*size)
    some_pen.right(180)
    triangle_2(some_pen,size)
    some_pen.forward(2*size)

def triangle_4(some_pen,size):
    triangle_3(some_pen,size)
    some_pen.right(120)
    some_pen.forward(2*2*size)
    some_pen.left(60)
    triangle_3(some_pen,size)
    some_pen.left(120)
    some_pen.forward(2*2*size)
    some_pen.right(180)
    triangle_3(some_pen,size)
    some_pen.forward(2*2*size)

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

    pen = turtle.Turtle()

    pen.penup()
    pen.sety(100)
    pen.pendown()

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

    triangle_4(pen,20)

    window.exitonclick()

draw()


Berikut adalah hasil runningnya:


Dengan menggunakan kode diatas kita juga dapat memodifikasi untuk membuat segitiga serupa yang lebih besar tingkatannya, namun harus menambah kode misal triangle_5, triangle_6, dst. 

Teman-teman juga dapat menyederhanakan koding tersebut dengan teknik rekursif. Dengan teknik rekursif maka akan lebih simple jika kita menginginkan gambar pada tingkat tertentu.

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....