Untitled

mail@pastecode.io avatar
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