Selasa, 31 Maret 2020

Menggambar Hati Pada Python


Gambar Objek Spiral Berbentuk Hati Menggunakan Python


Simbol hati adalah simbol yang sejak lama digunakan untuk menunjukkan spiritualitas, emosi, moral, dan pada masa lalu, juga sebagai pusat kecerdasan manusia. Gambar/symbol hati dapat kita gambar dimana saja, namun kali ini saya akan menggambarnya dengan menggunakan Bahasa pemrograman Python.
Pertama, yang harus dilakukan sebelum masuk ke program adalah pastikan kita sudah menginstall library Numpy dan Matplotlib. Numpy merupakan library yang digunakan untuk operasi vector dan matriks. Sedangkan Matplotlib merupakan library yang digunakan untuk menyajikan data ke dalam visual yang lebih baik. Nah berikut adalah cara menginstallnya :
1.      Bula CMD.
2.      Masukkan perintah “pip install opencv-python” nah pada proses ini kita tunggu saja proses instalasi OpenCV. Pastikan laptop kita terkoneksi dengan internet.
3.   Masukkan perintah “pip install numpy” biasanya Numpy akan otomatis terinstall jika instalasi OpenCV telah sukses terinstall.
4.   Selanjutnya adalah Matplotlib. Ketikkan perintah “pip install matplotlib” tunggu hingga proses selesai.
5.       Nah jika proses sudah selesai maka kita bisa lanjut ke coding.


Pada awal program jangan lupa untuk meng import Numpy. Apabila berhasil maka Numpy berhasil diinstall. Lalu masukkan fungsi init(), init sendiri merupakan suatu method bawaan python. Di dalam fungsi ini terdapat glClearColor dan gluOrtho2D. glClearColor digunakan untuk memilih warna yang digunakan untuk membersihkan latar dalam mode RGBA. Dan gluOrtho2D digunakan untuk membuat window dengan sudut kiri bawah di left, bottom dan sudut kanan atas di right, top.
def init():
    glClearColor(0.0, 0.0, 0.0, 0.0)
    gluOrtho2D(-2.0, 2.0, -2.0, 2.0)

Selanjutnya adalah masukkan fungsi plotpoints(). Di dalamnya terdapat :
·         glClear(GL_COLOR_BUFFER_BIT) untuk membersihkan layar latar belakang dengan warna hitam.
·         glColor3f untuk menentukan warna garis/titik.
·         glPointSize untuk mengatuk besar titik yang akan digambar.
·         glBegin (GL_LINES) untuk menggambar garis dari titik.
·         glVertex2f untuk menentukan titik awal dan akhir.
·         glEnd() untuk mengakhiri gambar garis dititik akhir.
·         heart_shape() adalah fungsi.
·         glFlush() untuk memastikan gambar bisa dieksekusi.
def plotpoints():
    glClear(GL_COLOR_BUFFER_BIT)
    glColor3f(1, 1.0, 1.0)
    glPointSize(13)
    glBegin(GL_LINES)
    glVertex2f(-500, 0)
    glVertex2f(500, 0)

    glVertex2f(0, -500)
    glVertex2f(0, 500)
    glEnd()
    heart_shape()
    glFlush()

Masukkan fungsi heart_shape(). Disini lah library fungsi digunakan karena di dalam fungsi ini terdapat operasi-operasi perhitungan agar membentuk gambar hati.
def heart_shape():
    glBegin(GL_LINE_STRIP)
    glColor3f(1.0, 0.3, 0.6)
    x = -1.140

    while(x <= 1.140):
        delta = np.cbrt(x*x) * np.sqrt(x*x) - 4*x*x + 4
        y1 = (np.cbrt(x*x) + np.sqrt(delta)) / 2
        y2 = (np.cbrt(x*x) - np.sqrt(delta)) / 2
        
        glVertex2f(x, y1)
        glVertex2f(x, y2)

        x += 0.001
    glEnd()

Langkah terakhir adalah definisikan fungsi main().
·         glutInit(sys.argv) untuk mengatur pembuatan window.
·      glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB) untuk meminta window yang bersifat double buffered, dengan warna RGB.
·      glutInitWindowSize untuk membuat window dengan ukuran sesuai dengan parameter yang dituliskan.
·  glutInitWindowPosition untuk membuat window dengan letak sesuai dengan parameter yang dituliskan.
·    glutCreateWindow("Gambar Hati (Alma Alfiatul Inayah)") untuk membuat dan mengatur jendela dengan judul “Gambar Hati (Alma Alfiatul Inayah)”.
·         glutDisplayFunc(plotpoints) untuk pemanggilan display.
·         glutMainLoop() untuk perulangan display agar program tidak berhenti.
def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
    glutInitWindowSize(500, 500)
    glutInitWindowPosition(100, 100)
    glutCreateWindow("Gambar Hati (Alma Alfiatul Inayah)")
    glutDisplayFunc(plotpoints)

    init()
    glutMainLoop()

Berikut adalah code program lengkapnya :
from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *

import numpy as np

def init():
    glClearColor(0.0, 0.0, 0.0, 0.0)
    gluOrtho2D(-2.0, 2.0, -2.0, 2.0)
def plotpoints():
    glClear(GL_COLOR_BUFFER_BIT)
    glColor3f(1, 1.0, 1.0)
    glPointSize(13)
    glBegin(GL_LINES)
    glVertex2f(-500, 0)
    glVertex2f(500, 0)

    glVertex2f(0, -500)
    glVertex2f(0, 500)
    glEnd()
    heart_shape()
    glFlush()

def heart_shape():
    glBegin(GL_LINE_STRIP)
    glColor3f(1.0, 0.3, 0.6)
    x = -1.140

    while(x <= 1.140):
        delta = np.cbrt(x*x) * np.sqrt(x*x) - 4*x*x + 4
        y1 = (np.cbrt(x*x) + np.sqrt(delta)) / 2
        y2 = (np.cbrt(x*x) - np.sqrt(delta)) / 2
        
        glVertex2f(x, y1)
        glVertex2f(x, y2)

        x += 0.001
    glEnd()

def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
    glutInitWindowSize(500, 500)
    glutInitWindowPosition(100, 100)
    glutCreateWindow("Gambar Hati (Alma Alfiatul Inayah)")
    glutDisplayFunc(plotpoints)

    init()
    glutMainLoop()

main()

Output :



Selasa, 24 Maret 2020

Algoritma Bresenham Pembentukan Lingkaran


Algoritma Pembentukan Lingkaran
Algoritma Pembentukan Lingkaran adalah algoritma dimana pembentukan garis lingkaran berdasarkan acuan titik tengah lingkaran. Lingkaran adalah kumpulan dari titik-titik yang memiliki jarak dari titik pusat yang sama untuk semua titik. Lingkaran dibuat dengan menggambarkan seperempat lingkaran, karena bagian lain dapat dibuat sebagai bagian yang simetris.
Algoritma garis Bressenhem disebut juga midpoint line algorithm yang adalah algoritma konversi penambahan nilai integer yang juga dapat diadaptasi untuk menggambar sebuah lingkaran. Untuk menggambar sebuah lingkaran 360 derajat kita akan membagi menjadi 8 bagian, sehingga kita cukup hanya menggambar 45 derajat.

Langkah-langkah Algoritma Bresenham Pembentukan Lingkaran :
1.      Menetapkan titik tengah (x_center, y_center)
2.      Menetapkan jari-jari r
3.      Menetapkan nilai x = 0, y = r
4.      Menetepkan nilai parameter keputusan d = 3 – (2 * r)
5.      Gambar titik awal dengan koordinat (x_center+x, y_center+y)
6.      x = x+1
7.      Jika d < 0, maka nilai d baru d = d + (4*x) + 6, jika tidak nilai d baru d = d + 4 * (x – y) + 10 dan y = y-1
8.      Gambar titik berikutnya dengan koordinat (x_center+x, y_center+y)
9.      Jika x < = y ulangi langkah 6 sampai 8
Tugas Individu 29
1.      Buat gambar lingkaran menggunakan titik dengan algoritma Bresenham Pembentukan Lingkaran.
2.      Nilai parameter :
Kelompok
Center
R
MM3K1
(-2, -2)
8

Jawab :
Untuk membuat algoritma Bresenham Pembentukan Lingkaran maka harus ada dilakukan langkah-langkah sebagai berikut :
1.      Menetapkan titik tengah (x_center, y_center) : (-2, -2)
2.      Menetapkan jari-jari r : 8
3.      Menetapkan nilai x = 0, y = r : (x=0, y=8)
4.      Menetepkan nilai parameter keputusan d = 3 – (2 * r) : d = 3 – (2*8)
5.      Gambar titik awal dengan koordinat (x_center+x, y_center+y)
6.      x = x+1
7.      Jika d < 0, maka nilai d baru d = d + (4*x) + 6, jika tidak nilai d baru d = d + 4 * (x – y) + 10 dan y = y-1
8.      Gambar titik berikutnya dengan koordinat (x_center+x, y_center+y)
9.      Jika x < = y ulangi langkah 6 sampai 8

Berikut adalah source code lengkapnya :
# Kelompok 1 Grafika Komputer MM-3
# Nama Anggota:
# -> Tri Mega Anggraeni
# -> Alma Alfiatul Inayah
# -> Bunga Permatasari
# -> Sarah Nur Jihan
# -> Wiwit Farianto

from OpenGL.GL import *
from OpenGL.GLU import *
from OpenGL.GLUT import *


def init():
    glClearColor(0.0, 0.0, 0.0, 0.0)
    gluOrtho2D(-100.0, 100.0, -100.0, 100.0)
    glPointSize(5)


def plot(x, y):
    glBegin(GL_POINTS)
    glVertex2f(x, y)
    glEnd()


def bresenham_drawing_circle(r):

    # titik lokasi lingkaran yang akan dibuat

    x_center = -2
    y_center = -2

    r = 8
    x = 0
    y = r

    # parameter brasenham circle
    d = 3 - 2 * r

    # membuat titik pada koordinat circle yang ditentukan
    plot(x + x_center, y + y_center)

    while y > x:

        if d < 0:
            x += 1
            d += 4 * x + 6
        else:
            x += 1
            y -= 1
            d += (4 * (x - y)) + 10

        # Tidak perlu mencari semua nilai dari koordinat koordinat
        # cukup mendapatkan nilai dari(x, y)
        # setelah sudah nilai (x,y) lalu balik menjadi (y, x)

        # Untuk pixel (x, y)

        # Quadrant 1
        plot(x + x_center, y + y_center)

        # Quadrant 2
        plot(x + x_center, -y + y_center)

        # Quadrant 3
        plot(-x + x_center, -y + y_center)

        # Quadrant 4
        plot(-x + x_center, y + y_center)

        # Untuk pixel (y, x)

        # Quadrant 1
        plot(y + x_center, x + y_center)

        # Quadrant 2
        plot(-y + x_center, x + y_center)

        # Quadrant 3
        plot(-y + x_center, -x + y_center)

        # Quadrant 4
        plot(y + x_center, -x + y_center)


def plotpoints():

    glClear(GL_COLOR_BUFFER_BIT)
    glColor3f(1, 1.0, 1.0)

    glBegin(GL_LINES)

    glVertex2f(-100, 0)
    glVertex2f(100, 0)

    glVertex2f(0, -100)
    glVertex2f(0, 100)

    glEnd()

    bresenham_drawing_circle(40)

    glFlush()


def main():
    glutInit(sys.argv)
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB)
    glutInitWindowSize(500, 500)
    glutInitWindowPosition(100, 100)
    glutCreateWindow("Bresenham Cricle TUGAS 4 Kel 1 MM3")
    glutDisplayFunc(plotpoints)

    init()
    glutMainLoop()


main()
Output :