grafkom program baru buka lagi

Post on 02-Apr-2015

443 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Contoh syntax dasar membuat project atau program dengan glut di Dev C++ :

#include<GL/glut.h>

void display(void)

{

glClear(GL_COLOR_BUFFER_BIT);

//membuat persegi dari glBegin…glEnd.

glBegin(GL_POLYGON);

glColor3f(1.0,0.0,0.0);glVertex2f(-0.5,0.5);

glColor3f(0.0,1.0,0.0);glVertex2f(0.5,0.5);

glColor3f(0.0,0.0,1.0);glVertex2f(0.5,-0.5);

glColor3f(1.0,1.0,1.0);glVertex2f(-0.5,-0.5);

glEnd();

glFlush();

}

int main(int argc, char **argv)

{

//Inisialisasi GLUT

glutInit(&argc, argv);

glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);

//Membuat window

glutInitWindowSize(250,250); //ukuran window

glutCreateWindow(“Project1″); // nama window

glClearColor(0.0, 0.0, 0.0, 0.0); // warna dasar window R G B A

//Pemanggilan terhadap fungsi display & reshape

glutDisplayFunc(display);

//GLUT melakukan perulangan

//untuk menunggu perintah

glutMainLoop();

return 0;

}

OpenGL menggunakan GLUT di linux dengan bahasa CPosted on October 12, 2010 by abi71

Gue dapet tugas kampus buat bikin program Graphic pake OpenGL. pilihan

bahasa program bebas, kenapa bebas ? menurut sepengetahuan gw karena

OpenGL memang bukan bahasa program tapi sebuah library portable yang

siap pakai di bahasa pemrograman(tidak semua). Karena bebas akhirnya

pilihan jatuh pada bahasa C.

oke pertama install semua pustaka yang di butuhkan.

1root@bt:~# apt-get install freeglut3 freeglut3-dev libglew1.5 libglew1.5-dev libglu1-mesa libglu1-mesa-dev libgl1-mesa-glx libgl1-mesa-dev

jika sudah, copas contoh coding di bawah ini.

#include <GL/glut.h>

void gambar(void) {

    glClear(GL_COLOR_BUFFER_BIT);

    glBegin(GL_LINES);

07

    glVertex2f (0.0, 0.8);

08

    glVertex2f (0.2,

0.10);

11

    glVertex2f (0.0, 0.8);

12

    glVertex2f (-0.2, 0.10);

15

    glVertex2f (0.0, 0.8);

16

    glVertex2f (0.8, 0.8);

19

    glVertex2f (0.8, 0.8);

20

    glVertex2f (0.8, 0.10);

    glFlus

h();

}

    glutInit(&argc, argv);

    glutInitDisplayMode(GLUT_DEPTH | GLUT_SINGLE | GLUT_RGBA);

    glutInitWindowPosition(500,500);

    glutInitWindowSize(300,300);

    glutCreateWindow(argv[0]);

    glutDisplayFunc(gambar);

    glutMainLoop();

}

Running..

1gcc -lglut namaprogram.c -o namaprogram

Referensi :

http://www.google.com

http://www.lighthouse3d.com/

1.2.2.Pembuatan gambar

Didalam openGL pembuatan obyek dilakukan dengan titik-titik 3 dimensi,denganmode GL_QUARDS, maka otomatis setiap 4 titik digambar menjadi sebuah bidang segiempat,sedangkan mode GL_LINES, pada setiap 2 titik digambar manjadi sebuah garis.Didalam tahap ini setiap garis atau bidang juga dapat di atur warnanya.Funsi atau prosedur yang digunakan :mode GL_QUARDS – menggambarkan segi empatmode GL_LINES – menggambark garisglVertex3f- penentuan titik 3 dimensiglColor3f – penentuan warna

Berikut ini akan diberikan contoh script sederhana (tidak utuh,hanya sepengggaalan)beserta output yang dihasilkan,untuk menunjukkan proses pembuatan gambar atau obyekpada delphi,dengan library tambahan open GL.

Contoh pembuatan titik 3 warna :glClearColor(1,1,1,0); //warna dasar ;1,1,1,0 adalah putihglBegin(GL_POINTS); //untuk membuat titikglColor3f(1,0,0); //penentuan warna titik 1 dan posisinyaglVertex3f(-0.1,-0.1,0.1);glColor3f(0,1,0); //penentuan warna titik 2 dan posisisyaglVertex3f(0.1,-0.1,0.1);glColor3f(0,0,1); //penentuan titik 3 dan posisinyaglColor3f(0,0.1,-0.1);glEnd;

Contoh pembuatan garis :glClearColor(1,1,1,0); // warna background putihglColor3f(0,0,0); // warna garis hitam

glBegin(GL_LINES); //digunakan untuk membua garis tiap 2 titik yang adaglVertex3f(0,0,-0.1); //garis 1glVertex3f(0.3,0.2,0.1);glVertex3f(0.1,-0.1,-0.2); // garis 2glVertex3f(0.3,-0.2,0.1);glEnd;

Contoh pembuatan bidang segi empat :glClearColor(1,1,1,0); // warna background putihglBegin(GL_QUARDS); //untuk membuat segi empat dalam tiap4 titikglColor3f(1,0,0); //posisi titik 1 dengan gradiasi warnanyaglVertex3f(-0.2,0.2,0.2);glColor3f(1,0,0); //posisi titik 2 dengan gradiasi warnanyaglVertex3f(0.2,0.2,0.2);glColor3f(1,0,1); //posisi titik 3 dengan gradiasi warnanyaglVertex3f(0.2,-0.2,0.2);glColor3f(0,1,1); //posisi titik 4 dengan gradiasi warnanyaglVertex3f(-0.2,-0.2,0.2);glEnd;

Contoh gambar 3D menggunaan openGL pada delphi :

program BasicDelphi;

usesWindows,Messages,OpenGL;

varHGLRC_VarG : HGLRC;HDC_VarG : HDC;HWND_VarG : HWND;

keys : array [0..255] of bool;SudutPutar : single = 0.0;

//set ukuran window OpenGLLebarW : integer = 350;TinggiW : integer = 350;

function WindowProc(HWND_P : HWND; MESSAGE_P : UINT; WPARAM_P :WPARAM; LPARAM_P : LPARAM) : LRESULT; stdcall;begincase MESSAGE_P ofWM_KEYUP:

beginkeys[WPARAM_P] := false;result:=0;end;

WM_KEYDOWN:beginkeys[WPARAM_P] := true;result:=0;end;

end;Result := DefWindowProc(HWND_P, MESSAGE_P, WPARAM_P, LPARAM_P);end;

procedure CloseOpenGL;begin

if HGLRC_VarG <> 0 thenbeginwglMakeCurrent(HDC_VarG, 0);wglDeleteContext(HGLRC_VarG);end;

releaseDC(HWND_VarG, HDC_VarG);destroywindow(HWND_VarG);UnregisterClass('OpenGl3DwithDelphi',hInstance);

HGLRC_VarG := 0;HDC_VarG := 0;HWND_VarG := 0;end;

function CreateOpenGL(HINST_P : HINST) : boolean stdcall;variPixelFormat : integer;WCLASSEX : WNDCLASSEX;pfd : PIXELFORMATDESCRIPTOR;

beginWCLASSEX.cbSize := Sizeof(WCLASSEX);WCLASSEX.style := CS_HREDRAW or CS_VREDRAW;WCLASSEX.lpfnWndProc := @WindowProc;WCLASSEX.cbClsExtra := 0;WCLASSEX.cbWndExtra := 0;WCLASSEX.hInstance := HINST_P;WCLASSEX.hIcon := LoadIcon(0, IDI_WINLOGO);WCLASSEX.hCursor := LoadCursor(0,IDC_WAIT);

WCLASSEX.hbrBackground := 0;WCLASSEX.lpszMenuName := nil;WCLASSEX.lpszClassName:= 'OpenGl3DwithDelphi';

if RegisterClassEX(WCLASSEX) = 0 thenbeginMessageBox(0, 'Registrasi Window Class gagal, program dihentikan', 'Error window', MB_OK or MB_ICONERROR);Result := false;exit;end;

HWND_VarG := CreateWindowEx(0,'OpenGl3DwithDelphi','Gambar 3D(Tekan Esc untuk keluar)',0,0,0,LebarW, TinggiW,0, 0, HINST_P, nil);

if HWND_VarG = 0 thenbeginMessageBox(0, 'Pembuatan OpenGL window gagal, program dihentikan', 'Error window',MB_OK or MB_ICONERROR);Result:=false;exit;end;

pfd.nSize := SizeOf(PIXELFORMATDESCRIPTOR);pfd.nVersion := 1;pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;pfd.iPixelType := PFD_TYPE_RGBA;pfd.cColorBits := 16;pfd.cRedBits := 0;pfd.cRedShift := 0;pfd.cGreenBits := 0;pfd.cBlueBits := 0;pfd.cBlueShift := 0;pfd.cAlphaBits := 0;pfd.cAlphaShift := 0;pfd.cAccumBits := 0;pfd.cAccumRedBits := 0;pfd.cAccumGreenBits := 0;pfd.cAccumBlueBits := 0;pfd.cAccumAlphaBits := 0;pfd.cDepthBits := 16;pfd.cStencilBits := 0;pfd.cAuxBuffers := 0;pfd.iLayerType := PFD_MAIN_PLANE;pfd.bReserved := 0;pfd.dwLayerMask := 0;pfd.dwVisibleMask := 0;

pfd.dwDamageMask := 0;

HDC_VarG := GetDC(HWND_VarG);if HDC_VarG = 0 thenbeginMessageBox(0, 'Pembuatan Device Context gagal, program dihentikan', 'Error device',MB_OK or MB_ICONERROR);Result := false;exit;end;

iPixelFormat := ChoosePixelFormat(HDC_VarG, @pfd);

if iPixelFormat = 0 thenbeginMessageBox(0, 'Pencarian Pixel Format gagal, program dihentikan', 'Error pixel format',MB_OK or MB_ICONERROR);Result := false;exit;end;

if (not SetPixelFormat(HDC_VarG, iPixelFormat, @pfd)) thenbeginMessageBox(0, 'Set Pixel Format gagal, program dihentikan', 'Error pixel format',MB_OK or MB_ICONERROR);Result:=false;exit;end;

HGLRC_VarG := wglCreateContext(HDC_VarG);if HGLRC_VarG = 0 thenbeginMessageBox(0, 'Pembuatan Rendering Context gagal, program dihentikan', 'Error rendering context',MB_OK or MB_ICONERROR);Result := false;exit;end;

if (not wglMakeCurrent(HDC_VarG, HGLRC_VarG)) thenbeginMessageBox(0, 'Pengaktifan Rendering Context gagal, program dihentikan', 'Error rendering context',MB_OK or MB_ICONERROR);Result := false;exit;end;

ShowWindow(HWND_VarG, SW_SHOW);

glViewport(0, 0, LebarW, TinggiW);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluPerspective(45.0, LebarW / TinggiW, 1.0, 1000.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity;

Result := true;end;

procedure Display_Grafik;beginglClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);glLoadIdentity();

glTranslated(0.0, 0.0, -5.5);glRotated(SudutPutar, 1.0, 1.0, 1.0);

//polygon depanglBegin(GL_LINE_LOOP);glVertex3d(-1.0, -1.0, 1.0);glVertex3d( 1.0, -1.0, 1.0);glVertex3d( 1.0, 1.0, 1.0);glVertex3d(-1.0, 1.0, 1.0);glEnd();

//polygon belakangglBegin(GL_LINE_LOOP);glVertex3d(-1.0, -1.0, -1.0);glVertex3d( 1.0, -1.0, -1.0);glVertex3d( 1.0, 1.0, -1.0);glVertex3d(-1.0, 1.0, -1.0);glEnd();

//polygon kananglBegin(GL_LINE_LOOP);glVertex3d( 1.0, -1.0, 1.0);glVertex3d( 1.0, -1.0, -1.0);glVertex3d( 1.0, 1.0, -1.0);glVertex3d( 1.0, 1.0, 1.0);glEnd();

//polygon kiriglBegin(GL_LINE_LOOP);glVertex3d(-1.0, -1.0, 1.0);glVertex3d(-1.0, -1.0, -1.0);glVertex3d(-1.0, 1.0, -1.0);glVertex3d(-1.0, 1.0, 1.0);

glEnd();

//polygon atasglBegin(GL_LINE_LOOP);glVertex3d(-1.0, 1.0, 1.0);glVertex3d( 1.0, 1.0, 1.0);glVertex3d( 1.0, 1.0, -1.0);glVertex3d(-1.0, 1.0, -1.0);glEnd();

//polygon bawahglBegin(GL_LINE_LOOP);glVertex3d(-1.0, -1.0, 1.0);glVertex3d( 1.0, -1.0, 1.0);glVertex3d( 1.0, -1.0, -1.0);glVertex3d(-1.0, -1.0, -1.0);glEnd();

SudutPutar := SudutPutar + 0.1;

SwapBuffers(HDC_VarG);end;

function WinMain(hInstance: HINST; hPrevInstance: HINST; lpCmdLine: PChar;nCmdShow: integer): integer; stdcall;varmsg : TMSG;Selesai : Bool;

beginSelesai := false;

if not CreateOpenGL(hInstance) thenbeginCloseOpenGL;Result := 0;exit;end;

glEnable(GL_DEPTH_TEST);glClearColor(0.0, 0.5, 5.0, 0.5);

while not Selesai dobeginPeekMessage(msg, 0, 0, 0, PM_REMOVE);

if msg.message <> WM_QUIT then

beginDisplay_Grafik;

if keys[VK_ESCAPE] thenSelesai := true;

TranslateMessage(msg);DispatchMessage(msg);end

end;

CloseOpenGL;result := msg.wParam;end;

beginWinMain(hInstance, hPrevInst, CmdLine, CmdShow);end.

Membuat Object 3D Dengan GlutBerawal dari Tugas ke 3 yang diberikan oleh kakak – kakak asisten praktikum Mata kuliah Komgraf, dan sedikit trik dan manipulasi akhirnya saya bisa juga membuat Object 3D dengan glut dan menggunakan bahasa C. Hasil project yang saya buat dapat dilihat pada gambar di bawah ini beserta Codingannya :

#include <GL/glut.h>

#include <stdlib.h>

static int slices = 10;

static int stacks = 30;

static void

resize(int width, int height)

{

const float ar = (float) width / (float) height;

glViewport(0, 0, width, height);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

glFrustum(-ar, ar, -1.0, 1.0, 2.0, 100.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity() ;

}

static void

display(void)

{

const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;

const double a = t*90.0;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glColor3d(0.3,1,0);

glPushMatrix();

glTranslated(0,0,-6);

glRotated(10,1,0,0);

glRotated(a,0,0,1);

glutWireSphere(2,slices,stacks);

glPopMatrix();

glutSwapBuffers();

}

static void

key(unsigned char key, int x, int y)

{

switch (key)

{

case 27 :

case 'q':

exit(0);

break;

case '+':

slices++;

stacks++;

break;

case '-':

if (slices<3 || stacks<3)

{

slices--;

stacks--;

}

break;

}

glutPostRedisplay();

}

static void

idle(void)

{

glutPostRedisplay();

}

const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };

const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };

const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };

const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };

const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };

const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };

const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };

const GLfloat high_shininess[] = { 100.0f };

int

main(int argc, char *argv[])

{

glutInit(&argc, argv);

glutInitWindowSize(640,480);

glutInitWindowPosition(0,0);

glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);

glutCreateWindow("Tugas Object 3D == Abdul Qifli Sangadji");

glutReshapeFunc(resize);

glutDisplayFunc(display);

glutKeyboardFunc(key);

glutIdleFunc(idle);

glClearColor(1,1,1,1);

glEnable(GL_CULL_FACE);

glCullFace(GL_BACK);

glEnable(GL_DEPTH_TEST);

glDepthFunc(GL_LESS);

glEnable(GL_LIGHT0);

glEnable(GL_NORMALIZE);

glEnable(GL_COLOR_MATERIAL);

glEnable(GL_LIGHTING);

glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);

glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);

glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);

glLightfv(GL_LIGHT0, GL_POSITION, light_position);

glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);

glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);

glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);

glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);

glutMainLoop();

return EXIT_SUCCESS;

}

Ini program adis

2. Contoh Program Polygon menggunakan bahasa C++

#include <windows.h>#include <GL/glut.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>#include <math.h>#include <iostream.h>

using namespace std;

GLsizei screenWidth=600,screenHeight=500; // define screen width and hight

class cPoint {  // class pointpublic : GLdouble X,Y;};

class cLine {  // class linepublic : GLdouble X1,Y1,X2,Y2;};

class cVector {  // class pointpublic : GLdouble X,Y;};

cLine myPillar[10][10];    // declare pillarcLine myRay;               // declare raycVector vecRay;            // declare vectorcPoint vecPoint;           // declare point

cVector vec[100][100];       // vectorcVector vecPend[100][100];   // vector perpendicular

GLboolean createPillar = FALSE;GLboolean createRay = FALSE;

GLdouble Thit=0;GLdouble minThit=0;cVector minPhit;cVector minVecPend;cVector vecRef;

GLint pi=0, n=0;         // point counter and line counter

GLdouble tempLineX1=0, tempLineY1=0; // temporary line x1 and y1 before mouse upGLdouble tempLineX2=0, tempLineY2=0; // temporary line x2 and y2 before mouse upGLdouble tempPointX=0, tempPointX2=0;// temporary point x and y before mouse up

GLboolean refresh = TRUE;GLboolean run = FALSE;

void myInit (void){glClear(GL_COLOR_BUFFER_BIT);    // clear the screenglClearColor (1.0, 1.0, 1.0, 0.0); // set the gb color to a bright whiteglColor3f(0.0f, 0.0f, 0.0f);    // set the drawing color to backglPointSize(3.0);       // set the point sizeglMatrixMode(GL_PROJECTION);       // set up appropriate matrices to be explainedglLoadIdentity();gluOrtho2D(0.0, screenWidth, 0.0, screenHeight);

}

void drowString(float x, float y, char *string, void *font){int len, i;glRasterPos2f(x, y);len = (int) strlen(string);for (i = 0; i < len; i++) {glutBitmapCharacter(font, string[i]);}}

float absolute(float x){if (x<0)x = -x;

return (x);}

void mouse(int button, int state, int x, int y) {switch (button){case GLUT_LEFT_BUTTON:

if (state == GLUT_DOWN){tempLineX1 = x;                 // record position of mouse downtempLineY1 = screenHeight – y;} else {tempLineX2 = x;                 // record position of mouse uptempLineY2 = screenHeight – y;// if position mouse down and mouse up is sameif (tempLineX1 == tempLineX2 && tempLineY1 == tempLineY2){// then create point coordinate} else {// if position mouse down and mouse up is deferent then create line coordinateif (createRay == FALSE) {n++;if ( absolute(tempLineX2 – myPillar[pi][1].X1) < 20 && absolute(tempLineY2 – myPillar[pi][1].Y1) < 20 ) {// if distance end point with start point of polygon less than 20 close polygonmyPillar[pi][n].X1 = tempLineX1;myPillar[pi][n].Y1 = tempLineY1;myPillar[pi][n].X2 = myPillar[pi][1].X1;myPillar[pi][n].Y2 = myPillar[pi][1].Y1;} else {myPillar[pi][n].X1 = tempLineX1;myPillar[pi][n].Y1 = tempLineY1;myPillar[pi][n].X2 = tempLineX2;myPillar[pi][n].Y2 = tempLineY2;}} else {myRay.X1 = tempLineX1;myRay.Y1 = tempLineY1;myRay.X2 = tempLineX2;myRay.Y2 = tempLineY2;

// vector sinar titi sinar akhir – titik sinar akhirvecRay.X = myRay.X2 – myRay.X1;vecRay.Y = myRay.Y2 – myRay.Y1;}glutPostRedisplay();}}

break;case GLUT_RIGHT_BUTTON:break;}}void drawPoint(GLdouble x, GLdouble y){   // drow point functionglBegin(GL_POINTS);glVertex2i(x,y);glEnd();}

void drawLine(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2){  // drow line functionglBegin(GL_LINES);glVertex2i(x1,y1);glVertex2i(x2,y2);glEnd();}

void twoDRayTracing(void) {minThit = 0;for (int i=0; i<=pi; i++) {Thit = 0;int j = 1;while (myPillar[i][j].X2 != 0){// define vectorvec[i][j].X = myPillar[i][j].X1 – myPillar[i][j].X2;vec[i][j].Y = myPillar[i][j].Y1 – myPillar[i][j].Y2;// define vector perpendicular nivecPend[i][j].X = -vec[i][j].Y;vecPend[i][j].Y = vec[i][j].X;// (B-A)cVector ba;ba.X = myPillar[i][j].X1 – myRay.X1;ba.Y = myPillar[i][j].Y1 – myRay.Y1;// n.(B-A)GLdouble nba = (vecPend[i][j].X * ba.X) + (vecPend[i][j].Y * ba.Y);// n.cGLdouble nc = (vecPend[i][j].X * vecRay.X) + (vecPend[i][j].Y * vecRay.Y);// n.(B-A) / n.cThit = nba / nc;if (Thit > 0.0005) {// vector sinar * ThitcVector CThit;CThit.X = vecRay.X * Thit;CThit.Y = vecRay.Y * Thit;

// vector titik tumbuk titik awal sinar + CThit -> Phit hal 195cVector Phit;Phit.X = myRay.X1 + CThit.X;Phit.Y = myRay.Y1 + CThit.Y;

// panjang pillar yang tertumbukGLdouble lengthVec = sqrt( (vec[i][j].X*vec[i][j].X) + (vec[i][j].Y*vec[i][j].Y) );

// pengecekan apakah titik tumbuk mengenai pillar atau tidakcVector vecPhit;vecPhit.X = myPillar[i][j].X1 – Phit.X;vecPhit.Y = myPillar[i][j].Y1 – Phit.Y;

// panjang titik awal pillar sampai titik tumbukGLdouble lengthThit = sqrt((vecPhit.X*vecPhit.X) + (vecPhit.Y*vecPhit.Y));

cVector vecPhit2;vecPhit2.X = myPillar[i][j].X2 – Phit.X;vecPhit2.Y = myPillar[i][j].Y2 – Phit.Y;// panjang titik akhit pillar sampai titik tumbukGLdouble lengthThit2 = sqrt((vecPhit2.X*vecPhit2.X) + (vecPhit2.Y*vecPhit2.Y));

GLdouble lengthThitTemp=0;// jika panjang titik awal pillar ke Phit >= panjang titik akhir pillar ke Phit maka yang diambil adalah// panjang titik awal pillar ke Phit dan sebaliknyaif (lengthThit>=lengthThit2)lengthThitTemp=lengthThit;elselengthThitTemp=lengthThit2;

// jika panjang pillar yang tertumbuk >= vector terpanjangif ( lengthVec >= lengthThitTemp) {if (minThit > Thit || minThit==0 ){minThit = Thit;minPhit.X = Phit.X;minPhit.Y = Phit.Y;

// vector perpendikular dari pillar yang ditumbukminVecPend.X = vecPend[i][j].X;minVecPend.Y = vecPend[i][j].Y;}}}j++;}

}// vector sinar * Thit yang paling kecilcVector minCThit;minCThit.X = vecRay.X*minThit;minCThit.Y = vecRay.Y*minThit;

// panjang vector perpendikular dari pillar yang ditumbukGLdouble lengthVecPend = sqrt( (minVecPend.X*minVecPend.X) + (minVecPend.Y*minVecPend.Y));

// vector normal dari pillar yang tertumbuk// vector perpendikular / panjang vector perpendikular dari pillar yang tertumbukcVector nVec;nVec.X = minVecPend.X / lengthVecPend;nVec.Y = minVecPend.Y / lengthVecPend;

// Caksen = c – 2(c.n)n -> hal 209cVector minCThit2;// 2(c.n)nGLdouble minCThitSkl = ((minCThit.X * nVec.X) + (minCThit.Y * nVec.Y)) * 2;minCThit2.X = minCThitSkl * nVec.X;minCThit2.Y = minCThitSkl * nVec.Y;// c – 2(c.n)nvecRef.X = minCThit.X – minCThit2.X;vecRef.Y = minCThit.Y – minCThit2.Y;}

void play(void){twoDRayTracing();glutPostRedisplay();}

void reset(){   // reset screenpi=0, n=0;myRay.X1=0;refresh = TRUE;createPillar = FALSE;createRay = FALSE;run = FALSE;glutPostRedisplay();}

void myDisplay(){

if (refresh == TRUE) {glClear(GL_COLOR_BUFFER_BIT);// clear the screenrefresh = FALSE;}

if (myPillar[pi][n].X2 != 0) {glColor3f(0.0, 0.0, 1.0);   // set initial fill color to bluedrawLine(myPillar[pi][n].X1, myPillar[pi][n].Y1,myPillar[pi][n].X2,myPillar[pi][n].Y2);}

if (createRay == TRUE){glColor3f(1.0, 0.0, 0.0);   // set initial fill color to bluedrawLine(myRay.X1, myRay.Y1,myRay.X2,myRay.Y2);createRay = FALSE;}if (run==TRUE){glColor3f(1.0, 0.0, 0.0);   // set initial fill color to bluedrawLine(myRay.X1, myRay.Y1, minPhit.X,minPhit.Y);myRay.X1 = minPhit.X;myRay.Y1 = minPhit.Y;vecRay.X = vecRef.X;vecRay.Y = vecRef.Y;run==FALSE;}glEnd();glFlush();}

void Menu (int id){switch(id){case 1:pi++, n=0;createPillar = TRUE;break;case 2:createRay = TRUE;break;case 3:run=TRUE;play();break;case 4:reset();break;case 9:reset();

exit(0);}}

int main(int argc,char **argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(50,50);glutInitWindowSize(screenWidth,screenHeight);glutCreateWindow(“Tugas Kelompok”);

glutDisplayFunc(myDisplay);glutMouseFunc(mouse);

glutCreateMenu(Menu);glutAddMenuEntry(“New Pillar”,1);glutAddMenuEntry(“Create Ray”,2);glutAddMenuEntry(“Play”,3);glutAddMenuEntry(“Reset”,4);glutAddMenuEntry(“Exit”,9);glutAttachMenu(GLUT_RIGHT_BUTTON);

myInit();glutMainLoop();return 0;}

/*void test(void){myPillar[0][1].X1=10;myPillar[0][1].Y1=90;myPillar[0][1].X2=50;myPillar[0][1].Y2=10;

myPillar[0][2].X1=50;myPillar[0][2].Y1=10;myPillar[0][2].X2=140;myPillar[0][2].Y2=20;

myPillar[0][3].X1=140;myPillar[0][3].Y1=20;myPillar[0][3].X2=160;myPillar[0][3].Y2=110;

myPillar[0][4].X1=160;myPillar[0][4].Y1=110;

myPillar[0][4].X2=10;myPillar[0][4].Y2=90;

myRay.X1 = 90;myRay.Y1 = 20;myRay.X2 = 130;myRay.Y2 = 40;

vecRay.X = myRay.X2 – myRay.X1;vecRay.Y = myRay.Y2 – myRay.Y1;}

top related