Untitled
unknown
plain_text
a year ago
7.6 kB
9
Indexable
#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;
}
Editor is loading...
Leave a Comment