Project 2D

Post on 27-Nov-2014

173 views 1 download

description

computer grafic with visual C

Transcript of Project 2D

Project

Grafika Komputer

April Fatmasari

7409040030 / 2 D4 IT-A

‘ Pegunungan Nyaman ‘

Teknik Informatika

Politeknik Elektronika Negeri Surabaya

ITS

Grafika Komputer April Fatmasari | 709040030

TEMA

Daerah pegunungan yang nyaman

INTRODUCING

Dalam pembuatan pemandangan ini dibutuhkan beberapa fungsi-fungsi utama yang

mengenterpretasikan berbagai macam obyek pendukung yang dapat dipanggil menggunakan

fungsi userdraw(). Selain itu juga ada fungsi-fungsi dasar yang mendukung terbentuknya fungsi-

fungsi tersebut seperti fungsi warna, fungsi lingkaran, fungsi pembentuk obyek2D, dll.

#include <stdlib.h>#include <gl/glut.h>#include <math.h>

Grafika Komputer April Fatmasari | 709040030

#include <time.h>#include <fstream.h>// Definisi struktur datatypedef struct {

float x,y;} point2D_t;

typedef struct {float v[3];

} vector2D_t;

typedef struct {float m[3][3];

} matrix2D_t;

typedef struct {float r,g,b;

} color_t;

typedef struct {point2D_t p,p0;float d,s;

} obyek_t;

// Setting warnavoid setColor(float r,float g,float b){

glColor3f(r,g,b);}

void setColor(color_t col){glColor3f(col.r,col.g,col.b);

}

// Konversi Datavector2D_t point2vector(point2D_t pnt){ vector2D_t vec; vec.v[0]=pnt.x; vec.v[1]=pnt.y; vec.v[2]=1.;

return vec;}

point2D_t vector2point(vector2D_t vec){ point2D_t pnt; pnt.x=vec.v[0]; pnt.y=vec.v[1];

Grafika Komputer April Fatmasari | 709040030

return pnt;}

// Definisi dan pengolahan matrikmatrix2D_t createIdentity(void) {

matrix2D_t u;int i,j;for (i=0;i<3;i++) {

for(j=0;j<3;j++) u.m[i][j]=0.;u.m[i][i]=1.;

}return u;

}

matrix2D_t translationMTX(float dx,float dy){

matrix2D_t trans=createIdentity();trans.m[0][2]=dx;trans.m[1][2]=dy;return trans;

}

matrix2D_t scalingMTX(float mx,float my){

matrix2D_t scale=createIdentity();scale.m[0][0]=mx;scale.m[1][1]=my;return scale;

}

matrix2D_t rotationMTX(float theta){

matrix2D_t rotate=createIdentity();float cs=cos(theta);float sn=sin(theta);rotate.m[0][0]=cs; rotate.m[0][1]=-sn;rotate.m[1][0]=sn; rotate.m[1][1]=cs;return rotate;

}

matrix2D_t operator * (matrix2D_t a, matrix2D_t b){

matrix2D_t c;//c=a*bint i,j,k;for (i=0;i<3;i++) for (j=0;j<3;j++) {

c.m[i][j]=0;for (k=0;k<3;k++)

c.m[i][j]+=a.m[i][k]*b.m[k][j];

Grafika Komputer April Fatmasari | 709040030

}return c;

}

vector2D_t operator * (matrix2D_t a, vector2D_t b){

vector2D_t c;//c=a*bint i,j;for (i=0;i<3;i++) {

c.v[i]=0;for (j=0;j<3;j++)

c.v[i]+=a.m[i][j]*b.v[j];}return c;

}

// Fungsi-fungsi untuk menggambarvoid drawDot(float x,float y){

glBegin(GL_POINTS);glVertex2f(x,y);glEnd();

}

void drawLine(float x1, float y1, float x2,float y2){glBegin(GL_LINES);glVertex2f(x1,y1);glVertex2f(x2,y2);glEnd();

}

void drawLine6p(float x1, float y1, float x2,float y2,int m,color_t col){setColor(col);glLineWidth(m);glBegin(GL_LINES);glVertex2f(x1,y1);glVertex2f(x2,y2);glEnd();

}

void drawPolyline(point2D_t p[],int n){glBegin(GL_LINE_STRIP);for(int i=0;i<n;i++) glVertex2f(p[i].x,p[i].y);glEnd();

}

void drawPolygon(point2D_t p[],int n){glBegin(GL_LINE_LOOP);for(int i=0;i<n;i++) glVertex2f(p[i].x,p[i].y);

Grafika Komputer April Fatmasari | 709040030

glEnd();}

void fillPolygon(point2D_t p[], color_t col,int n){glBegin(GL_POLYGON);setColor(col);for(int i=0;i<n;i++) glVertex2f(p[i].x,p[i].y);glEnd();

}

void gradatePolygon(point2D_t p[],color_t col[],int n){glBegin(GL_POLYGON);for(int i=0;i<n;i++) {

setColor(col[i]);glVertex2f(p[i].x,p[i].y);

}glEnd();

}

void centerPolygon(point2D_t pnt[],point2D_t pc,int num, color_t col1,color_t col2){

int i;glBegin(GL_LINES);

for (i=0;i<num;i++) {setColor(col1);glVertex2f(pnt[i].x, pnt[i].y);setColor(col2);glVertex2f(pc.x, pc.y);

}glEnd();

}

static void createCircle(point2D_t p[],float r){for(int i=0;i<360;i++){

p[i].x=r*cos(i/57.3);p[i].y=r*sin(i/57.3);

}}void drawCircle(float x,float y,float a,float b,int deg1,int deg2){

point2D_t shape[361];double srad;for(int s=0;s<deg2-deg1;s++){

srad=(s+deg1)*3.14/180; shape[s].x=(float)(a*cos(srad)+x); shape[s].y=(float)(b*sin(srad)+y); }

Grafika Komputer April Fatmasari | 709040030

drawPolyline(shape,deg2-deg1);};

static void createPolar(point2D_t p[],float r[]){for(int i=0;i<360;i++){

p[i].x=r[i]*cos(i/57.3);p[i].y=r[i]*sin(i/57.3);

}}point2D_t interpolate2D(point2D_t p1,point2D_t p2,int k,int n){ point2D_t q; q.x=p1.x+(float)k*(p2.x-p1.x)/n; q.y=p1.y+(float)k*(p2.y-p1.y)/n; return q;}

void Polygone(point2D_t pnt[],color_t col, int n,int size){

setColor(col);glLineWidth(size);glBegin (GL_LINE_LOOP); for(int i=0;i<n;i++){ glVertex2f(pnt[i].x,pnt[i].y); }glEnd();

}

GAMBARAN UMUM

Project yang saya buat ini menggambarkan suatu pemandangan desa yang aman, nyaman dan tentram. Ada satu gubuk kecil untuk peristirahatn orang – orang yang akan melancong. Suasana deret pegunungan sangat terasa dengan aliran sungai yang lumayan deras dan di saat cuaca tidak mendung menambah kesan sejuk.

STRUKTURAL GAMBAR

POHON

Grafika Komputer April Fatmasari | 709040030

Untuk pohon, menggambar dengan menggunakan fungsi point2vector kemudian dilakukan translasi sebesar -45, setelah itu memanggil fungsi vector2point. Pewarnaannya dengan funsgi gradatePolygon yang memberikan parameter point2D_t, color_t, int n(jumlah titik koordinat yang dibuat).

Menggambar dedaunan pohon menggunakan fungsi koordinat polar dengan nilai r=5, r=4, r=2 dan r=2,5 sehingga terbentuk lengkung – lengkung seperti pada gambar. Pewarnaan daun dengan memanggil fungsi fillPolygon, warna yang dihasilkan tidak bergradasi seperti batang pohon. Karena fillPolygon hanya mendeklarasikan untuk satu warna tanpa disertai titik koordinat.

/*tampil pohon*/point2D_t batangPohon1[14]={{22.5,-14},{22.4,-11},{22.5,-7},{22.4,-5},{22.5,-3.5},{22.4,-1},{23.4,1},{24.3,0},{24.5,-2},{25,-6},{25.5,-11},{26,-13},{27,-13.5},{28.5,-14}};point2D_t batangPohon2[5]={{22.5,-14},{20,-14},{21,-13.5},{21.8,-13},{22.4,-11}};point2D_t cabang1[8]={{22.4,-5},{22,-4},{21.3,-3},{19.6,-2.4},{20,-2.8},{20,-1.2},{21,-2.5},{22.5,-3.5}};point2D_t cabang2[7]={{22.4,-1},{21.8,2},{21,4},{21.5,4},{22,3.5},{23,1.5},{23.4,1}};point2D_t cabang3[8]={{23.4,1},{23.6,2},{24,3},{24.6,4},{25,2.5},{25.5,2.2},{25,1.2},{24.3,-1}};

for(i=0;i<14;i++) {

vecBatang1=point2vector(batangPohon1[i]);vecBatang1=translationMTX(-45,0)*vecBatang1;batangPohon1a[i]=vector2point(vecBatang1);

} for(i=0;i<5;i++)

{vecBatang2=point2vector(batangPohon2[i]);vecBatang2=translationMTX(-45,0)*vecBatang2;

Grafika Komputer April Fatmasari | 709040030

batangPohon2a[i]=vector2point(vecBatang2); } for(i=0;i<8;i++)

{vecCabang1=point2vector(cabang1[i]);vecCabang1=translationMTX(-45,0)*vecCabang1;cabang1a[i]=vector2point(vecCabang1);vecCabang3=point2vector(cabang3[i]);vecCabang3=translationMTX(-45,0)*vecCabang3;cabang3a[i]=vector2point(vecCabang3);

} for(i=0;i<7;i++) {

vecCabang2=point2vector(cabang2[i]);vecCabang2=translationMTX(-45,0)*vecCabang2;cabang2a[i]=vector2point(vecCabang2);

} gradatePolygon(batangPohon1,coklat2,14); gradatePolygon(batangPohon2,coklat2,5); gradatePolygon(cabang1,coklat2,8); gradatePolygon(cabang2,coklat2,7); gradatePolygon(cabang3,coklat2,8); //gambar daun pohon

for(s=0;s<360;s++){ srad=(s)*3.14/180;

r=4;daun1[s].x=(float) (r*cos(srad))+21;daun1[s].y=(float) (r*sin(srad))+5;r=4;daun2[s].x=(float) (r*cos(srad))+26;daun2[s].y=(float) (r*sin(srad))+4;r=4;daun3[s].x=(float) (r*cos(srad))+20;daun3[s].y=(float) (r*sin(srad))+9;r=5;daun4[s].x=(float) (r*cos(srad))+24;daun4[s].y=(float) (r*sin(srad))+9;r=2;daun5[s].x=(float) (r*cos(srad))+19;daun5[s].y=(float) (r*sin(srad))-1;r=2.5;daun6[s].x=(float) (r*cos(srad))+17.5;daun6[s].y=(float) (r*sin(srad));

} fillPolygon(daun1,hijau,360); fillPolygon(daun2,hijau,360); fillPolygon(daun3,hijau,360); fillPolygon(daun4,hijau,360);

Grafika Komputer April Fatmasari | 709040030

fillPolygon(daun5,hijau,360); fillPolygon(daun6,hijau,360);

AWANKeadaan I

Keadaan II

Pembuatan awan, lengkung – lengkungnya dengan menggunakan fungsi koordinat polar sebanyak 8 lengkungan. Untuk pergerakan awan, bergeser ke kiri menggunakan fungsi translasi, dengan titik -50* tick yang sebelumnya diubah menjadi point2vector. Untuk pewarnaannya dengan memanggil fungsi fillPolygon.

/*tampil awan*/ for(int s=0;s<360;s++)

{srad=(s)*3.14/180;r=1.5;

r=4;awan1[s].x=(float) (r*cos(srad))+20;awan1[s].y=(float) (r*sin(srad))+30;r=2.3;awan2[s].x=(float) (r*cos(srad))+17;awan2[s].y=(float) (r*sin(srad))+33;r=2.3;awan3[s].x=(float) (r*cos(srad))+12;awan3[s].y=(float) (r*sin(srad))+30.5;r=2.5;awan4[s].x=(float) (r*cos(srad))+15;awan4[s].y=(float) (r*sin(srad))+30;r=2.5;awan9[s].x=(float) (r*cos(srad))+24.5;awan9[s].y=(float) (r*sin(srad))+28;//awan bawahr=2.4;awan5[s].x=(float) (r*cos(srad))-20;awan5[s].y=(float) (r*sin(srad))+28;r=3;awan6[s].x=(float) (r*cos(srad))-17;awan6[s].y=(float) (r*sin(srad))+29;r=1.5;awan7[s].x=(float) (r*cos(srad))-12;awan7[s].y=(float) (r*sin(srad))+30;

Grafika Komputer April Fatmasari | 709040030

r=2.3;awan8[s].x=(float) (r*cos(srad))-14;awan8[s].y=(float) (r*sin(srad))+31;

}//gerak awan

for(i=0;i<360;i++){vecAwan1=point2vector(awan1[i]);

vecAwan1=translationMTX(10+(-50*tick),0)*vecAwan1;awan1[i]=vector2point(vecAwan1);

vecAwan2=point2vector(awan2[i]);vecAwan2=translationMTX(10+(-50*tick),0)*vecAwan2;awan2[i]=vector2point(vecAwan2);

vecAwan3=point2vector(awan3[i]);vecAwan3=translationMTX(10+(-50*tick),0)*vecAwan3;awan3[i]=vector2point(vecAwan3);

vecAwan4=point2vector(awan4[i]);vecAwan4=translationMTX(10+(-50*tick),0)*vecAwan4;awan4[i]=vector2point(vecAwan4);

vecAwan5=point2vector(awan9[i]);vecAwan5=translationMTX(10+(-50*tick),0)*vecAwan5;awan9[i]=vector2point(vecAwan5);

vecAwan6=point2vector(awan5[i]);vecAwan6=translationMTX(10+(-50*tick),0)*vecAwan6;awan5[i]=vector2point(vecAwan6);

vecAwan7=point2vector(awan6[i]);vecAwan7=translationMTX(10+(-50*tick),0)*vecAwan7;awan6[i]=vector2point(vecAwan7);

vecAwan8=point2vector(awan7[i]);vecAwan8=translationMTX(10+(-50*tick),0)*vecAwan8;awan7[i]=vector2point(vecAwan8);

vecAwan9=point2vector(awan8[i]);vecAwan9=translationMTX(10+(-50*tick),0)*vecAwan9;awan8[i]=vector2point(vecAwan9);}

fillPolygon(awan1,putih,360);fillPolygon(awan2,putih,360);fillPolygon(awan3,putih,360);fillPolygon(awan4,putih,360);fillPolygon(awan9,putih,360);fillPolygon(awan5,putih,360);fillPolygon(awan6,putih,360);fillPolygon(awan7,putih,360);fillPolygon(awan8,putih,360);

//tick a+=d; if(a>n || a<0) d=-d;

Grafika Komputer April Fatmasari | 709040030

if(tick3>2) tick3=0; if(tick>1) tick=0; tick2+=0.0001; tick+=0.0002; tick3+=0.0001

GUBUK

Penggambaran gubuk teresbut secara primitive dengan drawline satu persatu garis- garis. Fungsi glLineWidth untuk ketebalan garis gambar dan pewarnaannya denganmenggunakan fillPolygon.Untuk menggambar jalan dengan menggunakan point2D_t, pewarnaan juga secara fillPolygon. /*tampil gubuk*/

point2D_t jalanRumah[4]={{-20,-10},{-23,-10},{-24,-17},{-19,-17}}; glLineWidth(2);

setColor(0.3,0,0);//depan kiridrawLine(-24,-10,-26,-9);drawLine(-26,-9,-26, -2.5);drawLine(-24,-2.5,-24,-10);drawLine(-24,-10,-21.5,-9.5);drawLine(-24,-8,-21.5,-7.5);drawLine(-21.5,-9.5,-21.5,-7.5);drawLine(-24,-8,-26,-7);drawLine(-23.6,-7.8,-23.6,-9.8);drawLine(-23.2,-7.7,-23.2,-9.7);drawLine(-22.8,-7.6,-22.8,-9.7);drawLine(-22.4,-7.5,-22.4,-9.6);drawLine(-21.9,-7.5,-21.9,-9.5);//samping kiridrawLine(-26,-7,-20,-6);drawLine(-25.6,-7.4,-25.6,-9.4);drawLine(-25.2,-7.6,-25.2,-9.6);drawLine(-24.6,-7.9,-24.6,-9.9);//depan kanandrawLine(-18,-3.5,-18,-9);drawLine(-18,-9,-20.5,-9.5);drawLine(-20.5,-9.5,-20.5,-7.5);drawLine(-20.5,-7.5,-18,-7);drawLine(-20,-7.5,-20,-9.5);drawLine(-19.6,-7.4,-19.6,-9.4);

Grafika Komputer April Fatmasari | 709040030

drawLine(-19.2,-7.3,-19.2,-9.3);drawLine(-18.8,-7.2,-18.8,-9.2);drawLine(-18.4,-7.1,-18.4,-9.1);//drawLine(-18,-7,-20,-6);drawLine(-20,-6,-20,-7.2);drawLine(-20,-7.2,-22,-7.8);//drawLine(-20,-3.8,-20,-6);////ke atapdrawLine(-25,-1,-27,-4);drawLine(-27,-4,-26,-4);drawLine(-25,-1,-23,-4);drawLine(-25,-1,-19,-0.5);drawLine(-23,-4,-17,-3.5);drawLine(-19,-0.5,-17,-3.5);point2D_t atap[4]={{-17,-3.5},{-23,-4},{-25,-1},{-19,-0.5}};point2D_t atap2[3]={{-25,-1},{-27,-4},{-26,-4}};fillPolygon(atap,brotu,4);fillPolygon(atap2,brotu,3);fillPolygon(jalanRumah,coklatTua,4);

RUMPUT

Rumput yang digambar ini dengan point2D_t yang diubah terlebih dahulu menjadi vector untuk ditranslasikan kemudian diubah kembali dengan fungsi vector2point. Pewarnaannya secara gradatePolygon sehingga dihasilkan gradasi warna seperti pada gambar./*rumput*/point2D_t rumput[12]={{-30,-18},{-27,-16},{-29,-15.5},{-27.5,-14},

{-29.5,-15},{-30,-12},{-30,-15},{-31.5,-13.5},{-31,-15.5},{-32.5,-15},{-31.5,-16.5},{-29,-17}};

for(i=0;i<12;i++) { vecRumput=point2vector(rumput[i]);

vecRumput=translationMTX((5*j)/2,0)*vecRumput;rumput[i]=vector2point(vecRumput);

} gradatePolygon(rumput,warnagunung,12);

PEGUNUNGAN

Grafika Komputer April Fatmasari | 709040030

Menggambar 3 gunung dengan penggunaan point2D_t sebanyak 3 juga , untuk titik-titik koordinatnya juga banyak supaya dihasilkan gambar gunung yang tidak kaku(lancip) dan pewarnaannya secara gradatePolygon dengan titik yang banyak agar dihasilkan warna kombinasi yang pas./*tampil gunung*/point2D_t gunung[18]={{-30,0},{-28,3},{-26,4},{-24,6},{-11,12},{-12,17},

{-10,19},{-7,21},{-2,25},{-1,25},{1,24.5},{4,23},{8,20},{16,12},{22,9},{24,9},{26,8},{32,0}};

point2D_t gunung2[5]= {{20,9}, {26, 12}, {28,20}, {32,25}, {32, 0}};point2D_t gunung3[5]= {{-22, 7.5}, {-24, 12}, {-29, 20}, {-30,23}, {-30, 0}};

gradatePolygon(gunung,warnagunung,18);gradatePolygon(gunung2,warnagunung2, 5);gradatePolygon(gunung3,warnagunung3, 5);

LANGITPenggambaran langit hanya membagi koordinat yang atas menjadi persegi panjang kemudian diberikan gradasi warna biru langit yang pas./*tampil langit*/point2D_t langit[4]={{-30,0},{-30,40},{32,40},{32,0}};gradatePolygon(langit,biru1,4);

SUNGAIPenggambaran sungai dengan membagi menjadi 4 koordinat dengan penggunaan transalsi dengan nilai y=-52* vecsungai. kemudian diberikan gradasi warna biru sungai yang pas.Riak air yang dibuat secara random dengan memanffatkan sperti menggambar titik banyak namun panjangnya berbeda.for(i=0;i<4;i++{

vecSungai=point2vector(langit[i]);vecSungai=translationMTX(0,-57)*vecSungai;sungai[i]=vector2point(vecSungai);

}gradatePolygon(sungai,biru1,4);/* Menggambar riak air*/

float ra,xra,yra;

Grafika Komputer April Fatmasari | 709040030

color_t cra;for(i=0;i<20;i++){

ra=(float)5*rand()/RAND_MAX;xra=(float)(100-ra)*rand()/RAND_MAX-32;yra=(float)8*rand()/RAND_MAX-28;cra.b=0; cra.g=0-(60-yra)/2; cra.r=0-(60-yra)/2;setColor(cra);drawLine(xra,yra,xra+ra,yra);

}

MENGGAMBAR DARATANPenggambaran daratan membagi menjadi 4 koordinat persegi panjang kemudian diberikan gradasi warna hijau.

for(i=0;i<4;i++) {

vecDaratan=point2vector(langit[i]);vecDaratan=translationMTX(0,-40)*vecDaratan;daratan[i]=vector2point(vecDaratan);

}gradatePolygon(daratan,warnaDaratan,4);

FUNGSI LAIN

void display(void) { glClear(GL_COLOR_BUFFER_BIT); userdraw(); glutSwapBuffers();}

int main (int argc, char ** argv){ glutInit(&argc,argv); glutInitDisplayMode(GLUT_DOUBLE|GLUT_RGB); glutInitWindowPosition(50,50); glutInitWindowSize(750,600); glutCreateWindow("Pandang"); glClearColor(1,1,1,1); gluOrtho2D(-30,30,-30,30); glutIdleFunc(display); glutDisplayFunc(display); glutMainLoop(); return 0;}