UniDev - Programação de Jogos • View topic - Rotação vetor


[ +/- ] [ Hoje é 09 Set 2010, 18:38 ]


Post a new topicWrite comments Page 1 of 1   [ 8 posts ]
Author Message
 Post subject: Rotação vetor
PostPosted: 29 Nov 2009, 18:56 
Membro

Joined: 23 Nov 2009, 21:28
Posts: 4
Olá, o André me ajudou com o meu trabalho de Álgebra e gerou o seguinte algorítmo para rotacionar um vetor. Só que não ta funfando...

#include "gamespace.h"
#include <stdlib.h>
#include <math.h>

// Rotaciona o ponto 'p' em 'a' graus
GS_VECTOR2 Rotaciona(GS_VECTOR2 p, const float a)
{

const float fCosA = cosf(a); // pré-calcula o seno e coseno para evitar duas chamadas
const float fSinA = sinf(a); //desenecessrárias da mesma função

GS_VECTOR2 r;
r.x = p.x * fCosA + p.y * fSinA;
r.y =-p.x * fSinA + p.y * fCosA;
return r;
}

int main(int argc, char* argv[])
{
GAMESPACE_VIDEO_HANDLER gsVideo;

//Cria uma janela pronta para receber as intruções do jogo
if (gsVideo.StartApplication(640, 480, "GameSpaceLib window", true))
{
// Inicia o laço principal de renderização
while (gsVideo.ManageLoop())
{
GS_VECTOR2 v2CentroDaTela = gsVideo.GetScreenDimF()/2.0f;
static float fAngulo = 0;
fAngulo+=0.04f;
GS_VECTOR2 v2Vetor = Rotaciona(GS_VECTOR2(0,-100), fAngulo);

gsVideo.DrawLine(v2CentroDaTela, v2CentroDaTela+v2Vetor, GS_WHITE, GS_RED);
}
}
return 0;
}

Alguém sabe o que se passa? :S
Abç.


Topo
 Profile  
 
 Post subject: Re: Rotação vetor
PostPosted: 30 Nov 2009, 10:32 
Administrador
User avatar

Joined: 30 Ago 2002, 19:16
Posts: 440
Location: Brasil
Você precisa especificar porque não está funcionando. É erro de compilação? (Que erro?) Que compilador você usa? É erro de execução? O que exatemente acontece?

_________________
André Santee
ImageEthanon Engine: http://www.asantee.net/ethanon/
Página pessoal: http://www.asantee.net/


Topo
 Profile  
 
 Post subject: Re: Rotação vetor
PostPosted: 30 Nov 2009, 11:29 
Membro

Joined: 23 Nov 2009, 21:28
Posts: 4
Não é erro de compilação. To usando o DEV C++
Ele complia normalmente.
Quando executa, abre a janela criada e não mostra nada ._.


Topo
 Profile  
 
 Post subject: Re: Rotação vetor
PostPosted: 30 Nov 2009, 15:06 
Membro Sênior

Joined: 20 Jan 2003, 00:15
Posts: 462
Location: Rio de Janeiro
Eu não conheço a GSLib, ainda estou para aprender :)

Tem um erro conceitual no seu código, que não é responsável por não desenhar nada, mas é sempre bom saber que existe esse erro. As funções sinf e cosf esperam o ângulo em radianos e não em graus. Para rodar a graus você deveria converter de graus para radianos (a graus == a*M_PI/180. radianos. M_PI é uma constante que está na math.h, que vale pi).

Agora, para tentar descobrir o que está errado, esse códgido desenha algo na tela:

Code:
#include "gamespace.h"
#include <stdlib.h>
#include <math.h>
int main(int argc, char* argv[])
{
    GAMESPACE_VIDEO_HANDLER gsVideo;

    //Cria uma janela pronta para receber as intruções do jogo
    if (gsVideo.StartApplication(640, 480, "GameSpaceLib window", true))
    {
        // Inicia o laço principal de renderização
        while (gsVideo.ManageLoop())
        {
              GS_VECTOR2 v2CentroDaTela = gsVideo.GetScreenDimF()/2.0f;
              static float fAngulo = 0;
              fAngulo+=0.04f;
              GS_VECTOR2 v2Vetor = GS_VECTOR2(0,-100);
              gsVideo.DrawLine(v2CentroDaTela, v2CentroDaTela+v2Vetor, GS_WHITE, GS_RED);
        }
    }
    return 0;
}


Note que a única coisa que eu fiz foi tirar a parte que rotaciona. Esse código deveria mostrar um segmento entre os pontos (320, 140) e (320, 240).

Mais uma vez, não conheço GSLib, e o erro que eu falei, apesar de ser um erro, não é responsável por não funcionar.

Abraço,
Daniel.


Topo
 Profile  
 
 Post subject: Re: Rotação vetor
PostPosted: 30 Nov 2009, 18:13 
Administrador
User avatar

Joined: 30 Ago 2002, 19:16
Posts: 440
Location: Brasil
danielf wrote:
Tem um erro conceitual no seu código, que não é responsável por não desenhar nada, mas é sempre bom saber que existe esse erro. As funções sinf e cosf esperam o ângulo em radianos e não em graus. Para rodar a graus você deveria converter de graus para radianos (a graus == a*M_PI/180. radianos. M_PI é uma constante que está na math.h, que vale pi).


Não Daniel. Você está correto quando diz que as funções de seno e coseno funcionam somente se o ângulo está em radiano. Mas no caso desse exemplo isso não determinaria o bom ou malfuncionamento do programa. Se você perceber bem no código, verá que o ângulo só está sendo somado (fAngulo+=0.04f;), e não está sendo feita nenhuma operação com ângulos especificos. Inclusive, o valor é baixo justamente pelo fato do ângulo ter de ser em radiano. Portanto o código está correto.

Diego, se o programa roda normalmente, pode estar havendo alguma incompatibilidade com hardware.

1. Verifique se a GameSpaceLib está mostrando algum alerta na janela console que abre.

2. Tente aumentar a espessura da linha utilizando o método ::SetLineWidth. Isso faz com que a forma de renderização mude, portanto, se o problema for que o seu PC esteja com problemas para desenhar linhas, este problema pode ser resolvido. Conforme mostra o código:
Code:
#include <gamespace.h>
#include <stdlib.h>
#include <math.h>

// Rotaciona o vetor 'p' em 'a' radianos (corrigido)
GS_VECTOR2 Rotaciona(GS_VECTOR2 p, const float a)
{
   const float fCosA = cosf(a); // pré-calcula o seno e coseno para evitar duas chamadas
   const float fSinA = sinf(a); //desenecessrárias da mesma função

   GS_VECTOR2 r;
   r.x = p.x * fCosA + p.y * fSinA;
   r.y =-p.x * fSinA + p.y * fCosA;
   return r;
}

int main(int argc, char* argv[])
{
   //Declara os objetos básicos de video, entrada e áudio
   GAMESPACE_VIDEO_HANDLER gsVideo;

   //Cria uma janela pronta para receber as intruções do jogo
   if (gsVideo.StartApplication(640, 480, "GameSpaceLib window", true))
   {
      // Aumenta a espessura da linha
      gsVideo.SetLineWidth(5.0f);

      // Inicia o laço principal de renderização
      while (gsVideo.ManageLoop())
      {
         GS_VECTOR2 v2CentroDaTela = gsVideo.GetScreenDimF()/2.0f;
         static float fAngulo = 0;
         fAngulo+=0.04f;
         GS_VECTOR2 v2Vetor = Rotaciona(GS_VECTOR2(0,-100), fAngulo);

         gsVideo.DrawLine(v2CentroDaTela, v2CentroDaTela+v2Vetor, GS_WHITE, GS_RED);
      }
   }
   return 0;
}

_________________
André Santee
ImageEthanon Engine: http://www.asantee.net/ethanon/
Página pessoal: http://www.asantee.net/


Topo
 Profile  
 
 Post subject: Re: Rotação vetor
PostPosted: 30 Nov 2009, 19:28 
Membro

Joined: 23 Nov 2009, 21:28
Posts: 4
AAAh, agora sim haha :D
Valeu, André. Te devo uma gelada
Abç!


Topo
 Profile  
 
 Post subject: Re: Rotação vetor
PostPosted: 01 Dez 2009, 01:23 
Membro Sênior

Joined: 20 Jan 2003, 00:15
Posts: 462
Location: Rio de Janeiro
andrew1b wrote:
danielf wrote:
Tem um erro conceitual no seu código, que não é responsável por não desenhar nada, mas é sempre bom saber que existe esse erro. As funções sinf e cosf esperam o ângulo em radianos e não em graus. Para rodar a graus você deveria converter de graus para radianos (a graus == a*M_PI/180. radianos. M_PI é uma constante que está na math.h, que vale pi).


Não Daniel. Você está correto quando diz que as funções de seno e coseno funcionam somente se o ângulo está em radiano. Mas no caso desse exemplo isso não determinaria o bom ou malfuncionamento do programa. Se você perceber bem no código, verá que o ângulo só está sendo somado (fAngulo+=0.04f;), e não está sendo feita nenhuma operação com ângulos especificos. Inclusive, o valor é baixo justamente pelo fato do ângulo ter de ser em radiano. Portanto o código está correto.

Andrew1b, existe sim o erro conceitual, pois até aonde eu entendo, comentário faz parte do código. No comentário está bem claro que o parâmetro "a" estaria em graus.

Outro erro conceitual é que não se rotaciona pontos e sim vetores (que são descritos da mesma forma (2 números) mas são entidades matemáticas diferentes).

Mas enfim, não tem porque começar uma discussão quanto a isso, foi só para alertar o amigo diego.mez para futuramente ele saber que está rodando em radianos.

Abraço,
Daniel.


Topo
 Profile  
 
 Post subject: Re: Rotação vetor
PostPosted: 01 Dez 2009, 09:54 
Administrador
User avatar

Joined: 30 Ago 2002, 19:16
Posts: 440
Location: Brasil
Distração minha. Realmente o comentário diz ângulos. Bem colocada a observação.
Quanto ao ponto e vetor, realmente são entidades diferentes, mas é comum na computação gráfica utilizar um registro de vetor para representar pontos.

PS.: corrigi o comentário

_________________
André Santee
ImageEthanon Engine: http://www.asantee.net/ethanon/
Página pessoal: http://www.asantee.net/


Topo
 Profile  
 
Display posts from previous:  Sort by  
Post a new topicWrite comments Page 1 of 1   [ 8 posts ]
Similar topics
Dúvida com Rotação
Forum: C# e programação .NET
Author: tanao
Replies: 1
Ajuda com Vetor
Forum: Pascal/Delphi
Author: yargonxp
Replies: 1
Rotação
Forum: Allegro
Author: leo0201
Replies: 9
Vetor de Caracteres com espaço...
Forum: C/C++
Author: fur
Replies: 6
Variável de sessao em vetor
Forum: Outras linguagens
Author: lucasteixeira
Replies: 4
Topo


Who is online

Users browsing this forum: Nenhum usuario registrado and 1 guest


Voce não pode criar topicos neste forum
Voce não pode responder topicos neste forum
Voce nao pode editar seu post neste forum
Voce nao pode deletar seu post neste forum

Search for:
Jump to:  



Powered by phpBB ©

Virtual Object Informtica Ltda. Fone/Fax: (15)3231-6840

Portal XL 5.0 ~ Premod 0.2 phpBB SEO