Also Like

📁 last Posts

رسم الفرشة (كودي)

#include <GL/glut.h>
#include <math.h>

const float PI = 22.0 / 7;
float xroot = 0, yroot = 0;

void SetupRC() {
    glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(45, 1, 1, 5000);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    gluLookAt(00, 00, 600,
        0, 0, 0,
        0, 1, 0);
}

// دالة رسم يد الفرشاة (المقبض)
void hairbrush() {
    glColor3f(0, 0, 1); // لون أزرق
    glBegin(GL_QUAD_STRIP);
    for (float i = 0; i <= 2 * PI + 1; i += 2 * PI / 100)
    {
        float x = 7.1 * cos(i);
        float z = 7.1 * sin(i);
        glVertex3f(x, 72, z);
        glVertex3f(x, -72, z);
    }
    glEnd();

    glBegin(GL_TRIANGLE_FAN);
    glVertex3f(0, 73, 0);
    for (float i = 0; i <= 2 * PI + 1; i += 2 * PI / 100)
    {
        float x = 7.1 * cos(i);
        float z = 7.1 * sin(i);
        glVertex3f(x, 73, z);
    }
    glEnd();
}

// دالة رسم قاعدة الفرشاة (الجسم البيضاوي)
void brush() {
    glColor3f(0, 1, 0); // أخضر من الأعلى
    glBegin(GL_QUAD_STRIP);
    for (float i = 0; i <= 2 * PI + 1; i += 2 * PI / 100)
    {
        float x = 50 * cos(i);
        float z = 50 * sin(i);
        glVertex3f(x, 7.2, z);
        glVertex3f(x, -7.2, z);
    }
    glEnd();

    glBegin(GL_TRIANGLE_FAN);
    glVertex3f(0, 7.2, 0);
    for (float i = 0; i <= 2 * PI + 1; i += 2 * PI / 100)
    {
        float x = 50 * cos(i);
        float z = 50 * sin(i);
        glVertex3f(x, 7.2, z);
    }
    glEnd();

    glColor3f(0, 1, 1); // سماوي من الأسفل
    glBegin(GL_TRIANGLE_FAN);
    glVertex3f(0, -7.2, 0);
    for (float i = 0; i <= 2 * PI + 1; i += 2 * PI / 100)
    {
        float x = 50 * cos(i);
        float z = 50 * sin(i);
        glVertex3f(x, -7.2, z);
    }
    glEnd();
}

// دالة رسم سِنة واحدة (شعرة)
void snon() {
    glColor3f(0, 0, 1); // أزرق
    glBegin(GL_QUAD_STRIP);
    for (float i = 0; i <= 2 * PI + 1; i += 2 * PI / 100)
    {
        float x = 3 * cos(i);
        float z = 3 * sin(i);
        glVertex3f(x, 25, z);
        glVertex3f(x, 0, z);
    }
    glEnd();

    glBegin(GL_TRIANGLE_FAN);
    glVertex3f(0, 25, 0);
    for (float i = 0; i <= 2 * PI + 1; i += 2 * PI / 100)
    {
        float x = 3 * cos(i);
        float z = 3 * sin(i);
        glVertex3f(x, 25, z);
    }
    glEnd();
}

void Render() {
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    glEnable(GL_DEPTH_TEST);

    glPushMatrix(); // بداية الدوران الكلي للمشهد
    glRotatef(xroot, 1, 0, 0);
    glRotatef(yroot, 0, 1, 0);

    // 1. رسم يد الفرشاة
    glPushMatrix();
    glTranslated(-140, 0, 0); // إزاحة لليسار
    glRotatef(90, 0, 0, 1);   // تدوير اليد لتصبح أفقية
    hairbrush();
    glPopMatrix();


    // 2. رسم قاعدة الفرشاة
    glPushMatrix();
    glScaled(1.5, 1, 1); // تكبير في محور X لعمل الشكل البيضاوي
    brush();
    glPopMatrix();

    // 3. رسم الأسنان (Complex Loop Logic)
    // الجزء الأول من الأسنان
    int zz = 70;
    for (int z = 0; z < 40; z += 10)
    {
        for (int i = -zz; i <= zz; i += 10)
        {
            glPushMatrix();
            glTranslated(i, 0, z);
            snon();
            glPopMatrix();
        }
        zz -= 10; // تقليل العرض كلما اتجهنا للحافة
    }

    // إعادة تهيئة المتغير للجزء الثاني
    zz = 70;
    zz -= 10;

    // الجزء الثاني من الأسنان (الجهة المقابلة)
    for (int z = -10; z > -40; z -= 10)
    {
        for (int i = -zz; i <= zz; i += 10)
        {
            glPushMatrix();
            glTranslated(i, 0, z);
            snon();
            glPopMatrix();
        }
        zz -= 10;
    }

    glPopMatrix(); // نهاية الدوران الكلي
    glFlush();
}

void specialkey(int key, int x, int y) {
    if (key == GLUT_KEY_UP) {
        xroot -= 5;
    }
    if (key == GLUT_KEY_DOWN) {
        xroot += 5;
    }
    if (key == GLUT_KEY_LEFT) {
        yroot -= 5;
    }
    if (key == GLUT_KEY_RIGHT) {
        yroot += 5;
    }
    glutPostRedisplay();
}

int main(int argc, char** argv) {
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);
    glutInitWindowSize(800, 800);
    glutCreateWindow("Hairbrush");
    SetupRC();
    glutDisplayFunc(Render);
    glutSpecialFunc(specialkey);
    glutMainLoop();
}
Comments