18
Project Grafika Komputer April Fatmasari 7409040030 / 2 D4 ‘ Pegunungan Nyaman ‘ Teknik Informatika Politeknik Elektronika Negeri Surabaya

Project 2D

Embed Size (px)

DESCRIPTION

computer grafic with visual C

Citation preview

Page 1: Project 2D

Project

Grafika Komputer

April Fatmasari

7409040030 / 2 D4 IT-A

‘ Pegunungan Nyaman ‘

Teknik Informatika

Politeknik Elektronika Negeri Surabaya

ITS

Page 2: Project 2D

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>

Page 3: Project 2D

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];

Page 4: Project 2D

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];

Page 5: Project 2D

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);

Page 6: Project 2D

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); }

Page 7: Project 2D

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

Page 8: Project 2D

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;

Page 9: Project 2D

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);

Page 10: Project 2D

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;

Page 11: Project 2D

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;

Page 12: Project 2D

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);

Page 13: Project 2D

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

Page 14: Project 2D

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;

Page 15: Project 2D

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;}