C++, OpenGL - problem z rekurencją.

0

Mam zrobić program rysujący trójkąt Sierpińskiego (fraktal), program zrobiłem. Problem w tym że stwierdziłem że aby było ładnie i schludnie zrobię sobie nowa klasę DrawTriangle w której będą wszystkie metody i dane potrzebne do rysowania, problem w tym że w klasie DrawTriangle mam trzy razy wywoływaną metode triangle() ale ona się nie wywołuje. Nie wiem dlaczego. Starałem się nawet przekazać referencję do obiektu na rzecz którego mają się wykonać i nic ;/

Oto kody:

MAIN:

#include "stdafx.h"
#include "DrawTriangle.h"
#include <GL/glut.h>

void Reshape(int width, int height)
{
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-1, 1, -1, 1);
    glMatrixMode(GL_MODELVIEW);
}

void Render()
{

    glClear(GL_COLOR_BUFFER_BIT);
    float a [2] = {0.0, 0.5};
    float b [2] = {-0.5, -0.5};
    float c [3] = {0.5f, -0.5f};

    glColor3f(1.0f, 1.0f, 1.0f);
    glBegin(GL_TRIANGLE_FAN);
    glVertex2f(0.0, 0.5);
    glVertex2f(-0.5, -0.5);
    glVertex2f(0.5f, -0.5f);
    glEnd();

    DrawTriangle tri;
    tri.triangle(a, b, c, 10, tri);

    glFlush();
}

int main (int argc, char *argv[])
{
    int counter = 100;
//funkcja inicjalizacyjna
    glutInit(&argc, argv);
//parametry okna
    glutInitWindowSize(800, 600);
    glutInitWindowPosition(100, 100);
    glutInitDisplayMode(GLUT_RGB);
//tworzenie okna
    glutCreateWindow("Fractal app");
//odswiezanie okna z nowymi wymiarami
    glutReshapeFunc(Reshape);
//funkcja renderujaca
    glutDisplayFunc(Render);
//kolor czyszczacy
    glClearColor(0, 0, 0, 0);
    glutMainLoop();
    return 0;
} 

DrawTriangle.h

 #ifndef DrawTriangle_h
#define DrawTriangle_h

class DrawTriangle
{
    private:
        float tmp_a[2];
        float tmp_b[2];
        float tmp_c[2];
        int counter;
    public:
        float middle (float a, float b);
        void triangle (float a[], float b[], float c[], int counter, DrawTriangle & triRef);
};

#endif

DrawTriangle.cpp

#include "stdafx.h"
#include "DrawTriangle.h"
#include <GL/glut.h>

float DrawTriangle::middle (float a, float b)
{
    return (a+b)/2;
}

void DrawTriangle::triangle (float a[], float b[], float c[], int counter,  DrawTriangle & triRef)
{

    tmp_a[0] = middle(a[0], b[0]);
    tmp_a[1] = middle(a[1], b[1]);

    tmp_b[0] = middle(b[0], c[0]);
    tmp_b[1] = middle(b[1], c[1]);

    tmp_c[0] = middle(c[0], a[0]);
    tmp_c[1] = middle(c[1], a[1]);

    glBegin(GL_TRIANGLE_FAN);
    glColor3f(0.0f, 0.0f, 0.0f);
    glVertex2f(tmp_a[0], tmp_a[1]);
    glVertex2f(tmp_b[0], tmp_b[1]);
    glVertex2f(tmp_c[0], tmp_c[1]);
    glEnd();
    if(counter > 0)
    {
        counter--;
        triRef.triangle(a, tmp_c, tmp_a, counter, triRef);
        triRef.triangle(b, tmp_b, tmp_a, counter, triRef);
        triRef.triangle(c, tmp_c, tmp_b, counter, triRef);
    }
}
0

A co Ci się pokazuje - białe tło ???
Nie wiem czy pomoże ale funkcje

glClearColor(0, 0, 0, 0);

daj w funkcji Render().
A na końcu daj

glutSwapBuffers();

bo nie ma.

0

Nie, tło wyświetla się na czarno poprawnie. Potem rysuje się jeden biały duży trójkat (z maina) poprawnie, a w nim rysuje się jeden trójkąt z funkcji DrawTriangles. Czyli nie działa wywołanie funkcji DrawTriangles w funkcji DrawTriangles.

0

A może w

glBegin(GL_TRIANGLE_FAN);
        glColor3f(0.0f, 0.0f, 0.0f);
        glVertex2f(tmp_a[0], tmp_a[1]);
        glVertex2f(tmp_b[0], tmp_b[1]);
        glVertex2f(tmp_c[0], tmp_c[1]);
        glEnd();

podaj jakieś inne kordynaty?

0
  1. kod jest przekombinowany i niezrozumiały
  2. z powodu wymienionego w pkcie 1 nie analizowałem go, ale czy przypadkiem nie próbujesz rysować czarnego trójkąta wewnątrz czarnego?
0

Póki to wszystko było bez klas, działało. Dopiero to podzieleniu na klasy się posypało.

0

A spróbowałeś z SwapBufers() ?
Albo z tymi koordynatami?

0

Kod bez klas:

 //Testowa aplikacja
#include "stdafx.h"
#include <GL/glut.h>

void Reshape(int width, int height)
{
    glViewport(0, 0, width, height);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(-1, 1, -1, 1);
    glMatrixMode(GL_MODELVIEW);
}

float middle (float a, float b)
{
    return (a+b)/2;
}

void triangle (float a[], float b[], float c[], int counter)
{

        counter--;
        float tmp_a[2];
        float tmp_b[2];
        float tmp_c[2];
        tmp_a[0] = middle(a[0], b[0]);
        tmp_a[1] = middle(a[1], b[1]);

        tmp_b[0] = middle(b[0], c[0]);
        tmp_b[1] = middle(b[1], c[1]);

        tmp_c[0] = middle(c[0], a[0]);
        tmp_c[1] = middle(c[1], a[1]);

        glColor3f(0.0f, 0.0f, 0.0f);
        glBegin(GL_TRIANGLE_FAN);
        glVertex2f(tmp_a[0], tmp_a[1]);
        glVertex2f(tmp_b[0], tmp_b[1]);
        glVertex2f(tmp_c[0], tmp_c[1]);
        glEnd();

        if(counter > 0)
        {
            counter--;
            triangle(a, tmp_c, tmp_a, counter);
            triangle(b, tmp_b, tmp_a, counter);
            triangle(c, tmp_c, tmp_b, counter);
        }

}

void Render()
{
    glClear(GL_COLOR_BUFFER_BIT);
//kolor lini
    glColor3f(1.0f, 1.0f, 1.0f);
//rysowanie lini
    float a [2] = {0.0, 0.5};
    float b [2] = {-0.5, -0.5};
    float c [3] = {0.5f, -0.5f};
    glBegin(GL_TRIANGLE_FAN);
    glVertex2f(a[0], a[1]);
    glVertex2f(b[0], b[1]);
    glVertex2f(c[0], c[1]);
    glEnd();

    triangle(a, b, c, 6);

//koniec rysowanie lini

    glFlush();
}

int main (int argc, char *argv[])
{
    int counter = 100;
//funkcja inicjalizacyjna
    glutInit(&argc, argv);
//parametry okna
    glutInitWindowSize(800, 600);
    glutInitWindowPosition(100, 100);
    glutInitDisplayMode(GLUT_RGB);
//tworzenie okna
    glutCreateWindow("Fractal app");
//odswiezanie okna z nowymi wymiarami
    glutReshapeFunc(Reshape);
//funkcja renderujaca
    glutDisplayFunc(Render);
//kolor czyszczacy
    glClearColor(0, 0, 0, 0);
    glutMainLoop();
    return 0;
}
0

Jedyna różnica co mi wpadła w oko to:

counter--;

na początku

void triangle (float a[], float b[], float c[], int counter)
{

}

I daj to SwapBufers() na końcu funkcji Rednder() po glFlush() bo dziw, że Ci to w ogóle działa.
No i glClearColor( 0.0, 0.0, 0.0, 0.0 ) przed glClear( GL_COLOR_BUFFER_BIT ).

0

Mógł byś dokładnie wskazać różnice dotyczącą counter--; bo ja nic nie widzę.

EDIT:

Staram się zrozumieć dlaczego to nie działa. Może problem jest w tym że ja te funkcje wywołuje z wnętrza metody wywołanej na rzecz obiektu tri?

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0