hpt 0 Denunciar post Postado Outubro 5, 2012 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
GBecker 51 Denunciar post Postado Outubro 5, 2012 Qual erro retornou? Compartilhar este post Link para o post Compartilhar em outros sites
hpt 0 Denunciar post Postado Outubro 5, 2012 error: request for member x in pivo, which is of non-class type ponto* Compartilhar este post Link para o post Compartilhar em outros sites
GBecker 51 Denunciar post Postado Outubro 8, 2012 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
hpt 0 Denunciar post Postado Outubro 9, 2012 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
hpt 0 Denunciar post Postado Outubro 16, 2012 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