[RESOLVIDO]Erro em C++ com SFML

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.

[code]#include
#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;

}
[/code]

Se alguem puder me ajudar eu agradeço
Obrigado.

Isso se chama “falta de atenção”. O método translacao precisa de 4 parâmetros mas você está passando só 2 …

void translacao(Ponto * p, int tamanho, float tx, float ty)  
...
    translacao(-pivo.x, -pivo.y);//usando pivo negativo  

Mas o erro que ta dando é esse:

error: request for memeber x in pivo , which is of non-class tipe ponto

isso seria pela quantidade de parametros?

Uma coisa que aprendi em C++ é que o compilador dá umas mensagens de erro um pouco difíceis de entender.

Na verdade, ele está reclamando que você usou pivo.x, não pivo->x (nesse caso, pivo é um Ponto*, não? É que seu programa está com outros erros de compilação.

De modo geral, tente sempre resolver o primeiro erro primeiro, e acostume-se com o fato que se não entender a mensagem de erro, é necessário pelo menos ver se há algum erro óbvio, como foi o seu caso.

Beleza, é que so iniciante ainda, fica dificil de entender até coisas bem basicas.
mas se eu colocar o pivo->x tambem da o mesmo erro.

Pois bem, você primeiro resolve os erros mais básicos e óbvios (quantidade incorreta de parâmetros, você tem de passar os parâmetros na ordem e quantidade desejados), e depois você recompila e vê se a mensagem mudou. Se você simplesmente trocar por “pivo->x” pode ser qua a mensagem não mudel

A mensagem de erro é mais ou menos como aquelas reclamações que uma criança faz para seu pai ou sua mãe.
Ela começa a chorar, mas não lhe explica direito que está com fome, ou com as fraldas sujas, ou com sono - você é que precisa ver exatamente o que está ocorrendo.

Beleza, vou ver o que consigo fazer.

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:

[code]#include
#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(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::D))
            line.Rotate(-15);
        else if (Window.GetInput().IsKeyDown(sf::Key::E))
            line.Rotate(+15);*/
        Window.Draw(line);
    }
    Window.Display();

}
return EXIT_SUCCESS;

}
[/code]

Desde ja eu agradeço
Obrigado.

Engraçado, aparentemente não era para isso estar acontecendo.

Seu código ficou extremamente rebuscado. O ideal seria usar classes matemáticas mais adequadas.
Dê uma lida nesses artigos, vão te ajudar a estruturar tudo bem melhor:
http://www.pontov.com.br/site/arquitetura/54-matematica-e-fisica/132-o-uso-de-vetores-nos-jogos
http://www.pontov.com.br/site/arquitetura/54-matematica-e-fisica/238-matrizes-e-transformacoes-parte-1
http://www.pontov.com.br/site/arquitetura/54-matematica-e-fisica/267-matrizes-e-transformacoes-parte-2
http://www.pontov.com.br/site/arquitetura/54-matematica-e-fisica/332-vetores-guia-de-referencia

Além disso, em alguns pontos você não precisaria estar criando os objetos no heap (através de ponteiros) como no caso dos Pivos.

Valeu pela ajuda cara, o programa ta funcionando redondinho é esse:

[code]#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include
#include <math.h>
#define PI 3.1416

using namespace std;

class Ponto {//classe de definição do ponto
public:
float x;
float y;
Ponto(float _x, float _y) : x(_x), y(_y) {}
};

float dist_eucl(int x1, int y1, int x2, int y2){//função para calcular a distancia euclidiana entre os pontos
return pow(pow(x2 - x1, 2) + pow(y2 - y1, 2), 1/2);
}
float graus2radianos(float grau){//função que transforma graus em radianos
return (grau /180) * PI;
}
float sen(float grau){//função que calcula o seno de um angulo
return sin(graus2radianos(grau));
}

float cosen(float grau){//função que calcula o consseno de un algulo
return cos(graus2radianos(grau));
}
void translacao(Ponto* p[], int arestas, float tx, float ty){//função que translada todo o triangulo
for(int i = 0; i < arestas; i++){
p[i] -> x = p[i] -> x + tx;
p[i] -> y = p[i] -> y + ty;
}
}
void escala(Ponto* p[], int arestas, float tx, float ty)//função de escala do triangulo
{
float xc, yc;
for (int z =0; z < arestas; z++){
xc += p[z]->x;
yc += p[z]->y;
}
xc = (xc)/arestas;
yc = (yc)/arestas;

Ponto* pivo = new Ponto(xc, yc);//cria um pivo para os pontos
translacao(p, arestas, -pivo->x, -pivo->y);
for (int i =0; i < arestas; i++)//executa a operação em todos os pontos do elemento
{
    p[i] -> x = p[i] -> x * tx;
    p[i] -> y = p[i] -> y * ty;
}
translacao(p, arestas, pivo->x, pivo->y);
delete (pivo);

}

void rotacao(Ponto* p[], int arestas, float angulo){//função de rotação do triangulo

float xc, yc;
for (int z =0; z < arestas; z++){//executa a operação em todos os pontos do elemento
    xc += p[z]->x;
    yc += p[z]->y;
}
xc = (xc)/arestas;
yc = (yc)/arestas;


Ponto* pivo = new Ponto(xc, yc);//cria um pivo para os pontos
translacao(p, arestas, -pivo->x, -pivo->y);
for (int i =0; i < arestas; i++)//executa a operação em todos os pontos do elemento
{
    float x1, y1;
    x1 = (p[i] -> x * cosen(angulo)) + (p[i] -> y * -sen(angulo));
    y1 = (p[i] -> x * sen(angulo)) + (p[i] -> y * cosen(angulo));

    p[i] -> x = x1;
    p[i] -> y = y1;
}
translacao(p, arestas, pivo->x, pivo->y);
delete (pivo);

}

int main() {
sf::RenderWindow* app = new sf::RenderWindow(sf::VideoMode(800, 600, 32), “Exercicio 2”);//renderiza a janela

Ponto* triangulo[3];//define a posição dos 3 pontos do triangulo
triangulo[0] = new Ponto(50, 100);
triangulo[1] = new Ponto(100, 50);
triangulo[2] = new Ponto(150, 100);

while (app->IsOpened()) {//gamelooping do jogo
    sf::Event* event = new sf::Event();
    while (app->GetEvent(*event)) {
        if (event->Type == sf::Event::Closed) {
            app->Close();
        }
    }
    if (app->GetInput().IsKeyDown(sf::Key::Escape)) {//se apertar esc o jogo fecha
        return EXIT_SUCCESS;
    }

    if (app->GetInput().IsKeyDown(sf::Key::Right)){//se apertar pra direita o trianlo translada 10 pixels pra direita
        translacao(triangulo, 3, 10, 0);
    }
    if (app->GetInput().IsKeyDown(sf::Key::Left)){//se apertar pra esquerda o trianlo translada 10 pixels pra esquerda
        translacao(triangulo, 3, -10, 0);
    }
    if (app->GetInput().IsKeyDown(sf::Key::Down)){//se apertar pra baixo o trianlo translada 10 pixels pra baixo
        translacao(triangulo, 3, 0, 10);
    }
    if (app->GetInput().IsKeyDown(sf::Key::Up)){//se apertar pra cima o trianlo translada 10 pixels pra cima
        translacao(triangulo, 3, 0, -10);
    }
    if (app->GetInput().IsKeyDown(sf::Key::PageUp)){//se apertar pageup o triangulo aumenta sua escala
        escala(triangulo, 3, 1.1, 1.1);
    }
    if (app->GetInput().IsKeyDown(sf::Key::PageDown)){//se apertar pagedown o triangulo aumenta sua escala
        escala(triangulo, 3, 0.9, 0.9);
    }
     if (app->GetInput().IsKeyDown(sf::Key::D)){//se apertar a tecla D o triangulo rotaciona pra direita
        rotacao(triangulo, 3, 15);
    }
     if (app->GetInput().IsKeyDown(sf::Key::E)){//se apertar a tecla E o triangulo rotaciona pra esquerda
        rotacao(triangulo, 3, -15);
    }

    app->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));//junta as linhas formando o triangulo
        app->Draw(line);
    }

sf::Sleep(0.02);//da um sleep pra nao ficar super rapido

    app->Display();
}
return EXIT_SUCCESS;//fecha o jogo

}
[/code]