C++, OpenGL - problem z rekurencją.

C++, OpenGL - problem z rekurencją.
XE
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 11 lat
  • Postów:33
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:

Kopiuj
#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

Kopiuj
 #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

Kopiuj
#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);
	}
}
 
K5
  • Rejestracja:około 12 lat
  • Ostatnio:około 7 lat
  • Lokalizacja:Tutaj,obok
  • Postów:759
0

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

Kopiuj
glClearColor(0, 0, 0, 0);

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

Kopiuj
glutSwapBuffers();

bo nie ma.


Jeśli mój post jest dowodem mojej niekompetencji, to trudno, ale po to pytam, żeby się czegoś dowiedzieć.
edytowany 2x, ostatnio: kacper546
XE
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 11 lat
  • Postów:33
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.

K5
  • Rejestracja:około 12 lat
  • Ostatnio:około 7 lat
  • Lokalizacja:Tutaj,obok
  • Postów:759
0

A może w

Kopiuj
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?


Jeśli mój post jest dowodem mojej niekompetencji, to trudno, ale po to pytam, żeby się czegoś dowiedzieć.
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:dzień
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?
K5
Wydaje mi się, że brak glutSwapBuffers(); jest tu błędem a tobie?
Azarien
ne odpalałem, nie mam gluta.
K5
Aha, mi tak się wydaje bo bez niego mój program wyświetla tylko czarne tło.
XE
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 11 lat
  • Postów:33
0

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

K5
Sam przeanalizuj albo daj na forum kod bez klas.
K5
  • Rejestracja:około 12 lat
  • Ostatnio:około 7 lat
  • Lokalizacja:Tutaj,obok
  • Postów:759
0

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


Jeśli mój post jest dowodem mojej niekompetencji, to trudno, ale po to pytam, żeby się czegoś dowiedzieć.
XE
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 11 lat
  • Postów:33
0

Kod bez klas:

Kopiuj
 //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;
}
K5
  • Rejestracja:około 12 lat
  • Ostatnio:około 7 lat
  • Lokalizacja:Tutaj,obok
  • Postów:759
0

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

Kopiuj
counter--;

na początku

Kopiuj
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 ).


Jeśli mój post jest dowodem mojej niekompetencji, to trudno, ale po to pytam, żeby się czegoś dowiedzieć.
edytowany 2x, ostatnio: kacper546
XE
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 11 lat
  • Postów:33
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?

edytowany 1x, ostatnio: Xender
K5
  • Rejestracja:około 12 lat
  • Ostatnio:około 7 lat
  • Lokalizacja:Tutaj,obok
  • Postów:759
0

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

Kopiuj
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.

Kopiuj
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();?


Jeśli mój post jest dowodem mojej niekompetencji, to trudno, ale po to pytam, żeby się czegoś dowiedzieć.
edytowany 1x, ostatnio: kacper546
XE
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 11 lat
  • Postów:33
0

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

K5
  • Rejestracja:około 12 lat
  • Ostatnio:około 7 lat
  • Lokalizacja:Tutaj,obok
  • Postów:759
0

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

Kopiuj
glutSwapBuffers();

I tyle.


Jeśli mój post jest dowodem mojej niekompetencji, to trudno, ale po to pytam, żeby się czegoś dowiedzieć.
XE
  • Rejestracja:około 12 lat
  • Ostatnio:prawie 11 lat
  • Postów:33
0

nic nie daje

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.