Curhat, tutorial, tugas kuliah, dll..

konsep

untuk konsep konsepnya silakan baca di slide dari IT Telkom ini

implementasi dengan processing

scanline

Scanline ialah algoritma yang sederhana, dan untuk implementasinya disini saya menggunakan 3 buah status yang berfungsi untuk mendeteksi egde (garis). Filling baru dilakukan jika ketiga status itu bernilai true.
stat1 digunakan untuk mendeteksi garis pinggir bagian awal
stat2 digunakan untuk mendeteksi warna dasar dari objek, artinya warna dasar ini akan diganti oleh warna filling
stat3 digunakan untuk mendeteksi garis pinggir bagian akhir


// STANDAR TEMPLATE TUBES GRAFCIT @IT TELKOM | 2011
//--------------------------------- inisialisasi, ga perlu dirubah
static int canvasW = 600;
static int canvasH = 600;
void setup() {
	size(canvasW, canvasH);
	background(255);
}

//--------------------------------- variable global ditulis disini

//warna available;
color merah = color (255,0,0);
color biru = color (0,0,255);
color hijau = color (0,255,0);
color hitam = color (0,0,0);
color kuning = color (244, 255, 30);
color putih = color (255,255,255);
color violet = color (255,0,255);

//--------------------------------- disini mulai codingnya
void draw() {
	drawHelpLines();
	//(titik tengah x, titik tengah y, jari-jari, ketebalan garis, warna fill, warna bound);
	LingkaranFill(0,0,50,3,kuning,merah);
}

//--------------------------------- procedure/fungsi bikinan sendiri
//--------------------------------- silahkan ditulis dibawah sini
void lingkarantebal(int x0, int y0, int r, int tebal, color f, color b){
	stroke(f);
	midpoint(x0, y0, r);
	stroke(b);
	midpoint(x0, y0, r+tebal);
}

void LingkaranFill(int x0, int y0, int r, int tebal, color fillcol, color boundcol){
	lingkarantebal(x0, y0, r, tebal, fillcol, boundcol);
	filling(boundcol,fillcol,putih);
	filling(fillcol,boundcol,boundcol);
}

void filling(color fillcol, color boundcol, color back){
	int count=0;
	int a1,a2;
	a1=0;a2=0;
	boolean stat1,stat2,stat3;
	stat1=false;stat2=false;stat3=false;
	for (int i=0; i<=600; i++){
		for (int j=0; j<=600; j++){
			if (get(j,i)==fillcol){
				stat1=true;
			}
			if ((get(j,i)==back)&&(stat1==true)){
				stat2=true;
				if (a1==0){
					a1=j;
				}
			}
			if ((get(j,i)==fillcol)&&(stat2==true)){
				stat3=true;
				if (a2==0){
					a2=j;
				}
			}

		}
		if (stat3==true){
			for (int k=a1;k<=a2;k++){
				stroke(fillcol);
				point(k,i);
			}
		}
		a1=0;a2=0;
		stat1=false;stat2=false;stat3=false;
	}
	//print(4 % 2);
}

void midpoint(int x0, int y0, int r) {
	int P=1-r;
	int x=0;
	int y=r;

	plot(x0,y0,x,y);
	for (int xa=x; x<y;) {

		if (P<0)
		{
			x=x+1;
			P=P+2*x+1;
			plot(x0,y0,x,y);
		}
		else
		{
			x=x+1;
			y=y-1;
			P=P+(2*x)-(2*y)+1;
			plot(x0,y0,x,y);
		}
	}
}

void plot(int x0, int y0, int x, int y) {
	stdPoint(x+x0, y+y0);
	stdPoint(x+x0, -y+y0);
	stdPoint(-x+x0, -y+y0);
	stdPoint(-x+x0, y+y0);
	stdPoint(y+x0, x+y0);
	stdPoint(y+x0, -x+y0);
	stdPoint(-y+x0, x+y0);
	stdPoint(-y+x0, -x+y0);
}

// -------------------------------- normalisasi, ga perlu dirubah
void stdPoint(int xxx, int yyy)
{
	//stroke(warna);
	point(xxx+(canvasW/2), (yyy*-1)+(canvasH/2));
}

void drawHelpLines()
{
	stroke(233, 233, 233);
	for (int z=0; z<canvasW; z=z+1) {
		point((canvasW/2), z);
		point(z, (canvasH/2));
	}
	stroke(0, 0, 0);
}

kode kadang suka rusak, coba download originalnya disini
 
 

Bfill

silakan download sourcenya disini
salah satu kekurangannya Bfill ialah tidak bisa melakukan filling untuk ukuran objek yang besar, karena jumlah rekursif yang terlalu banyak nantinya
 

filling bawaan processing

// STANDAR TEMPLATE TUBES GRAFCIT @IT TELKOM | 2011
//--------------------------------- inisialisasi, ga perlu dirubah
static int canvasW = 600;
static int canvasH = 600;
void setup() {
  size(canvasW, canvasH);
  background(255);
}

//--------------------------------- variable global ditulis disini

//int warna;
color merah = color (255,0,0);
color biru = color (0,0,255);
color hijau = color (0,255,0);
color hitam = color (0,0,0);
color putih = color (255,255,255);
color violet = color (255,0,255);

//--------------------------------- disini mulai codingnya
void draw() {
  drawHelpLines();
  stroke(merah); //untuk warna pada stroke
  fill(hijau); //warna pada filling
  ellipse(100,100,100,100); //membuat lingkaran/elipse dengan fungsi bawaan processing
} 

//--------------------------------- procedure/fungsi bikinan sendiri
//--------------------------------- silahkan ditulis dibawah sini

// -------------------------------- normalisasi, ga perlu dirubah

void stdPoint(int xxx, int yyy)
{  
  //stroke(warna);
  point(xxx+(canvasW/2), (yyy*-1)+(canvasH/2));
}

void drawHelpLines()
{
  stroke(0, 0, 255);
  for (int z=0; z<canvasW; z=z+1) {
    point((canvasW/2), z);
    point(z, (canvasH/2));
  }
  stroke(0, 0, 0);
}

kalo code error download disini

Advertisements

Leave a Reply

Please log in using one of these methods to post your comment:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: