Professional Documents
Culture Documents
NIM: 24060119130071
Kelas: A
Source code:
#include <GL/glut.h>
#include <math.h>
typedef struct {
float m[4][4];
} matrix3D_t;
typedef struct {
float v[4];
} vector3D_t;
typedef struct {
float x;
float y;
float z;
} point3D_t;
typedef struct {
float x;
float y;
} point2D_t;
typedef struct {
float r;
float g;
float b;
} color_t;
// i j k
// a0 a1 a2
// b0 b1 b2
vector3D_t operator ^ (vector3D_t a, vector3D_t b) {
vector3D_t c; //c=a*b
c.v[0]=a.v[1]*b.v[2]-a.v[2]*b.v[1];
c.v[1]=a.v[2]*b.v[0]-a.v[0]*b.v[2];
c.v[2]=a.v[0]*b.v[1]-a.v[1]*b.v[0];
c.v[3]=1.;
return c;
}
// n: number of vertices
void gradatePolygon(point2D_t pnt[],int num,color_t col[]) {
int i;
glBegin(GL_POLYGON);
for (i=0; i<num; i++) {
setColor(col[i]);
glVertex2f(pnt[i].x, pnt[i].y);
}
glEnd();
}
////////////////////////////////////////////////////////////
void drawcharX(float x,float y) {
drawLine(x,y,x+10,y+12);
drawLine(x,y+12,x+10,y);
}
{0,-HALFAXIS,0},{0,HALFAXIS,0},
{0,HALFAXIS1,5},{0,HALFAXIS1,0},
{0,0,0},
{0,0,-HALFAXIS},{0,0,HALFAXIS},
{5,0,HALFAXIS1},{0,0,HALFAXIS1}
};
vector3D_t vec[14];
point2D_t buff[14];
int i;
typedef struct {
int NumberofVertices; //of the object,jumlah titik
point3D_t pnt[2096];
color_t col[2096];
int NumberofFaces; //of the object, jumlah faces
face_t fc[1024];
} object3D_t;
Source code di atas merupakan pendefinisian dari beberapa prosedur yang nanti akan
dijalankan saat melakukan create objek atau bentuk 3D. Seperti yang bisa kita lihat sepintas,
terdapat beberapa prosedur seperti melakukan rotasi terhadap sumbu X, Y, maupun Z, scaling
objek, menggambar garis, memberikan warna, dan masih banyak lagi.
Source code di atas harus ditambahkan sebelum membuat prosedur createobject supaya
dapat didefinisikan terlebih dahulu.
1. Bola
a) Source code tambahan dan penjelasan:
void createSphere(object3D_t &sphere,int n,float r) {
float a=6.28/n;
float b=6.28/n;
int i,j;
sphere.NumberofVertices=(n+1)*n;
for(i=0; i<=n; i++) {
for(j=0; j<n; j++) {
sphere.pnt[i*n+j].x=r*cos(j*a)*sin(i*b);
sphere.pnt[i*n+j].y=r*cos(i*b);
sphere.pnt[i*n+j].z=r*sin(j*a)*sin(i*b);
}
}
sphere.NumberofFaces=n*n+2;
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
sphere.fc[i*n+j].NumberofVertices=4;
sphere.fc[i*n+j].pnt[0]=i*n+j;
sphere.fc[i*n+j].pnt[1]=(i+1)*n+j;
sphere.fc[i*n+j].pnt[2]=(i+1)*n+j+1;
sphere.fc[i*n+j].pnt[3]=i*n+j+1;
if(j==(n-1)) {
sphere.fc[i*n+j].pnt[2]=i*n+j+1;
sphere.fc[i*n+j].pnt[3]=(i-
1)*n+j+1;
}
}
}
sphere.fc[n*n].NumberofVertices=n;
for(i=0; i<n; i++)
sphere.fc[n*n].pnt[i]=i;
sphere.fc[n*n+1].NumberofVertices=n;
for(i=0; i<n; i++)
sphere.fc[n*n+1].pnt[i]=(n+1)*n-1-i;
color_t c= {1,1,0};
for(i=0; i<sphere.NumberofFaces; i++)
sphere.fc[i].col=c;
for(i=0; i<sphere.NumberofVertices; i++)
sphere.col[i]=c;
}
void userdraw(void) {
matrix3D_t
tilting=rotationXMTX(0.25)*rotationYMTX(-0.5);
setColor(0,1,0);
drawAxes(tilting);
object3D_t bola;
createSphere(bola,20,100);
setColor(0,0,0);
draw3D(bola,tilting);
}
Prosedur userdraw ini digunakan membuat objek 3D tadi (bola) sehingga akan
muncul di program.
tilting yang didefinisikan dengan tipe bentukan matrix3D_t akan dirotasikan
berdasar sumbu X dan sumbu Y sejauh masing-masing 0.25 dan -0.5. Kemudian
program akan menset warna RGB dengan nilai (0, 1, 0) atau berwarna hijau. Setelah
mengeset warna, program akan menggambar garis koordinat dengan menggunakan
prosedur drawAxes. Garis koordinat selesai dibuat, lalu membuat objek bolanya. Objek
bola didefinisikan terlebih dahulu dengan tipe bentukan object3D_t dan diberi nama
“bola”. Setelah itu kita menjalankan prosedur createSphere(bola, 20, 100) yang berarti,
kita akan membuat objek bola dengan 20 sisi yang akan mengelilingi bola dan skala
ukuran 100. Kemudian, lakukan set warna hitam yaitu (0, 0, 0) agar objek bola menjadi
hitam. Yang terakhir gambar bola dengan koordinat yang sudah dibentuk dengan
draw3D(bola, tilting).
int main(int argc, char **argv) {
glutInit(&argc,argv);
glutInitDisplayMode ( GLUT_DOUBLE | GLUT_RGB );
glutInitWindowSize(680,480);
glutCreateWindow ("Bola");
glClearColor(1.0, 1.0, 1.0, 0.0);
gluOrtho2D(-500., 500., -350.0, 350.0);
glutIdleFunc(display); // idle event call back
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
Fungsi main adalah driver utama atau program utama yang menjalankan
semua prosedur yang sudah dibuat sebelumnya. Main akan membentuk tampilan
window dengan ukuran 680 x 480 dan warna background dari jendela tersebut diberi
warna putih (1, 1, 1, 0).
b) Screenshot
2. Silinder
a) Source code tambahan dan penjelasan:
void createCylinderN (object3D_t &silinder,int m,int
n,float r[],float h[]) {
float a=6.26/n;
float b=0;
int i,j;
silinder.NumberofVertices=(m+1)*n;
for(i=0; i<=m; i++) {
if(i>0) b=b+h[i-1];
for(j=0; j<n; j++) {
silinder.pnt[i*n+j].x=r[i]*cos(j*a);
silinder.pnt[i*n+j].y=b;
silinder.pnt[i*n+j].z=r[i]*sin(j*a);
}
}
silinder.NumberofFaces=m*n+2;
for(i=0; i<m; i++) {
for(j=0; j<n; j++) {
silinder.fc[i*n+j].NumberofVertices=4;
silinder.fc[i*n+j].pnt[0]=i*n+j;
silinder.fc[i*n+j].pnt[1]=(i+1)*n+j;
silinder.fc[i*n+j].pnt[2]=(i+1)*n+j+1;
silinder.fc[i*n+j].pnt[3]=i*n+j+1;
if(j==(n-1)) {
silinder.fc[i*n+j].pnt[2]=i*n+j+1;
silinder.fc[i*n+j].pnt[3]=(i-
1)*n+j+1;
}
}
}
silinder.fc[m*n].NumberofVertices=n;
for(i=0; i<n; i++) silinder.fc[m*n].pnt[i]=i;
silinder.fc[m*n+1].NumberofVertices=n;
for(i=0; i<n;
i++)silinder.fc[m*n+1].pnt[i]=(m+1)*n-1-i;
}
Fungsi main adalah driver utama atau program utama yang menjalankan
semua prosedur yang sudah dibuat sebelumnya. Main akan membentuk tampilan
window dengan ukuran 680 x 480 dan warna background dari jendela tersebut diberi
warna putih (1, 1, 1, 0).
b) Screenshot
m = 3, n = 20 m = 4, n = 20
r[4] = {60,60,60,60} r[5] = {50,60,60,20,20}
h[3] = {40,40,40} h[4] = {10,70,50,30}
m = 4, n = 4
r[5] = {20,20,60,60,50}
h[4] = {30,50,70,10}
3. Gelas
a) Source code tambahan dan penjelasan
void createCylinderN(object3D_t &silinder,int m, int
n,float r[],
float h[]) {
float a=6.26/n;
float b=0;
int i,j;
silinder.NumberofVertices=(m+1)*n;
for(i=0; i<=n; i++) {
if(i>0) b=b+h[i-1];
for(j=0; j<n; j++) {
silinder.pnt[i*n+j].x=r[i]*cos(j*a);
silinder.pnt[i*n+j].y=b;
silinder.pnt[i*n+j].z=r[i]*sin(j*a);
}
}
silinder.NumberofFaces=m*n+2;
for(i=0; i<m; i++) {
for(j=0; j<n; j++) {
silinder.fc[i*n+j].NumberofVertices=4;
silinder.fc[i*n+j].pnt[0]=i*n+j;
silinder.fc[i*n+j].pnt[1]=(i+1)*n+j;
silinder.fc[i*n+j].pnt[2]=(i+1)*n+j+1;
silinder.fc[i*n+j].pnt[3]=i*n+j+1;
if(j==(n-1)) {
silinder.fc[i*n+j].pnt[2]=i*n+j+1;
silinder.fc[i*n+j].pnt[3]=(i-
1)*n+j+1;
}
}
}
silinder.fc[m*n].NumberofVertices=n;
for(i=0; i<n; i++) silinder.fc[m*n].pnt[i]=i;
silinder.fc[m*n+1].NumberofVertices=n;
for(i=0; i<n; i++)
silinder.fc[m*n+1].pnt[i]=(m+1)*n-1-i;
}
Konsep gelas ini sama seperti silinder bertumpuk pada poin 2. Prosedur
createCylinderN memiliki 5 parameter, yaitu silinder yang memiliki tipe bentukan
object3D_t, m dan n bertipedata integer, r yang merupakan array dengan tipe data
float, dan h yang merupakan array yang bertipedata float. Parameter sphere berfungsi
mendefinisikan sebuah nama objek dan mengambil tipe data bentukan object3D_t.
Parameter n adalah jumlah titik yang membentuk alas lingkaran. Parameter r berfungsi
sebagai jari-jari pada setiap lingkaran yang berupa array.
Definisi koordinat koordinat tabung yang diberikan pada code:
𝑥𝑖𝑗 = 𝑟𝑖 cos(𝑗 ∙ 𝑎)
𝑦𝑖𝑗 = 𝑏
𝑧𝑖𝑗 = 𝑟𝑖 sin(𝑗 ∙ 𝑎)
void userdraw(void) {
matrix3D_t tilting=rotationXMTX(0.5)*rotationYMTX(-
0.25);
setColor(0,1,0);
drawAxes(tilting);
object3D_t o;
float r[5]= {40,50,70,70,68};
float h[4]= {5,70,100,5};
setColor(0,0,0);
createCylinderN(o,4,20,r,h);
draw3D(o,tilting);
}
Fungsi main adalah driver utama atau program utama yang menjalankan
semua prosedur yang sudah dibuat sebelumnya. Main akan membentuk tampilan
window dengan ukuran 680 x 480 dan warna background dari jendela tersebut diberi
warna putih (1, 1, 1, 0).
b) Screenshot
m = 4, n = 20 m = 2, n = 12
r[5] = {40,50,70,70,68} r[3] = {30,40,60}
h[4] = {5,70,100,5} h[2] = {5,140}
4. Botol
a) Source code tambahan dan penjelasan
void createCylinderN(object3D_t &silinder,int m, int
n,float r[],
float h[]) {
float a=6.26/n;
float b=0;
int i,j;
silinder.NumberofVertices=(m+1)*n;
for(i=0; i<=n; i++) {
if(i>0) b=b+h[i-1];
for(j=0; j<n; j++) {
silinder.pnt[i*n+j].x=r[i]*cos(j*a);
silinder.pnt[i*n+j].y=b;
silinder.pnt[i*n+j].z=r[i]*sin(j*a);
}
}
silinder.NumberofFaces=m*n+2;
for(i=0; i<m; i++) {
for(j=0; j<n; j++) {
silinder.fc[i*n+j].NumberofVertices=4;
silinder.fc[i*n+j].pnt[0]=i*n+j;
silinder.fc[i*n+j].pnt[1]=(i+1)*n+j;
silinder.fc[i*n+j].pnt[2]=(i+1)*n+j+1;
silinder.fc[i*n+j].pnt[3]=i*n+j+1;
if(j==(n-1)) {
silinder.fc[i*n+j].pnt[2]=i*n+j+1;
silinder.fc[i*n+j].pnt[3]=(i-
1)*n+j+1;
}
}
}
silinder.fc[m*n].NumberofVertices=n;
for(i=0; i<n; i++) silinder.fc[m*n].pnt[i]=i;
silinder.fc[m*n+1].NumberofVertices=n;
for(i=0; i<n; i++)
silinder.fc[m*n+1].pnt[i]=(m+1)*n-1-i;
}
Konsep botol ini sama seperti silinder bertumpuk pada poin 2. Prosedur
createCylinderN memiliki 5 parameter, yaitu silinder yang memiliki tipe bentukan
object3D_t, m dan n bertipedata integer, r yang merupakan array dengan tipe data
float, dan h yang merupakan array yang bertipedata float. Parameter sphere berfungsi
mendefinisikan sebuah nama objek dan mengambil tipe data bentukan object3D_t.
Parameter n adalah jumlah titik yang membentuk alas lingkaran. Parameter r berfungsi
sebagai jari-jari pada setiap lingkaran yang berupa array.
Definisi koordinat koordinat tabung yang diberikan pada code:
𝑥𝑖𝑗 = 𝑟𝑖 cos(𝑗 ∙ 𝑎)
𝑦𝑖𝑗 = 𝑏
𝑧𝑖𝑗 = 𝑟𝑖 sin(𝑗 ∙ 𝑎)
void userdraw(void) {
matrix3D_t tilting=rotationXMTX(0.5)*rotationYMTX(-
0.25);
setColor(0,1,0);
drawAxes(tilting);
object3D_t o;
float r[12]= {40,50,50,45,50,50,20,20,17,20,20,17};
float h[11]= {5,60,5,5,70,50,40,4,4,10,4};
createCylinderN(o,11,20,r,h);
draw3D(o,tilting);
}
Prosedur userdraw ini digunakan membuat objek 3D tadi (silinder) sehingga
akan muncul di program.
tilting yang didefinisikan dengan tipe bentukan matrix3D_t akan dirotasikan
berdasar sumbu X dan sumbu Y sejauh masing-masing 0.25 dan -0.5. Kemudian
program akan menset warna RGB dengan nilai (0, 1, 0) atau berwarna hijau. Setelah
mengeset warna, program akan menggambar garis koordinat dengan menggunakan
prosedur drawAxes. Setelah itu, inisialisasi nilai array r dan array h. Inisialisasi nilai r
dan h selesai, lalu membuat objek silinder. Objek silinder didefinisikan terlebih dahulu
dengan tipe bentukan object3D_t dan diberi nama “o”. Setelah itu kita menjalankan
prosedur createCylinderN(o, 4, 20, r, h) yang berarti, kita akan membuat objek silinder
dengan 11 tumpukan silinder, 20 sudut yang mengelilingi silinder tersebut, r sebagai
jari-jari dengan nilai untuk setiap segmen dari silinder dan h sebagai tinggi dari setiap
segmen silindernya. Yang terakhir gambar silinder dengan koordinat yang sudah
dibentuk dengan draw3D(o, tilting).
Fungsi main adalah driver utama atau program utama yang menjalankan
semua prosedur yang sudah dibuat sebelumnya. Main akan membentuk tampilan
window dengan ukuran 680 x 480 dan warna background dari jendela tersebut diberi
warna putih (1, 1, 1, 0).
b) Screenshot
m = 11, n = 20
r[12] = {40,50,50,45,50,50,20,20,17,20,20,17}
h[11] = {5,60,5,5,70,50,40,4,4,10,4}
m = 7, n = 18
r[8] = {40,50,50,45,30,25,15,15}
h[7] = {5,130,20,15,15,100,15}