C ++ / SFML:使用两个递归调用将凸形状打印到屏幕上只显示第一次递归调用的形状而不是第二次递归调用

问题描述 投票:0回答:1

我在C ++中使用SFML和编码。我写的程序必须是递归实现。

我的目标是创建一个函数,该函数以不同的位置和旋转递归地在屏幕上绘制一个正方形,这取决于先前绘制的正方形。

每个后续方块应小于前一个函数调用,并向左旋转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本质上是一个选项列表,每个函数都有最少的示例。我已经在互联网上搜索了我的能力,看看我是否通过了错误的点但却找不到答案。

有效的一件事(尽管不完全正确)是当我切换递归调用时...意思是我在调用左侧正方形之前移动了右侧正方形的调用,但问题是左侧s quares没有显示。

在这一点上,我也试图找出每个方格的正确旋转,但这是我最小的问题。

我试图以递归方式显示这些方块的问题是否存在问题?

除了Stack Overflow之外,我不知道从哪里可以获得帮助。

感谢您的时间和专业知识。

c++ recursion sfml fractals convex
1个回答
1
投票

不要递归调用整个qazxsw poi循环。仅递归调用绘图部件

while

您也可以使用// Initialize window... while (window.isOpen()) { sf::Event event; // Handle events... window.clear(); // call the recursive function here window.display(); } 来绘制而不是sf::RectangleShape

这是一个有效的“例子”:

sf::ConvexShape
© www.soinside.com 2019 - 2024. All rights reserved.