Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

hpt

C++ com SFML

Recommended Posts

Pessoal, tenho um codigo que esta dando um erro e precisava da ajuda de alguem ai que entenda de C++, esse codigo serve para pegar o shape de um triangulo efazer a translaçao, aumentar a sua escala em 10% e rotacionar em torno de um angulo, só que ta dando erro na linha 29.

 

#include <iostream>
#include <math.h>
#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#define PI 3.1416

class Ponto
{
public:
   float x,x1;
   float y,y1;
   Ponto(float _x, float _y) : x(_x), y(_y) {}
};



void translacao(Ponto * p, int tamanho, float tx, float ty)
{
   for (int i =0; i < tamanho; i++) //aplicaa operação de escala
   {
       p[i].x += tx;
       p[i].y += ty;
   }
}

void escala(Ponto * p, int tamanho, float ex, float ey)
{
   Ponto *pivo = new Ponto(p[0].x, p[0].y);//desloca o pivo de x para a posição 0
   translacao(-pivo.x, -pivo.y);//usando pivo negativo
   for (int i =0; i < tamanho; i++)
   {
       p[i].x *= ex;
       p[i].y *= ey;
   }
   translacao(p, tamanho, pivo->x, pivo->y);//move de volta os pontos para a origem
   delete (pivo);
}

void rotacao(Ponto * p[], int tamanho, float ang)
{
   int xAux=0;
   int yAux=0;
   Ponto *pivo = new Ponto(p[0].x, p[0].y);//desloca o pivo de x para a posição 0
  //translacao(-pivo.x, -pivo.y);//usando pivo negativo
   for (int i=0; i < tamanho; i++)
   {
       xAux=(p[i]->x * cos(ang)) + (p[i]->y * -sin(ang));
       yAux=(p[i]->x * sin(ang)) + (p[i]->y * cos(ang));
       p[i]->x=xAux;
       p[i]->y=yAux;
   }
   //translação(pivo.x, pivo.y);//move de volta os pontos para a origem
}


void distanciaeuclidiana(Ponto * p[], int tamanho, float x2,float x1,float y2,float y1)
{
   double distancia;//calcula a distancia entre dois pontos
   for (int i = 0; i < tamanho; i++)
   {
       distancia=sqrt (pow((p[i]->x1-p[i]->x),2)+pow((p[i]->y1-p[i]->y),2));
   }
}
float graus2radianos (float grau) //converte graus para radianos
{
   return (grau/180) * PI;
}

float a = graus2radianos(15);
float x = cos(a);
float y = sin(a);




int main()
{
   //sf::RenderWindow* app = new sf::RenderWindow(sf::VideoMode(800, 600, 32), "Triangulo 2D");
   sf::RenderWindow Window(sf::VideoMode (800, 600, 32), "SFML Made Easy");

   Ponto* triangulo[3];
   triangulo[0] = new Ponto(50, 100);
   triangulo[1] = new Ponto(100, 50);
   triangulo[2] = new Ponto(150, 100);

   while (Window.IsOpened())
   {
       sf::Event* event = new sf::Event();
       while (Window.GetEvent(*event))
       {
           if (event->Type == sf::Event::Closed)
           {
               Window.Close();
           }
       }
       if (Window.GetInput().IsKeyDown(sf::Key::Escape))
       {
           return EXIT_SUCCESS;
       }

       Window.Clear(sf::Color(255, 255, 255));
       for (int i = 0; i < 3; i++)
       {
           int j = i + 1;
           if (j > 2) j = 0;
           sf::Shape line = sf::Shape::Line(triangulo[i]->x, triangulo[i]->y,
                                            triangulo[j]->x, triangulo[j]->y,
                                            1, sf::Color(0, 0, 0));

           translacao(triangulo, 3, 0, 0);
           if(Window.GetInput().IsKeyDown(sf::Key::Right))
               line.Move (10, 0);
           else if (Window.GetInput().IsKeyDown(sf::Key::Left))
               line.Move (-10, 0);
           else if(Window.GetInput().IsKeyDown(sf::Key::Up))
               line.Move(0, -10);
           else if(Window.GetInput().IsKeyDown(sf::Key::Down))
               line.Move(0, 10);
           escala(triangulo,3,1,2);
           if(Window.GetInput().IsKeyDown(sf::Key::PageUp))
               line.SetScaleX(10);
           else if(Window.GetInput().IsKeyDown(sf::Key::PageDown))
               line.SetScaleY(10);
           rotacao(triangulo,3,15);
           if (Window.GetInput().IsKeyDown(sf::Key::D))
               line.Rotate(-15);
           else if (Window.GetInput().IsKeyDown(sf::Key::E))
               line.Rotate(+15);
           Window.Draw(line);
       }
       Window.Display();
   }
   return EXIT_SUCCESS;
}

 

Se alguem puder me ajudar eu agradeço

Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

hpt,

 

A primeira vista:

 

void escala(Ponto * p, int tamanho, float ex, float ey)
{
   Ponto *pivo = new Ponto(p[0].x, p[0].y);//desloca o pivo de x para a posição 0
   translacao(-pivo.x, -pivo.y);//usando pivo negativo
   for (int i =0; i < tamanho; i++)
   {
       p[i].x *= ex;
       p[i].y *= ey;
   }
   translacao(p, tamanho, pivo->x, pivo->y);//move de volta os pontos para a origem
   delete (pivo);
}

 

Nesta função você acessa os atributos do objeto "p" com o operador ".", mas ele é um ponteiro, neste caso usa-se o operador "->".

Quando se trabalha com alocação dinâmica sempre se utiliza o "->" ao invés de "." Esta flecha (->) é o ponteiro "this".

 

Uma dica. Quando se trabalha com vetores de qualquer tipo e o passa para função como ponteiro, tente utilizá-lo como ponteiro. Sem o uso dos colchetes ([]).

 

Espero ter ajudado, FLW!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Coloquei (->), mas só mudou o erro, mas ele continua ocorrendo na mesma linha.

A questão dos colchetes que você falou eu não entendi direito.

A função ficou assim

 

void escala(Ponto * p, int tamanho, float ex, float ey)
{
   Ponto *pivo = new Ponto(p[0].x, p[0].y);//desloca o pivo de x para a posição 0
   translacao(-pivo->x, -pivo->y);//usando pivo negativo
   for (int i =0; i < tamanho; i++)
   {
       p[i].x *= ex;
       p[i].y *= ey;
   }
   translacao(p, tamanho, pivo->x, pivo->y);//move de volta os pontos para a origem
   delete (pivo);
}

 

O erro aparece na quarta linha ( translacao(-pivo->x, -pivo->y);//usando pivo negativo ), onde diz "error: cannot convert 'float' to 'Ponto*' for argument '1' to 'void translacao(Ponto',...).

 

O que pode ser isso?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Consegui arrumar os erros, mas agora na hora da compilação não acontece o que eu queria, por exemplo, tem a função de translação, que era para transladar o triangulo para os lados e para cima quando apertasse as setas do teclado, até acontece isso, mas depois de solta a tecla, o triangulo volta para a posição inicial, alguem sabe como resolver isso?

O código é esse pra alguem poder me ajudar:

 

#include 
#include 
#include 
#include 
#define PI 3.1416

class Ponto
{
public:
float x,x1;
float y,y1;
Ponto(float _x, float _y) : x(_x), y(_y) {}
};



void translacao(Ponto * p[], int tamanho, float tx, float ty)
{
for (int i =0; i < tamanho; i++) //aplicaa operação de escala
{
p[i]->x += tx;
p[i]->y += ty;
}
}

void escala(Ponto * p[], int tamanho, float ex, float ey)
{
Ponto *pivo = new Ponto(p[0]->x, p[0]->y);//desloca o pivo de x para a posição 0
translacao(p, tamanho, -pivo->x, -pivo->y);//usando pivo negativo
for (int i =0; i < tamanho; i++)
{
p[i]->x *= ex;
p[i]->y *= ey;
}
translacao(p, tamanho, pivo->x, pivo->y);//move de volta os pontos para a origem
delete (pivo);
}

void rotacao(Ponto * p[], int tamanho, float ang)
{
int xAux=0;
int yAux=0;
Ponto *pivo = new Ponto(p[0]->x, p[0]->y);//desloca o pivo de x para a posição 0
translacao(p, tamanho, -pivo->x, -pivo->y);//usando pivo negativo
for (int i=0; i < tamanho; i++)
{
xAux=(p[i]->x * cos(ang)) + (p[i]->y * -sin(ang));
yAux=(p[i]->x * sin(ang)) + (p[i]->y * cos(ang));
p[i]->x=xAux;
p[i]->y=yAux;
}
translacao(p, tamanho, pivo->x, pivo->y);//move de volta os pontos para a origem
}


void distanciaeuclidiana(Ponto * p[], int tamanho, float x2,float x1,float y2,float y1)
{
double distancia;//calcula a distancia entre dois pontos
for (int i = 0; i < tamanho; i++)
{
distancia=sqrt (pow((p[i]->x1-p[i]->x),2)+pow((p[i]->y1-p[i]->y),2));
}
}
float graus2radianos (float grau) //converte graus para radianos
{
return (grau/180) * PI;
}

float a = graus2radianos(15);
float x = cos(a);
float y = sin(a);




int main()
{
//sf::RenderWindow* app = new sf::RenderWindow(sf::VideoMode(800, 600, 32), "Triangulo 2D");
sf::RenderWindow Window(sf::VideoMode (800, 600, 32), "SFML Made Easy");

Ponto* triangulo[3];
triangulo[0] = new Ponto(50, 100);
triangulo[1] = new Ponto(100, 50);
triangulo[2] = new Ponto(150, 100);

while (Window.IsOpened())
{
sf::Event* event = new sf::Event();
while (Window.GetEvent(*event))
{
if (event->Type == sf::Event::Closed)
{
Window.Close();
}
}
if (Window.GetInput().IsKeyDown(sf::Key::Escape))
{
return EXIT_SUCCESS;
}

Window.Clear(sf::Color(255, 255, 255));
for (int i = 0; i < 3; i++)
{
int j = i + 1;
if (j > 2) j = 0;
sf::Shape line = sf::Shape::Line(triangulo[i]->x, triangulo[i]->y,
triangulo[j]->x, triangulo[j]->y,
1, sf::Color(0, 0, 0));

translacao(triangulo, 3, 0, 0);
if(Window.GetInput().IsKeyDown(sf::Key::Right))
line.Move (10, 0);
else if (Window.GetInput().IsKeyDown(sf::Key::Left))
line.Move (-10, 0);
else if(Window.GetInput().IsKeyDown(sf::Key::Up))
line.Move(0, -10);
else if(Window.GetInput().IsKeyDown(sf::Key::Down))
line.Move(0, 10);
escala(triangulo,3,1,2);
if(Window.GetInput().IsKeyDown(sf::Key::PageUp))
line.SetScaleX(10);
else if(Window.GetInput().IsKeyDown(sf::Key::PageDown))
line.SetScaleY(10);
/*rotacao(triangulo,3,15);
if (Window.GetInput().IsKeyDown(sf::Key:))
line.Rotate(-15);
else if (Window.GetInput().IsKeyDown(sf::Key::E))
line.Rotate(+15);*/
Window.Draw(line);
}
Window.Display();

}
return EXIT_SUCCESS;
}

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.