Grafika Komputer
‘ Pegunungan Nyaman ‘
April Fatmasari
7409040030 / 2 D4 IT-A
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 data
typedef 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 warna
void setColor(float r,float g,float b){
glColor3f(r,g,b);
}
// Konversi Data
vector2D_t point2vector(point2D_t pnt)
{
vector2D_t vec;
vec.v[0]=pnt.x;
vec.v[1]=pnt.y;
vec.v[2]=1.;
return vec;
}
return pnt;
}
}
return c;
}
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();
}
glEnd();
}
drawPolyline(shape,deg2-deg1);
};
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
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);
AWAN
Keadaan I
Keadaan II
/*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 bawah
r=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 kiri
drawLine(-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 kiri
drawLine(-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 kanan
drawLine(-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 atap
drawLine(-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
LANGIT
Penggambaran 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);
SUNGAI
Penggambaran 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 DARATAN
Penggambaran 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();
}