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?

0

W kodzie bez klas w funkcji na początku jest counter--;

void triangle (float a[], float b[], float c[], int counter)
{
 
 
                counter--;//TUTAJ JEST/////
                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();
}

Natomiast w funkcji z klasami nie ma.

void DrawTriangle::triangle (float a[], float b[], float c[], int counter,  DrawTriangle & triRef)
{
 
        //TUTAJ NIE MA///////
 
        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);
        }
}

Ale chyba nie to jest problemem. A co z tym SwapBufers();?

0

Jak uŻyć SwapBuffers() bo nie bardzo wiem?

0

Po prostu na końcu funkcji renderującej dajesz:

glutSwapBuffers();

I tyle.

0

nic nie daje

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