Simulasi Algoritma Midpoint

Minggu, 24 Oktober 2010

Metode Ray Tracing


Ray tracing adalah suatu metode untuk me-render obyek 3D yang hasilnya realistik seperti foto. Metode ini dilakukan dengan cara menelusuri sinar mata atau sumber cahaya, kemudian diperiksa apakah sinar tersebut mengenai obyek atau tidak. Jika ternyata sinar yang ditelusuri tersebut mengenai suatu obyek maka selanjutnya diperhitungkan intensitas pada obyek tersebut, yaitu intensitas ambient, diffuse dan specular. Hasil dari perhitungan intensitas inilah yang terlihat oleh mata.

Ada dua konsep dasar yang harus di perhatikan dalam ray tracing ini, yaitu: kita dapat melihat benda karena benda tersebut memantulkan cahaya; jika sinar menabrak permukaan benda maka dapat terjadi 3 hal, yaitu penyerapan, pemantulan, dan pembiasan. Ada pula 3 efek umum yang terjadi pada proses ray tracing, yaitu penyerapan, pemantulan, dan pembiasan cahaya. Di sini pemahaman kita mengenai fisika optik harus digali lagi.


Metode ray tracing dibagi menjadi dua jenis, yaitu forward ray tracing dan backward ray tracing.

Forward Ray tracing

Pada forward ray tracing, sinar yang ditelusuri adalah sinar yang dipancarkan dari sumber cahaya. Satu hal yang harus diperhatikan adalah bahwa sinar yang dipancarkan oleh sumber cahaya tidak hanya berjumlah puluhan atau ratusan tetapi dapat berjumlah jutaan bahkan lebih. Semua sinar yang dipancarkan tersebut harus ditelusuri satu persatu. Bila setelah proses penelusuran dilakukan, sinar yang sedang ditelusuri tersebut tidak mengenai mata, maka sinar tersebut akan diabaikan, yang berarti akan banyak sekali perhitungan sia-sia yang dilakukan. Hal ini dikarenakan tidak semua sinar yang dipancarkan dari sumber cahaya akan mengenai mata. Dengan menggunakan cara ini, maka untuk menghasilkan gambar yang diinginkan akan membutuhkan banyak waktu.


Gambar 2.1. Forward Ray Tracing


 Backward Ray Tracing

Backward ray tracing menggunakan penelusuran sinar dari mata. Sinar dipancarkan dari mata ke arah setiap pixel yang membentuk layar gambar dan kemudian diteruskan ke obyek-obyek yang akan digambar. Jika sinar yang melalui suatu pixel tersebut mengenai suatu obyek maka dilakukan perhitungan intensitas pada titik tabrak obyek tersebut. Intensitas hasil perhitungan tersebut digunakan untuk memberi warna pada pixel tersebut. Perhitungan intensitas yang dilakukan adalah dengan memperhitungkan efek pencahayaan dan efek visual.


Jika sinar yang dipancarkan tersebut tidak mengenai obyek sama sekali maka pixel diberi warna sama dengan warna latar belakangnya.


Gambar backward ray tracing
  
Efek Pencahayaan pada Ray Tracing

Untuk memperoleh gambar yang semirip mungkin dengan aslinya, perlu ditambahkan efek pencahayaan, karena pada dunia nyata pun semua benda dapat terlihat karena adanya cahaya. Efek pencahayaan dapat dibedakan menjadi tiga, yaitu ambient, diffuse dan specular. Di bawah ini akan dijelaskan secara lebih rinci tentang ketiga efek pencahayaan tersebut.

Ambient

Ambient adalah efek pencahayaan yang telah membaur dengan lingkungan sehingga arah cahaya tidak dapat diketahui, seakan-akan cahaya datang dari segala arah. Efek ini akan mempengaruhi terang atau tidaknya suatu lingkungan yang terlihat oleh mata. Semakin banyak lampu maka ruangan semakin terang, sebaliknya jika lampu sedikit maka ruangan remang-remang.

Intensitas ambient pada suatu obyek dapat dicari dengan persamaan :

I = Ia * Ka

dimana,

I= Intensitas yang dihasilkan

Ia = Intensitas ambient

Ka = Koefisien ambient

Diffuse

Jenis pencahayaan yang kedua ialah diffuse. Diffuse adalah pencahayaan yang tergantung dari besarnya sudut yang dibentuk antara sinar dari lampu ke titik tabrak pada obyek dengan normal obyek. Sehingga posisi lampu sangat mempengaruhi efek diffuse ini. Intensitas diffuse dapat dicari dengan hukum

Lambertian sebagai berikut:

I = Ip * Kd (cosθ )

Dari persamaan intensitas diffuse tersebut cos θ dapat dihitung dengan melakukan dot product antara sinar dari lampu ke titik tabrak obyek dengan normal obyek itu, masing-masing merupakan unit vektor. Sehingga didapat persamaan baru

I = Ip * Kd * ( L • N )


dimana,

I= Intensitas yang dihasilkan

Ip = Intensitas diffuse dari sumber cahaya ‘x’

Kd = Koofisien diffuse

N = Vektor normal dari obyek

L = Vektor dari titik tabrak ke sumber cahaya

θ = Sudut antara N dan L

 Specular

Specular adalah efek pencahayaan dimana bayangan sumber cahaya terlihat pada permukaan obyek. Efek specular terlihat pada obyek yang mengkilap. Semakin mengkilap permukaan suatu obyek maka makin jelas bayangan sumber cahaya yang terlihat pada permukaan obyek tersebut. Untuk mencari intensitas specular dapat digunakan persamaan sebagai berikut :

I = Ip * Ks (cos θ ) n

Dari persamaan intensitas specular tersebut cos θ menggunakan dot product antara arah pantulan dengan negasi dari arah sinar.

I = Ip * Ks * ( R • V ) n

dapat dihitung dengan dimana,

I= Intensitas yang dihasilkan

Is = Intensitas specular dari sumber cahaya ‘x’

Ks = Koofisien specular

n = Variabel yang menentukan luas area yang berkilau jika terkena cahaya yang dipancarkan oleh sumber cahaya (bila n semakin besar maka cahaya semakin terfokus atau area yang berkilau menjadi lebih kecil)

R = Arah pantulan, berupa unit vektor

V = Negasi dari arah sinar

Sedangkan vektor R diperoleh dari − S + 2 * ( S • N ) * N

dimana,

S = Vektor dari titik tabrak ke sumber cahaya

N = Vektor normal dari obyek

Proses ray tracing yang prosesnya dapat digambarkan sebagai sebuah pohon sebenarnya dapat diselesaikan dengan algoritma yang lain, yakni algoritma pencarian runut balik. Tetapi, jika dianalisis lebih lanjut, penggunaan algoritma runut balik justru kurang efisien untuk kasus ini, karena setiap kali simpul dimatikan, perlu proses lain untuk naik ke simpul di atasnya dan membangkitkan anak-anak simpul lain hingga seluruh anak simpul dibangkitkan. Proses naik ke simpul sebelumnya membuat proses pencarian menjadi lama.
Algoritma branch and bound yang merupakan perbaikan dari algoritma pencarian melebar pun tidak bisa
digunakan karena algoritma tersebut menerapkan suatu batasan berupa cost. Pada proses rendering dengan metode ray tracing, cost bukanlah hal yang paling utama karena pada akhirnya, untuk mencapai hasil yang paling mendekati kenyataan, semua simpul pada pohon perlu dibangkitkan untuk kemudian digabungkan kembali.
Algoritma pencarian melebar dirasa paling tepat untuk metode rendering ini, karena dalam satu waktu, algoritma ini dapat membangkitkan banyak simpul.



http://docs.google.com/viewer?a=v&q=cache:3wJlnWt5PvAJ:digilib.petra.ac.id/jiunkpe/s1/info/2005/jiunkpe-ns-s1-2005-26400154-2133-ray_tracin-chapter2.pdf+pengertian+ray+tracing&hl=id&gl=id&pid=bl&srcid=ADGEESik5hpCiePbJ9moelhznGSq3EWngsr236DLT860MKPsWhCFdrxfwqR3ih2bPhwPzMqjH5Oihv5HBA3e_4_SlKtVAqoJkNYgdtGeonKiynpWTSyR6sa4N_rWZ96kEURUMQlR11iZ&sig=AHIEtbQ9wRqA4Zl9El5cmgwamXNBTxAcrw

Kamis, 07 Oktober 2010

Algoritma Midpoint

PENDAHULUAN

Perkembangan kemampuan komputasi prosesor yang pesat telah membuat komputer desktop mempunyai kemampuan komputasi yang besar. Hal ini mendorong perkembangan program aplikasi yang memerlukan komputasi yang besar seperti program aplikasi yang menggunakan grafik 3 dimensi. Peningkatan kemampuan komputasi prosesor untuk aplikasi grafik yang sarat komputasi, perlu dibarengi peningkatan efisiensi algoritma, sehingga pembuatan grafik garis dan kurva yang merupakan dasar pembuatan grafik dapat memberikan hasil yang optimal.

Algoritma midpoint merupakan algoritma pembuatan garis dan kurva dengan dasar operasi bilangan integer yang menonjolkan ciri kecepatan. Sehingga algoritma ini dapat dipakai sebagai algoritma pembuatan grafik yang menuntut kecepatan sebagai hal yang diutamakan. Pembahasan algoritma Midpoint dilakukan dengan mengasumsikan garis lurus dari kiri ke kanan, dan gadient antara 0 dan 1, sedangkan untuk lingkaran dengan mengasumsikan hanya sebagian lingkaran dengan sudut sebesar 45° , hal ini dilakukan untuk mempermudah penjelasan, sedangkan untuk kondisi yang lain dapat diderivasi dengan cara yang serupa.

Untuk mendapatkan kinerja algoritma midpoint, dilakukan uji kecepatan komputasi dengan cara mengimplementasikan kedalam bahasa pemrograman C, dan melakukan perbandingan waktu komputasi dengan algoritma yang menggunakan dasar komputasi bilangan riel, maupun algoritma lain yang telah banyak dikenal seperti algoritma dda dan algoritma bressenham.

Formula_Pers_GARIS LURUS

Garis lurus dinyatakan dinyatakan dalam persamaan :
y = mx + c (1)
dimana :    

m : gradient dan
c : konstanta.

Untuk menggambarkan piksel-piksel dalam garis lurus, parameter yang digunakan tergantung dari gradient, jika besarnya gradient diantara 0 dan 1, maka digunakan sumbu x sebagai parameter dan sumbu y sebagai hasil dari fungsi, sebaliknya, bila gradient melebihi 1, maka sumbu y digunakan sebagai parameter dan sumbu x sebagai hasil dari fungsi, hal ini bertujuan untuk menghindari terjadinya gaps karena adanya piksel yang terlewatkan. Hasil dari fungsi biasanya merupakan bilangan riel, sedangkan koordinat pixel dinyatakan dalam bilangan integer (x,y), maka diperlukan operasi pembulatan kedalam bentuk integer terdekat.
Penggambaran garis lurus dengan metode diatas dimulai dengan operasi bilangan riel untuk menghitung gradient m dan konstanta c.


m = (y2 - y1 ) / (x2-x1) (2)

c = y1 – m* x1 (3)

Operasi bilangan riel berikutnya adalah menghitung nilai y dengan persamaan (1) untuk mendapatkan koordinat piksel (x,y), untuk setiap nilai x, dari =x1 sampai x=x2, operasi inilah yang perlu dihindari, karena operasi ini memerlukan waktu operasi yang besar.


Algoritma Midpoint untuk Penggambaran Garis
Algoritma midpoint dikembangkan oleh Pitteway pada tahun 1967. Pada gambar 1, titik abu-abu menyatakan posisi piksel, titik hitam menyatakan posisi piksel yang telah digambar. Berdasarkan piksel ke n yang telah digambar, diperlukan metode untuk menentukan piksel berikut yang akan digambar, karena penggambaran dilakukan dari kiri ke kanan, maka piksel berikutnya harus pada kolom n+1. Karena gradien diantara 0 dan 1, maka piksel berikutnya adalah pada posisi titik p atau titik q.


Gambar 1. Garis Lurus
Persamaan garis lurus yang telah dinyatakan dalam persamaan (1) dapat dinyatakan dalam fungsi x,y berikut.

f(x, y) = ax + by + c = 0 (4)

Fungsi f(x,y) dalam persamaan (4), akan memberikan nilai 0 pada setiap titik yang terletak pada garis, dan bernilai positip pada setiap titik yang terletak dibawah garis, dan bernilai negatif pada setiap titik yang terletak diatas garis.

Maka untuk menentukan apakah titik P atau Q sebagai koordinat piksel berikutnya, maka dilakukan dengan cara menghitung nilai fungsi f(x,y) dalam persamaan (4) pada titik P dan titik Q . Jika fungsi f(x,y) tersebut memberikan nilai positif, maka piksel berikutnya adalah Q, sebaliknya piksel berikutnya adalah P.

g(x, y) = f(xn + 1, yn + 1/2) (5)

Fungsi g(x,y) persamaan (5) merupakan variabel penentu, dengan mengevaluasi g (x, y) dapat ditentukan piksel berikutnya yang mana berdasarkan tanda plus atau minus dari hasil fungsi g(x,y).
Untuk mempercepat komputasi fungsi g(x,y), dilakukan dengan cara incremental berdasarkan nilai sebelumnya. Untuk setiap piksel, increment sederhana (DeltaG) dipakai sebagai variabel penentu. Karena hanya ada 2 pilihan piksel pada setiap tahap, maka hanya ada 2 increment yang dapat digunakan. Hal ini dilakukan dengan cara pengurangan nilai g(x,y) yang berurutan dengan menggunakan persamaan 4 dan persamaan 5.


DeltaG = a * DeltaX + b * DeltaY (6)
Dimana DeltaX dan DeltaY adalah increment yang dipakai pada x dan y, yang bernilai 0 atau 1. Bila bergeser 1 piksel ke kanan :


DeltaG1 = a (7)
Bila bergeser 1 piksel ke kanan dan 1 piksel ke atas.


DeltaG2 = a + b (8)
Jadi nilai dari variable penentu dapat dihitung dari nilai sebelumnya dengan cara menambah dengan (a) atau (a+b). Algoritma untuk menggambar garis lurus dari (x1, y1) sampai (x2, y2) dilakukan dengan langkah-langkah sebagai-berikut:
  1. Gambar piksel pertama (x1,y1). Hitung variabel penentu dengan persamaan (3).
  2. Tentukan tanda variabel penentu. Jika variabel penentu bernilai positif, increment x dan y dan tambahkan (a+b) pada vaiabel penentu, sebaliknya increment x dan y dan tambahkan (a) pada variabel penentu.
  3. Plot piksel pada posisi (x, y).
  4. Ulangi langkah mulai langkah kedua, sampai piksel terakhir (x2,y2).

Formula_Pers_LINGKARAN

Kurva lingkaran dinyatakan dinyatakan dalam persamaan :

(x-xc) 2 + (y-yc) 2 = r (9)

dimana :    (xc,yc) : koordinat titik pusat lingkaran
                r : jari-jari lingkaran

Untuk menggambarkan piksel-piksel dalam kurva lingkaran, dapat digunakan sumbu x dari x = (xc-r) sampai x = (xc+r) sebagai parameter dan sumbu y sebagai hasil dari persamaan (10)

y = yc +- sqrt(r 2 - (x-xc) (10)

Algoritma ini memerlukan waktu operasi yang besar, karena mengandung operasi bilangan riel perkalian maupun eksponential, dan menghasilkan posisi koordinat piksel yang tidak merata, karena terjadinya gaps yang disebabkan adanya perubahan gradient.
Untuk menghindari posisi koordinat piksel yang tidak merata, koordinat piksel (x,y) dinyatakan dengan menggunakan koordinat polar dalama persamaan (11)

x = xc + r cos q (11a)

y = yc + r sin q (11b)

Persamaan (11) diatas mengandung operasi bilangan riel perkalian untuk mendapatkan koordinat piksel (x,y), untuk setiap nilai x, dari x = (xc-r) sampai x = (xc+r), operasi inilah yang perlu dihindari, karena operasi ini memerlukan waktu operasi yang besar.

Algoritma Midpoint untuk lingkaran

Komputasi untuk membuat kurva lingkaran dimulai dengan mengidentifikasi bagian-bagian dari lingkaran yang dapat ditentukan dengan menggunakan sifat simetri, hal ini dilakukan dengan cara membagai lingkaran dengan masing-masing mempunyai sudut sebesar 45° , sehingga dalam sebuah lingkaran dibagi menjadi 8 bagian. Sebagai contoh, digambarkan bagian dari lingkaran dari sudut 90° sampai 45° .
Seperti pada algoritma midpoint untuk garis lurus, maka pada setiap tahapan, terdapat 2 koordinat piksel yang harus dipilih yaitu (x+1, y) atau (x+1, y-1).









Gambar 2. Lingkaran

Langkah berikutnya, adalah menyatakan persamaan lingkaran dan fungsi untuk menentukan variabel penentu. Persamaan lingkaran dengan pusat (0,0) dinyatakan dalam persamaan (12).

f(x, y) = x*x + y+y - r*r = 0 (12)

Fungsi f(x, y) persamaan (12) akan bernilai positif jika titik (x,y) diluar lingkaran, dan bernilai negatif jika titik (x,y) didalam lingkaran. Fungsi untuk variabel penentu dan increment dinyyatakan dalam persamaan (13), (14), dan (15).


g(x, y) = (x + 1)*(x + 1) + (y - 1/2)*(y - 1/2) - r*r (13)


DeltaG1 = 2x + 3 (14)

DeltaG2 = 2x - 2y + 5 (15)

Berbeda dengan nilai dari increment pada algoritma garis lurus yang bernilai konstan, pada kurva lingkaran, increment tidak konstan. Terlihat bahwa komputasi increment memerlukan operasi perkalian, tetapi operasi perkalian dapat diubah dengan cara komputasi nilai increment secara increment pula, sehingga diperlukan 2 komputasi increment dalam setiap piksel yang diproses. Secara umum, kurva polinomial orde n memerlukan n level increment. Pada titik awal (x1,y1), komputasi variabel penentu mempunyai bagian bilangan riel, sehingga operasi bilangan integer tidak dapat digunakan secara langsung. Dalam praktek hal ini diselesaikan dengan cara menambahkan nilai 1/4 pada variable penentu. Hal ini tidak mempengaruhi perubahan tanda bilangan, karena operasi yang dilakukan adalah operasi bilangan integer, sehingga menghasilkan operasi yang lebih cepat.

IMPLEMENTASI PERANGKAT LUNAK

Untuk mendapatkan hasil kerja dari suatu algoritma, maka algoritma pembuatan grafik garis lurus dan kurva lingkaran perlu diimplementasikan kedalam bahasa pemrograman dan dilakukan pengukuran waktu komputasi. Pada penulisan ini algoritma pembuatan grafik diimplementasikan kedalam bahasa pemrograman C, dengan menggunakan compiler Turbo C++. 

HASIL PENGUKURAN

Pengukuran kecepatan komputasi pada semua algoritma menggunakan basis dibawah ini, yang selengkapnya dapat dilihat pada program1.cpp. Perulangan sebanyak 10 kali dilakukan dengan tujuan untuk mendapatkan ketelitian dari satuan pengukuran terkecil yaitu sebesar 1/100 detik, satuan yang mampu diberikan oleh bahasa pemrograman C. Hasil ditunjukan pada tabel 1 dan tabel 2.
Pengukuran dilakukan dengan berbagai ukuran panjang garis, untuk mengetahui pengaruh waktu komputasi perintah-perintah yang ada di dalam perulangan sepanjang grafik, maupun pengarus waktu komputasi perintah-perintah yang ada sebelumnya.








void main()
{ gettime(t1)
  For (counter=1;counter<=10;counter++)
  TestCode(); // Algoritma yang diuji
  gettime(t2)

}


Eksekusi program dilakukan pada komputer dengan prosesor Intel 80286-12 dengan clock 12 Mhz, tanpa Math Co-processor dan pada sistem operasi single-tasking DOS (Disk Operating System), hal ini dilakukan untuk menghindari efek time-slice dari sistem operasi multi-tasking.

Tabel 1. Waktu Dan Rasio Penggambaran Garis Lurus (1/100 detik)

Algoritma \ Panjang garis


640x 100


640x 10


640x 1


Algoritma Persamaan (1)


4647


19


473


17


49


8


Algoritma DDA


3862


16


390


14


43


7


Algoritma Bresenham


2702


11


274


10


33


6


Algoritma MidPoint


242


1


28


1


6


1



Tabel 2. Waktu Dan Rasio Penggambaran Lingkaran (1/100 detik)

Algoritma \ Jari-jari


480x 100


480x 10


480x 1


Algoritma Persamaan (10)


2265


15


253


15


29


14


Algoritma Bresenham


146


1


17


1


2


1


Algoritma MidPoint


148


1


16


1


2


1

KESIMPULAN

Panjang garis atau banyak piksel dalam garis lurus sangat berpengaruh terhadap perbandingan performance antara sebuah algoritma dengan algoritma yang lain, hal ini disebabkan adanya perbedaan waktu operasi yang berada didalam perulangan sepanjang pembuatan piksel, dan waktu operasi yang berada pada sebelumnya.
Panjang jari-jari dalam lingkaran tidak berpengaruh terhadap perbandingan performance antara sebuah algoritma dengan algoritma yang lain, hal ini menunjukkan perbandingan waktu operasi yang berada didalam perulangan sepanjang pembuatan piksel, dan waktu operasi yang berada pada sebelumnya berimbang.

Algoritma dengan dasar operasi bilangan integer memberikan waktu operasi yang lebih cepat dibandingkan dengan algoritma dengan dasar operasi bilangan riel, hal ini ditunjukkan dengan waktu komputasi algoritma DDA, algoritma Bresenham dan algoritma Midpoint yang lebih cepat, baik pada pembuatan garis lurus maupun lingkaran dibandingan waktu komputasi dengan algoritma yang menggunakan dasar operasi bilangan riel.

Algoritma midpoint memberikan waktu operasi tercepat diantara algoritma penggambaran garis lurus yang telah menggunakan dasar operasi bilangan integer, seperti algoritma DDA, algoritma Bresenham. Jadi algoritma Midpoint merupakan algoritma yang cocok untuk penggambaran grafik yang menuntut kecepatan sebagai hal yang diutamakan.

DAFTAR PUSTAKA

  1. Donald Hearn and M.Pauline Baker, Computer graphics, NJ : Prentice-Hall, 1992.
  2. Borland International, Inc., Turbo C++ Reference Guide, 1990.
  3. http://www.geocities.com/Broadway/4574/ midpoint/index.html
  4. http://hops.cs.jhu.edu/~stevec/graphics/ midpoint.htm

Source Code

#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#include <math.h>

int line_mat(int x1,int y1,int x2,int y2,int color);
int line_dda(int x1,int y1,int x2,int y2,int color);
int line_bre(int x1,int y1,int x2,int y2,int color);
int line_mid(int x1,int y1,int x2,int y2,int color);

int circ_mat(int xc,int yc,int r,int color);
int circ_bre(int xc,int yc,int r,int color);
int circ_mid(int xc,int yc,int r,int color);

int main(void)
{
int elapse;
struct time t1,t2;

/* request auto detection */
int gdriver = DETECT, gmode, errorcode;
int xmax, ymax;

/* initialize graphics and local variables */
initgraph(&gdriver, &gmode, "");

/* read result of initialization */
errorcode = graphresult();
/* an error occurred */
if (errorcode != grOk)
{
printf("Graphics error: %s\n", grapherrormsg(errorcode));
printf("Press any key to halt:");
getch();
exit(1);
}

setcolor(getmaxcolor());
xmax = getmaxx();
ymax = getmaxy();

// get start time
gettime(&t1);
printf("The Start time is: %2d:%02d:%02d.%02d\n",
    t1.ti_hour, t1.ti_min, t1.ti_sec, t1.ti_hund);

// draw line graphics
// line_mat(0,0,xmax*1,ymax*1,1);
// line_dda(0,0,xmax*1,ymax*1,1);
// line_bre(0,0,xmax*1,ymax*1,1);
// line_mid(0,0,xmax*1,ymax*1,1);

// draw circle graphics
// circ_mat(320,240,480*50,1);
// circ_bre(320,240,480*50,1);
// circ_mid(320,240,480*50,1);

// get finish time
gettime(&t2);
printf("The Finish time is: %2d:%02d:%02d.%02d\n",
    t2.ti_hour, t2.ti_min, t2.ti_sec, t2.ti_hund);
// elapse time
elapse = (t2.ti_hour*60*60*100+t2.ti_min*60*100+t2.ti_sec*100+t2.ti_hund)- \
    (t1.ti_hour*60*60*100+t1.ti_min*60*100+t1.ti_sec*100+t1.ti_hund);
printf("The Elapse time is: %d x 1/100 second \n",elapse);

/* clean up */
getch();
closegraph();
return 0;
}

int line_mat(int x1,int y1,int x2,int y2,int color)
// Algorithm y = m * x + b
// It is assumed that x1 < x2 and the gradient is less than 1.
{ float m = ((float) (y2 - y1)) / ((float) (x2 - x1));
float c = y1 - m * x1;
for ( int x = x1; x <= x2; x++)
{ float fy = m * x + c;
int y = fy + 0.5;
putpixel(x,y,color);
}
return(0);
}

int line_dda(int x1,int y1,int x2,int y2,int color)
// Algorithm digital differential analyzer
{ int dx,dy,step,k;
float x_increment,y_increment,x,y;
dx = x2-x1; dy = y2-y1;
// determine maximum step
if (abs(dx) > abs(dy)) step=abs(dx); else step=abs(dy);
x_increment = float(dx) / float(step);
y_increment = float(dy) / float(step);
x = x1; y = y1;
putpixel(int (x+0.5),int(y+0.5),color);
for (k=1;k<=step;k++)
{ x = x+x_increment;
y = y+y_increment;
putpixel(int(x+0.5),int(y+0.5),color);
}
return(0);
}

int line_bre(int x1,int y1,int x2,int y2,int color)
// Algorithm Bresenham
{ int dx,dy,x,y,x_end;
int p,const1,const2;
dx = x2-x1; dy = y2-y1;
p = 2*dy-dx; y = y1;
const1 = 2*dy; const2 = 2*(dy-dx);
// determine which point to use as start, which as end
if (x1 > x2)
{ x = x2; y = y2; x_end = x1; }
else
{ x = x1; y = y1; x_end = x2; }
putpixel(x,int(y+0.5),color);
while ( x < x_end )
{ x++;
if ( p < 0 )
    p = p+const1;
else
{ y = y+1;
    p = p+const2;
}
putpixel(x,int(y+0.5),color);
}
return(0);
}

int line_mid(int x1,int y1,int x2,int y2,int color)
// Algorith midpoint
// It is assumed that x1 < x2 and the gradient is less than 1.
{ int x,y=y1;
int a = y2 - y1;
int b = x2 - x1;
int G = 2 * a - b; // Decision variable
int DeltaG1 = 2 * (a - b);
int DeltaG2 = 2 * a;
for (x = x1; x <= x2; x++)
{ if (G > 0)
    { G += DeltaG1;
    y++; ;    // Next column and row.
    putpixel(x,y,color);
    }
    else
    { G += DeltaG2;
// y not changed     // Next column.
    putpixel(x,y,color);
    }
}
return (0);
}


int circ_mat(int xc,int yc,int r,int color)
// Algorithm y = yc +/- sqrt(r^2-(x-xc)^2)
// It is assumed that theta 45 degrees
{ int x, y, dy;
for ( x = xc; x <= xc+int (r/2); x++)
{ dy = int( sqrt( double(r)*double(r)- double ((x-xc)*(x-xc))) + 0.5);
putpixel(x,yc+dy,color);
}
return(0);
}

int circ_bre(int xc,int yc,int r,int color)
// Algorithm y = yc +/- sqrt(r^2-(x-xc)^2)
// It is assumed that theta 45 degrees
{ int x, y, p;
x = 0; y = r; p = 3 - 2 * r;
while ( x < y )
{ putpixel(xc+x,yc+y,color);
if ( p < 0 ) p = p + 4 * x + 6;
else
{ p = p + 4 * ( x-y) + 10;
    y = y -1;
}
x++;
}
return (0);
}

int circ_mid(int xc,int yc,int r,int color)
/* Draw the second octant of a circle centred on the top
left corner of the screen. This particular algorithm will only draw
an arc whose inclination is between 0 and 45 degrees.
*/
{ int x, y, G, DeltaG1, DeltaG2;
x = 0; y = r;
G = 1 - r;
DeltaG1 = 3; DeltaG2 = -2 * r + 5;
while (x < y)
{ if (G < 0)
    { G += DeltaG1;
    DeltaG1 += 2;
    DeltaG2 = DeltaG2 + 2;
    }
    else
    { G += DeltaG2;
    DeltaG1 += 2;
    DeltaG2 += 4;
    y--;
    }
    x++;
    putpixel(xc+x,yc+y,color);
}
return(0);
}



<iframe src ="http://www.mathway.com/embed.aspx?p=algebra" width="100%" height="300">
  <p>Your browser does not support iframes.</p>
</iframe>

Kamis, 30 September 2010

KOMIK AMERIKA VS JEPANG

Pengantar
Komik adalah suatu bentuk seni yang menggunakan gambar-gambar tidak bergerak yang disusun sedemikian rupa sehingga membentuk jalinan cerita. Biasanya, komik dicetak di atas kertas dan dilengkapi dengan teks. Komik dapat diterbitkan dalam berbagai bentuk, mulai dari strip dalam koran, dimuat dalam majalah, hingga berbentuk buku tersendiri.

Istilah Bergambar
Akronim cerita (ber)gambar, menurut Marcell Boneff mengikuti istilah cerpen (cerita pendek) yang sudah terlebih dahulu digunakan, dan konotasinya menjadi lebih bagus, meski terlepas dari masalah tepat tidaknya dari segi kebahasaan atau etimologis kata-nya.
Tetapi menilik kembali pada kelahiran komik, maka adanya teks dan gambar secara bersamaan dinilai oleh Francis Laccasin (1971) sebagai sarana pengungkapan yang benar-benar orisinal. Kehadiran teks bukan lagi suatu keharusan karena ada unsur motion yang bisa dipertimbangkan sebagai jati diri komik lainnya.
Karena itu di dalam istilah komik klasik indonesia, cerita bergambar, tak lagi harus bergantung kepada cerita tertulis. Hal ini disebut Eisner sebagai graphic narration (terutama di dalam film & komik).


Perbandingan Komik Amerika dan Komik Jepang :

Komik Jepang
1.       Ukuran Lebih kecil
2.       Berwarna Hitam Putih
3.       Sosok tokohnya lebih detil
4.       Komik lebih cenderung ditujukan bukan sekedar hiburan kecil semata tapi juga    
          hiburan serius (seperti novel) dan ditujukan untuk semua kalangan.
5.       Komik Jepang ceritanya lebih banyak menekankan ke arah  filosofis dan rumit.

Komik Eropa/Amerika
1.       Ukuran A4
2.       Lebih Banyak Yg Berwarna
3.       Alur cerita komik eropa tidak terlalu banyak basa-basi
4.       Komik lebih cenderung untuk hiburan dan lebih diperuntukan pada anak-anak dan 
          remaja saja

Komik Jepang

Manga merupakan kata komik dalam bahasa Jepang; di luar Jepang, kata tersebut digunakan khusus untuk membicarakan tentang komik Jepang. Mangaka adalah orang  yang menggambar manga. Komik Jepang yang dikenal dengan istilah manga memiliki tema cerita yang sangat luas dan bervariasi. Segalam macam tema dapat dijadikan komik yang menarik, sehingga pembaca tidak pernah merasa bosan dengan tema komik yang monoton. Ciri khas Manga juga cukup banyak, mulai dari semi realis sampai gaya kartunal. Namun secara garis besar bisa dibagi menjadi 6 macam :

1.  Karakter komik animasi, kepala, tangan dan kakinya besar. Otot dan sendi tidak perlu digambarkan secara detail dan bagian tubuh tampak sedikit lebih kecil dibandingkan ukuran kepala.
2.  Karakter SD (Super Deform), ukuran tubuh yang kecil dengan kepala yang besar. Tidak selalu tampak lucu.
3.  Tipe bishoujo (perempuan muda dan cantik), memiliki pinggang yang kecil. Otot dan sendi digambarkan cukup jelas.
4.  Karakter shoujo Manga (komik perempuan), tubuh keseluruhan terlihat sangat langsing dengan kaki yang panjang.
5.  Karakter comical SD, berbeda dengan karakter SD, tipe ini terlihat sangat lucu dengan lengan yang kurus dan ukuran kepala, tangan, dan kaki yang besar.
6.  Real Type (tipe realis), ukuran dan proporsi yang cukup realis dimana panjang tubuh bagian atas / torso hampir sama dengan panjang kaki dan karakter wanitanya tidak memiliki pinggang kecil yang berlebihan seperti pada bishoujo Manga.



Gaya Manga ini banyak disukai dan ditiru karena banyak penyederhanaan pada garisannya (tidak serumit gaya amerika), tetapi masih mempertahankan postur yang proporsional dan memiliki tingkat kerumitan dan detail tersendiri. Meskipun gaya manga bermacam-macam, ada yang terlihat simple dan menggunakan banyak blok, tapi juga ada yang rumit dan mendetail serta menggunakan gradasi yang halus.
    Beberapa Manga yang terkenal di jepang adalah DragonBall, Shogakukan, Naruto, Sueisha.
        

    Komik Eropa

    Perkembangan komik di eropa diawali dengan ukiran kayu hingga pada akhirnya sekitar abad 15 ditemukan mesin cetak yang membantu penyebaran komik lebih luas. Seluruh masyarkat dari berbagai lapisan social  menikmati adanya sebuah komik.


    Pada abad ke 18 munculnya caricature (Italia : caricare yang artinya melebih-lebihkan) yang popular, untuk menggambar wajah manusia dengan melebih-lebihkan bagian tertentu dari wajahnya. Karikatur dianggap sebagai salah satu awal dari kemunculan cartoon atu film animasi, yang bersifat representative atau simbolik serta mengandung unsure humor maupun sindirian. 


    Pada tahun 1731 muncul pictorial storytelling oleh William Hogart, berjudul A Harlots Progress yakni satu set lukisan yang terdiri dari enam lembar, dibuat untuk di pandang secara berdampingan. Tak lama setelah itu, pada pertengaha abad ke 18. Rudolphe Topffer yang dikenal sebagai BAPAK Komik modern memperkenalkan penggunaan panel-panel pembatas serta penyelarasan kata-kata denga gambar yang berfungsi saling memperkuat gagasa satu denga lainnya. 


    Tahun 1895 tokoh yellow Kid karya Richard F.Outcault yang segera menjadi rebutan antara dua media massa besar di Amerika yaitu, New York word dan new York jurnal. 
    Tahun 1960 sudah mulai pencetakkan komik menggunakan teknologi cetak yang berwarna yang merupakan sebagai suatu hal yang dapat melejitkan populartas komik di Amerika. Berikut ini beberapa komik yang menduduki  peringkat atas Amerika, yang beberap diantranya mungkin tidak asing bagi kita : 


    • 1906-1914 - Little Nemo in Slumberland karangan Windsor Mc Kay
    • 1911-1944 - Krazy Kat karangan George Herriman 
    • 1929 - Tarzan karangan Hal Foster 
    • 1933 - Flash Gordon 
    • 1938 - Superman karangan Jerry Siegel dan Joe Shuster
    • 1946-1975 - Archie karangan Bob Montana
    • 1981 - Sylvia karangan Nicole Hollander 

    Di eropa, juga muncul komik-komik yang  kini dikenl secara meluas di seluruh dunia, contohnya Tintin, Asterix, Smurf, Agen Polisi, Si Bob, Steven Sterk, Johan dan Pirlouit dan sebagainya. Komik-komik tersebut perkembangannya di dukung oleh industry komik, dan berkat dukungan tersebut komik tersebut menyebar ke seluruh duia.


    Memasuki tahun 1980-an, kolektor serta kalangan orang-orang berpendidikan mulai menaruh minat yang besar terhadap komik, sehingga diadakanlah konferensi-konferensi serta konvensi komik, kemudian pelelangan komik, dan terbit juga majalah-majalah yang memuat maupun membahas mengenai komik.


    Komik Eropa Asterix

    Komik Eropa Tintin

    Kelebihan Komik :

    Komik merupakan media untuk berkomunikasi. Seperti yang telah kita ketahui gambar, dan kata-kata adalah unsur yang penting dalam menceritakan sesuatu.

    Selain itu komik itu juga merupakan media hiburan dan juga media untuk menyampaikan informasi. Pesan yang ada dalam komik menjadi lebih mudah dipahami dengan adanya gambar (bandingkan jika kita harus membaca novel tanpa gambar disaat kita sedang lelah), apalagi dalam komik banyak adegan yang bisa dibumbui humor ataupun adanya penambahan efek dramatisasi yang menyebabkan adegan tertentu menjadi semakin lucu.


    Tutorial Cara Membuat Komik Via PIXTON :



    Sumber:
    http://iniitublogedo.blogspot.com/2009/11/sejarah-komik-di-eropa-dan-amerika.html
    http://id.wikipedia.org/wiki/Manga