Laporan ini disusun untuk memenuhi Tugas Mata Kuliah Komputer Grafik Teori.
Disusun oleh:
Algoritma midpoint circle merupakan algoritma pembentuk lingkaran dengan cara membagi
lingkaran menjadi delapan bagian. Algoritma tersebut akan menggambar satu bagian lalu
selanjutnya dapat menentukan 7 bagian yang lainnya. Mengapa dengan hanya menggambar satu
bagian dapat menggambar bagian lainnya? Hal tersebut dikarenakan lingkaran adalah objek
simetris, sehingga hal ini dimanfaatkan guna mengurangi pekerjaan pada saat menggambar
lingkaran. Berikut bagian-bagian lingkaran yang dimaksud:
Bagian x y
1 a b
2 -a b
3 a -b
4 -a -b
5 b a
6 -b a
7 b -a
8 -b -a
Berdasarkan ilustrasi diatas, kita simpulkan bagian-bagian tersebut saling bercermin (reflection)
dengan syarat saling bersebelahan satu dengan yang lainnya. Hal ini tentu sangat mendukung
pernyataan diatas, yaitu “Algoritma tersebut akan menggambar satu bagian lalu selanjutnya
dapat menentukan 7 bagian yang lainnya”. Berikut source code dari midpoint circle tersebut:
func plotCircle(x,y,absis,ordinat):
var absisC = x
var ordinatC = y
Algoritma midpoint elips merupakan algoritma pembentuk elips dengan cara membagi elips
menjadi empat kuadran. Sama halnya dengan lingkaran, algoritma pembentuk elips ini akan
menggambar satu kuadran lalu akan menggambarkan ketiga lainnya.
Kuadran pertama dibagi menjadi dua bagian. Titik plot untuk bagian I, lalu koordinat akhir
bagian I dijadikan koordinat awal bagian II.
Dua cara menggambarkan kedua bagian tersebut:
I. Posisi awal di titik (0,r), lalu bergeser/digambarkan searah jarum jam sesuai dengan
jalur elips pada kuadran pertama. Setiap pergeseran dalam x disaat slope > 1.
II. Posisi awal di titik (r,0) lalu bergeser/digambarkan berlawanan arah jarum jam. Setiap
pergeseran dalam y disaat slope > -1.
}
MATA
extends "res://Library/CompleteLib.gd"
func _ready():
pass
func _draw():
var i; var j; var k; var l;
i=randi()%int(max_width)
j=randi()%int(max_height)
k=randi()%500
l=randi()%500
rotasi(Vector2(250,250),Vector2(200,200),90)
elipsMidpoint(i,j,k,l)
pass
func elipsPlotPoint(xCenter,yCenter,x,y):
setPixel(xCenter + x, yCenter + y, Color.white)
setPixel(xCenter - x, yCenter + y, Color.blue)
setPixel(xCenter + x, yCenter - y, Color.yellow)
setPixel(xCenter - x, yCenter - y, Color.orange)
pass
func elipsMidpoint(xCenter,yCenter,Rx,Ry):
var Rx2 = Rx*Rx
var Ry2 = Ry*Ry
var twoRx2 = 2*Rx2
var twoRy2 = 2*Ry2
var p
var x = 0
var y = Ry
var px = 0
var py = twoRx2 * y
#elipsPlotPoint(xCenter,yCenter,x,y)
# Region 1
p = round(Ry2 - (Rx2 * Ry) + (0.25 * Rx2))
while(px<py):
x+=1
px+=twoRy2
if(p<0):
p+=Ry2+px
else:
y-=1
py-=twoRx2
p+=Ry2+px-py
elipsPlotPoint(xCenter,yCenter,x,y)
elipsPlotPoint(xCenter,yCenter,x,y)
# Region 2
p = round(Ry2*(x * 0.5)*(x + 0.5) + Rx2*(y-1)*(y-1) - Rx2*Ry2)
while(y>0):
y-=1
py-=twoRx2
if(p>0):
p+=Rx2-py
else:
x+=1
px+=twoRy2
p+=Rx2-py+px
elipsPlotPoint(xCenter,yCenter,x,y)
elipsPlotPoint(xCenter,yCenter,x,y)
pass