20 if(strcmp(
type.c_str(),
"hilbert")==0)
24 if(strcmp(
type.c_str(),
"gosper")==0)
31 glGenBuffers(1, &posbuf);
32 glBindBuffer(GL_ARRAY_BUFFER, posbuf);
33 glBufferData(GL_ARRAY_BUFFER,
positioncount[0] *
sizeof(
float), &
points[0][0], GL_STATIC_DRAW);
34 glBindBuffer(GL_ARRAY_BUFFER, 0);
37 glGenVertexArrays(1,&vaobuf);
38 glBindVertexArray(vaobuf);
40 glBindBuffer(GL_ARRAY_BUFFER, posbuf);
41 glEnableVertexAttribArray(0);
42 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
44 vao.push_back(vaobuf);
47 glBindBuffer(GL_ARRAY_BUFFER, 0);
56 double poscount = 4 * 3;
63 std::vector<glm::vec3> pos;
64 point = glm::vec3(-0.9f,-0.9f,0.0f);
66 point = glm::vec3(-0.9f,0.9f,0.0f);
68 point = glm::vec3(0.9f,0.9f,0.0f);
70 point = glm::vec3(0.9f,-0.9f,0.0f);
84 std::string rule1 =
"L->+RF-LFL-FR+";
85 rules.push_back(rule1);
86 std::string rule2 =
"R->-LF+RFR+FL-";
87 rules.push_back(rule2);
101 std::string rule1 =
"L->L+RF++RF-FL--FLFL-RF+";
102 rules.push_back(rule1);
104 std::string rule2 =
"R->-FL+RFRF++RF+FL--FL-R";
105 rules.push_back(rule2);
115 for (
int i = 0; i <
rules.size(); i++)
117 std::string rule =
rules[i];
121 return std::string(&var);
129 glDeleteVertexArrays(1, &
vao[i]);
139 auto baseColor_location = glGetUniformLocation(shader,
"color");
140 glUniform4f(baseColor_location, 0.0f, 0.5f, 0.0f, 1.0f);
145 glDrawArrays(GL_LINE_STRIP,0,
positioncount[drawingIteration]/3);
146 glBindVertexArray(0);
154 return (M_PI * angle) / 180;
223 for(
int i = 0; i < ((order+2) -
iteration);i++)
241 if(strcmp(
type.c_str(),
"hilbert")==0)
243 double nenner = std::pow(2,(
iteration+1));
246 if(strcmp(
type.c_str(),
"gosper")==0)
248 double nenner = std::pow(2.7,(
iteration+1));
254 std::string tmp =
"" ;
255 state dummystate(-0.9f,-0.9f,0);
256 std::vector<glm::vec3> dummypoints;
259 if(strcmp(
type.c_str(),
"hilbert")==0)
262 dummystate.
x = -0.9f;
263 dummystate.
y = -0.9f;
265 if(strcmp(
type.c_str(),
"gosper")==0)
268 dummystate.
x = -0.7f + (float)(
iteration - 3)/25;
269 dummystate.
y = 0.0f - (float)(
iteration - 3)/5;
272 glm::vec3 dummypoint;
273 dummypoint = glm::vec3(dummystate.
x, dummystate.
y, 0.0f);
274 dummypoints.push_back(dummypoint);
294 glm::vec3 dummypoint;
295 dummypoint = glm::vec3(dummystate.
x, dummystate.
y, 0.0f);
296 dummypoints.push_back(dummypoint);
353 points.push_back(dummypoints);
361 glGenBuffers(1, &posbuf);
362 glBindBuffer(GL_ARRAY_BUFFER, posbuf);
363 glBufferData(GL_ARRAY_BUFFER, poscount *
sizeof(
float), &
points[
iteration-1][0], GL_STATIC_DRAW);
364 glBindBuffer(GL_ARRAY_BUFFER, 0);
367 glGenVertexArrays(1, &vaobuf);
368 glBindVertexArray(vaobuf);
370 glBindBuffer(GL_ARRAY_BUFFER, posbuf);
371 glEnableVertexAttribArray(0);
372 glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, 0);
374 vao.push_back(vaobuf);
376 glBindVertexArray(0);
377 glBindBuffer(GL_ARRAY_BUFFER, 0);
std::vector< std::vector< glm::vec3 > > points
Liste von Positionslisten. An der Stelle i sind die Knotenpositionen der Kurve von Grad i-1...
std::string type
Aktueller Kurventyp.
void decreaseDrawingIteration()
veringere die zu zeichnende Iterationsstufe um 1.
std::string currentString
Aktueller String der zu berechnenden Iterationsstufe.
std::vector< glm::vec3 > getPoints(int order)
Gibt die Kurveneckpunkte in der Iterationstiefe order zurueck. Sollte order groesser als die aktuell ...
std::vector< int > positioncount
Liste von Anzahl der Knoten. An der Stelle i ist die Knotenanzahl der Kurve von Grad i-1...
int segmentcount
Anzahl der Segmente der aktuell maximalen Iterationsstufe.
L_System(int width, int height, std::string t)
Dem Konstruktor wird die Breite und Hoehe des Fensters uebergeben. Diese werden nur fuer die Initialk...
int getDrawingIteration()
Gibt die Iterationstiefe zurueck die aktuell gezeichnet wird.
double delta
Winkel der bei einer Winkelaenderung auf den aktuellen Winkel ab oder angerechnet wird...
std::string getRule(char var)
Ueberprueft ob es fuer den uebergebenen char eine Ersetzungsregel gibt und gibt diese, falls vorhanden, zurueck.
int drawingIteration
Aktuell zu zeichnende Iterationsstufe.
std::string getType()
Gibt den Typ der Kurve zurueck ("hilbert" oder "gosper").
double x
Aktuelle x Koordinate.
std::vector< GLuint > vao
Liste von Vertex Array Objects. An der Stelle i ist das vao der Kurve von Grad i-1.
void draw(GLuint shader)
Zeichnet die aktuelle Kurve.
double distance
Laenge eines Kurvensegments.
void initHilbert()
Setzt den Startstring und die Kurveneigenschaften der Hilbertkurve.
void initCurve(int w, int h)
Initialisiert eine Standartkurve als Order 0 Kurve und allgemeine Parameter.
void iterate()
Die maximale Iterationsstufe wird um 1 erhoeht und die Punkte der naechsten Iterationsstufe berechnet...
int iteration
Aktuell maximale Iterationsstufe.
void initGosper()
Setzt den Startstring und die Kurveneigenschaften der Gosperkurve.
int height
Hoehe des Anzeigefensters.
int getSegmentCount()
Gibt die aktuelle Anzahl der Kurvensegmente zurueck.
void setDrawingIteration(int order)
Setzt die zu zeichnende Iterationsstufe auf order falls order kleiner als die maximale Iterationsstuf...
double y
Aktuelle y Koordinate.
double angle
Aktueller Winkel.
void increaseDrawingIteration()
erhoehe die zu zeichnende Iterationsstufe um 1.
GLuint shader
Enthaellt den Zeichenshader.
int width
Breite des Anzeigefensters.
std::vector< GLuint > positionBuffer
Liste von Positionsbuffern. An der Stelle i ist der Buffer der Kurve von Grad i-1.
std::vector< std::string > rules
Liste von Ersetzungsregeln.
int getIteration()
Gibt die aktuell maximale Iterationstiefe zurueck.
double degToRad(double angle)
Rechnet Gradwinkel in Radiant um.