Untitled
unknown
plain_text
24 days ago
7.6 kB
3
Indexable
Never
#include <iostream> #include <GL/glew.h> #include <GL/freeglut.h> #include <cmath> // Untuk menggunakan fungsi trigonometri // Fungsi untuk menggambar persegi void drawSquare(float x1, float y1, float x2, float y2, int r, int g, int b) { glBegin(GL_QUADS); // Konversi RGB dari 0-255 ke 0.0-1.0 glColor3f(r / 255.0f, g / 255.0f, b / 255.0f); // warna persegi glVertex2f(x1, y1); glVertex2f(x2, y1); glVertex2f(x2, y2); glVertex2f(x1, y2); glEnd(); } void drawPolygon(float vertices[5][2], int r, int g, int b) { glBegin(GL_POLYGON); // Konversi RGB dari 0-255 ke 0.0-1.0 glColor3f(r / 255.0f, g / 255.0f, b / 255.0f); // warna poligon // Loop untuk menggambar tiap vertex dari 5 titik for (int i = 0; i < 5; ++i) { glVertex2f(vertices[i][0], vertices[i][1]); } glEnd(); } void drawCircle(float cx, float cy, float radius, int num_segments, int r, int g, int b) { glBegin(GL_TRIANGLE_FAN); // Menggunakan GL_TRIANGLE_FAN untuk membuat lingkaran glColor3f(r / 255.0f, g / 255.0f, b / 255.0f); // Warna lingkaran, dikonversi dari 0-255 ke 0.0-1.0 glVertex2f(cx, cy); // Titik pusat lingkaran for (int i = 0; i <= num_segments; i++) { float theta = 2.0f * 3.1415926f * float(i) / float(num_segments); // Sudut per segmen float x = radius * cosf(theta); // Koordinat x dari lingkaran float y = radius * sinf(theta); // Koordinat y dari lingkaran glVertex2f(x + cx, y + cy); // Menggambar segmen lingkaran } glEnd(); } void drawLine(float x1, float y1, float x2, float y2, int r, int g, int b, float lineWidth) { glLineWidth(lineWidth); // Mengatur ketebalan garis glBegin(GL_LINES); // Menggunakan GL_LINES untuk menggambar garis glColor3f(r / 255.0f, g / 255.0f, b / 255.0f); // Warna garis, dikonversi dari 0-255 ke 0.0-1.0 glVertex2f(x1, y1); // Titik awal garis glVertex2f(x2, y2); // Titik akhir garis glEnd(); } void drawCurve(float cx, float cy, float radius, int num_segments, int r, int g, int b) { glBegin(GL_LINE_STRIP); // Menggunakan GL_LINE_STRIP untuk menggambar kurva senyuman glColor3f(r / 255.0f, g / 255.0f, b / 255.0f); // Warna kurva, dikonversi dari 0-255 ke 0.0-1.0 // Menggambar setengah lingkaran (180 derajat) untuk senyuman for (int i = 0; i <= num_segments; i++) { float theta = 3.1415926f * float(i) / float(num_segments); // Sudut antara segmen (dari 0 hingga Pi) float x = radius * cosf(theta); // Koordinat x dari lingkaran float y = radius * sinf(theta); // Koordinat y dari lingkaran glVertex2f(x + cx, y + cy); // Menggambar titik kurva } glEnd(); } void drawBezierCurve(float x0, float y0, float x1, float y1, float x2, float y2, int segments, int r, int g, int b) { glColor3f(r / 255.0f, g / 255.0f, b / 255.0f); // Warna kurva glBegin(GL_LINE_STRIP); for (int i = 0; i <= segments; i++) { float t = (float)i / (float)segments; float x = (1 - t) * (1 - t) * x0 + 2 * (1 - t) * t * x1 + t * t * x2; // Persamaan kurva Bezier untuk x float y = (1 - t) * (1 - t) * y0 + 2 * (1 - t) * t * y1 + t * t * y2; // Persamaan kurva Bezier untuk y glVertex2f(x, y); // Gambar titik pada kurva } glEnd(); } void drawHalfCircle(float cx, float cy, float radius, int num_segments, int r, int g, int b) { glBegin(GL_TRIANGLE_FAN); glColor3f(r / 255.0f, g / 255.0f, b / 255.0f); glVertex2f(cx, cy); // Pusat lingkaran for (int i = 0; i <= num_segments / 2; i++) { float theta = 3.1415926f * float(i) / float(num_segments); // Setengah lingkaran (180 derajat) float x = radius * cosf(theta); float y = radius * sinf(theta); glVertex2f(x + cx, y + cy); } glEnd(); } void drawHead() { // Kepala diturunkan sedikit drawSquare(-0.18, 0.70, 0.16, 0.41, 255, 235, 204); // kepala base drawSquare(-0.21, 0.60, -0.18, 0.50, 140, 140, 130); // telinga kiri drawSquare(0.16, 0.60, 0.193, 0.50, 140, 140, 130); // telinga kanan // Mata dan alis tetap di posisi yang sama drawSquare(-0.14, 0.61, -0.05, 0.55, 0, 0, 0); // mata kiri drawSquare(0.03, 0.61, 0.12, 0.55, 0, 0, 0); // mata kanan drawSquare(-0.14, 0.65, -0.05, 0.63, 0, 0, 0); // alis kiri drawSquare(0.03, 0.65, 0.12, 0.63, 0, 0, 0); // alis kanan // Bibir senyum tetap drawSquare(-0.05, 0.50, -0.04, 0.46, 176, 50, 97); // bibir senyum kiri drawSquare(0.03, 0.50, 0.04, 0.46, 176, 50, 97); // bibir senyum kanan drawSquare(-0.04, 0.47, 0.04, 0.46, 176, 50, 97); // bibir senyum // Leher tetap menyambung langsung dari badan ke kepala drawSquare(-0.06, 0.41, 0.04, 0.31, 140, 140, 130); // leher menyambung } void drawBody() { drawSquare(-0.18, 0.36, 0.16, -0.07, 0, 0, 140); // badan drawSquare(-0.27, 0.36, -0.18, 0.21, 140, 140, 130); // tangan kiri drawSquare(0.16, 0.36, 0.25, 0.21, 140, 140, 130); // tangan kanan drawSquare(-0.44, 0.36, -0.27, 0.28, 140, 0, 0); // lengan kiri drawSquare(0.25, 0.36, 0.42, 0.28, 140, 0, 0); // lengan kanan drawSquare(-0.44, 0.45, -0.35, 0.35, 140, 0, 0); // tangan kiri drawSquare(0.33, 0.28, 0.42, 0.18, 140, 0, 0); // tangan kanan drawSquare(-0.44, 0.51, -0.35, 0.45, 0, 140, 140); // lengan atas kiri drawSquare(0.33, 0.18, 0.42, 0.12, 0, 140, 140); // lengan atas kanan drawSquare(-0.23, -0.07, 0.21, -0.15, 140, 140, 130); // pinggul } void drawKaki() { drawSquare(-0.18, -0.15, -0.04, -0.33, 0, 0, 140); //kaki kiri drawSquare(0.02, -0.15, 0.16, -0.33, 0, 0, 140); //kaki kanan drawSquare(-0.16, -0.33, -0.06, -0.5, 140, 140, 130); //betis kiri drawSquare(0.04, -0.33, 0.14, -0.5, 140, 140, 130); //betis kanan float polygonVertices[5][2] = { {-0.16, -0.5f}, // Vertex 1 {-0.06, -0.5f}, // Vertex 2 {-0.06, -0.59}, // Vertex 3 {-0.2f, -0.59}, // Vertex 4 {-0.2f, -0.53} // Vertex 5 }; drawPolygon(polygonVertices, 140, 0, 0); // sepatu kiri float polygonVertices2[5][2] = { {0.04, -0.5}, {0.14, -0.5}, {0.18, -0.53}, {0.18,-0.59}, {0.04, -0.59} }; drawPolygon(polygonVertices2, 140, 0, 0); // sepatu kanan } void render() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Membersihkan buffer warna glLoadIdentity(); // Reset transformasi //ganti warna background glClearColor(176/ 255.0f, 227/ 255.0f, 255/ 255.0f, 1.0f); // Menggambar bagian-bagian robot drawHead(); drawBody(); drawKaki(); glutSwapBuffers(); // Menukar buffer } // Fungsi untuk menyesuaikan viewport void changeViewPort(int w, int h) { glViewport(0, 0, w, h); } // Fungsi utama int main(int argc, char* argv[]) { glutInit(&argc, argv); // Inisialisasi GLUT glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH); // Menyiapkan buffer glutInitWindowSize(500, 500); // Ukuran window glutCreateWindow("Robot Hikma"); // Membuat window dengan judul glutReshapeFunc(changeViewPort); // Mengubah viewport ketika window di-resize glutDisplayFunc(render); // Fungsi render GLenum err = glewInit(); if (GLEW_OK != err) { std::cout << "Error initializing GLEW" << std::endl; return 1; } glutMainLoop(); // Loop utama return 0; }
Leave a Comment