Я использую SFML и кодирование на C ++.Программа, которую я пишу, должна быть рекурсивной реализацией.
Моя цель - создать функцию, которая рекурсивно рисует квадрат на экране в разных позициях и вращениях в зависимости от ранее нарисованного квадрата.
Каждый последующий квадрат должен быть меньше предыдущего вызова функции и повернут на 45 градусов влево (от левого угла предыдущего квадрата) или на 45 правее предыдущего квадрата.
Каждый новый квадрат порождает еще два квадрата и т.д ..
Моя идея состоит в том, чтобы передать верхнюю левую точку и верхнюю правую точку квадрата двум различным рекурсивным вызовам функций и использовать эти точки в качестве отправных точек для последующих квадратов..
Хотя сгенерированные квадраты также передают верхний левый и правый углы рекурсивным вызовам функций и т. Д.
Разработанный мной код не отображает оба квадрата, которые должны были быть сгенерированы из рекурсивноговызовы функций.Отображается только одна сторона.
Я разработал следующий код (Пожалуйста, прости мой код .. Я не кодировал в C ++ слишком долго ..)
ДРАЙВЕР ПРОГРАММЫ (main.cpp)
#include <SFML/System.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include "PTree.hpp"
using namespace std;
using namespace sf;
int main( int argc, char* argv[ ] )
{
double L = 0.0; // Length of square sides
int N = 0; // Number of times to call recursive function
L = atol( argv[ 1 ] );
N = atoi( argv[ 2 ] );
Vector2f vPoint;
vPoint.x = 0;
vPoint.y = 0;
// Create and Display Window
PTree tree( L, N );
return 0;
}
(PTree.hpp)
#ifndef PTREE_H
#define PTREE_H
using namespace std;
using namespace sf;
class PTree /*:public sf::Drawable, public sf::Transformable*/{
public:
// Constructor
PTree( double L, int N );
// Destructor
~PTree();
// Recursive function to draw Pythagorias Tree
void pTree( double L, int N, Vector2f vPoint, Vector2f vOrigin, float rotation );
private:
float width = 0;
float height = 0;
int originX = 0;
int originY = 0;
float rotation = 0;
RenderWindow window;
int angle1 = 0;
int angle2 = 0;
};
#endif // PTREE_H included
(PTree.cpp)
#include <SFML/System.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/Window.hpp>
#include <math.h>
#include "PTree.hpp"
#include <iostream>
using namespace std;
using namespace sf;
// Constructor
PTree::PTree( double L, int N )
{
width = ( 6 * L );
height = ( 4 * L );
Vector2f vPoint = { width/2, height - 1 };
Vector2f vOrigin;
vOrigin.x = L/2;
vOrigin.y = L;
/* vPoint.x = width/2;
vPoint.y = height - 1;
*/
window.create( VideoMode( width, height ), "Pythagoras Fractal Tree" );
pTree( L, N, vPoint, vOrigin, 0 );
}
// Destructor
PTree::~PTree(){}
/*###########################################################################*/
// Recursive function to draw Pythagorias Tree
void PTree::pTree( double L, int N, Vector2f vPoint, Vector2f vOrigin, float rotation )
{
Vector2f vPointR;
if( N < 1 )
{
return;
}
// Define a convex shape called convexSquare
ConvexShape convexSquare( 4 );
convexSquare.setPoint( 0, Vector2f( 0, 0 ));
convexSquare.setPoint( 1, Vector2f( 0, L ));
convexSquare.setPoint( 2, Vector2f( L, L ));
convexSquare.setPoint( 3, Vector2f( L, 0 ));
convexSquare.setOutlineThickness( 1.f );
convexSquare.setFillColor( Color::Black );
convexSquare.setOutlineColor( Color::White );
convexSquare.setPosition( vPoint );
convexSquare.setOrigin( vOrigin );
convexSquare.setRotation( rotation );
while( window.isOpen( ))
{
Event event;
while( window.pollEvent( event ))
{
if( event.type == Event::Closed )
{
window.close( );
}
}
if( N >= 0 )
{
window.draw( convexSquare );
window.display( );
L = ( L * ( sqrt(2)/2 ));
N = N - 1;
rotation = rotation - 135;
cout << "LOOPS:" << N << endl;
//left
vPoint = convexSquare.getTransform( ).transformPoint( convexSquare.getPoint( 0 ));
vOrigin = convexSquare.getPoint( (angle1) );
pTree( L, N, vPoint, vOrigin, rotation );
angle1 = (( angle1 + 1 ) % 4 );
//right
vPointR = convexSquare.getTransform( ).transformPoint( convexSquare.getPoint( 3 ));
vOrigin = convexSquare.getPoint( 2 );
pTree( L, N, vPointR, vOrigin, rotation-90 );
}
}
cout << "X value =" << vPoint.x << " Y value = " << vPoint.y << endl;
Пока япопытался вернуть различные точки выпуклых форм для второго рекурсивного вызова функции pTree.Это тоже ничего не отображало.
Изначально я использовал только Vector2f vPoint и модифицировал его перед каждым рекурсивным вызовом, но после исчерпания базы знаний для решения я создал новую переменную специально для квадратов справа, называемую Vector2f.vPointR.
Документация SFML не предоставляет достаточных примеров для таких новичков, как я.По сути, API - это список опций с минимальными примерами, если таковые имеются для каждой функции.Я искал в интернете, насколько мог, чтобы увидеть, пропускаю ли я неправильные точки, но не смог найти ответ.
Единственное, что сработало (хотя и не совсем правильно), это когда я переключил рекурсивзвонки ... то есть я передвинул вызов для квадратов правой стороны перед вызовом для квадратов левой стороны, но проблема в том, что квадраты левой стороны не отображались.
В этот момент я такжепытаясь определить правильное вращение для каждого квадрата, но это наименьшая из моих проблем.
Есть ли проблема с тем, как я пытаюсь рекурсивно отображать эти квадраты?
Я не являюськонечно, куда идти, кроме Stack Overflow за помощью.
Спасибо за ваше время и опыт.