Ir ao conteúdo
  • Cadastre-se

C Matemática: como se roda 1 ponto?


Posts recomendados

em Matemática como se roda um ponto?

ao pesquisar eu notei que para calcular a rotação de 1 ponto fazemos:

x = x . cos α - y .sin α

y = x . sin α + y .cos α

 

agora vamos falar de 2 pontos importantes:
1 - o computador usa Radianos e não Graus.. por isso temos de converter Graus em Radianos:

PI = 3,14159265358979323846
Radians = ( Angulo* PI) / 180

2 - esta rotação usa a origem(0,0) como ponto de rotação...

O que ainda estou com dificuldade em entender é: como posso rodar um ponto a partir de outro ponto?

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

8 horas atrás, Cambalinho disse:

O que ainda estou com dificuldade em entender é: como posso rodar um ponto a partir de outro ponto?


Da mesma forma mas, ao invés de medir a distância a partir do ponto (0, 0), meça a partir de um ponto (x0, y0). Então, x' = (x - x0)*cos(alpha) - (y - y0)*sin(alpha). Alternativamente, você sempre pode mover um vetor de onde quer que ele esteja pra origem (0, 0) aplicar a rotação e então movê-lo novamente pra posição original (agora devidamente rotacionado). Lembre-se de movê-lo sem alterar o comprimento ou a direção.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

tenho isto dentro de 1 ciclo, mas o raio da rotação não é constante :(

//fora do loop:
//o ponto roda em torno do player:
PointX = intPlayerPosX + 100 //fica á frente do Player 100 pixels
PointY = intPlayerPosY

//dentro do loop de draw:
//O PointX e PointY são os pontos do pixel que quero rodar em volta do Player...
//retiro a posição do player, pois é o ceentro da rotação:
PointX = PointX - intPlayerPosX
PointY = PointY - intPlayerPosY

//faço a rotação:
PointX = PointX * Cos(Radians) - PointY * Sin(Radians)
PointY = PointX * Sin(Radians) + PointY * Cos(Radians)

//adiciono a posição do Player:
PointX = PointX + intPlayerPosX
PointY = PointY + intPlayerPosY

//desenhar o pixel na posição rotacionada:
DrawPixel (PointX, PointY, vbBlack)

(isto não é código C, mas simplifiquei)
PS: ao alterar o angulo eu já o converto para Radianos:

Const Double PI = 3.14159265359
Radians = (intPlayerAngle * PI) / 180

 

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

ao fazer mais pesquisas eu encontrei a formula:

//O X0 e Y0 são as coordenadas do centro da rotação:
x' = (x-x0)*cos(a) - (y-y0)*sin(a) + x0
y' = (x-x0)*sin(a) + (y-y0)*cos(a) + y0
//eis o codigo que fiz:
intPlayerAngle = intPlayerAngle + 1
Radians = (intPlayerAngle * PI) / 180
//faço a rotação(X0 e Y0 são as coordenadas do centro da rotação):
//x ' = (x-x0)*cos(a) - (y-y0)*sin(a) + x0
//y ' = (x-x0)*sin(a) + (y-y0)*cos(a) + y0
PointX = (PointX - intPlayerPosX) * Cos(Radians) - (PointY - intPlayerPosY) * Sin(Radians) + intPlayerPosX
PointY = (PointX - intPlayerPosX) * Sin(Radians) + (PointY - intPlayerPosY) * Cos(Radians) + intPlayerPosY

as coordenadas intPlayerPosX e intPlayerPosY não estão a ser alteradas, mas o PointX e PointY foram inicializados:

PointX = intPlayerPosX + 100
PointY = intPlayerPosY

a pergunta: porque o centro da rotação está sempre a variar se eu nem estou a alterar as coordenadas intPlayerPosX e intPlayerPosY?

  • Obrigado 1
Link para o comentário
Compartilhar em outros sites

1 hora atrás, Cambalinho disse:

porque o centro da rotação está sempre a variar se eu nem estou a alterar as coordenadas intPlayerPosX e intPlayerPosY?


Aparentemente as equações estão corretas. Você sempre pode checar o comprimento do vetor, ou a distância entre o ponto e a origem (x0, y0), pra garantir que a rotação foi feita corretamente. O comprimento deve ser o mesmo antes e depois da operação. Assim o erro deve ser noutra parte do código que você não mostrou.

Por sinal, não misture números inteiros e números reais nos cálculos pra não perder precisão. Use double (float) pra todas as variáveis envolvidas além de constantes literais também como reais, i.e. "1.0", "180.0" ("1.0f", "180.0f"). Se estiver usando um compilador de C, ao invés de C++, conversões inesperadas podem alterar o cálculo.

  • Amei 1
Link para o comentário
Compartilhar em outros sites

resolvi.. muito obrigado.
 

'o ponto roda em torno do player:
    PointX = intPlayerPosX + Cos(Radians) * 100
    PointY = intPlayerPosY + Sin(Radians) * 100

tenho de calcular para o Y também.
este foi o mesmo erro.
este calculo faz com que o Point rode em torno do player, mas com distancia de 100.
este ponto serve para saber para onde o player esta virado.

muito obrigado.
se quiser mover um objecto\player consoante o angulo, temos de multiplicar o movimento pelo Sin(Y) e Cos(X) pelo Radiano... sim o computador usa Radianos em vez de Graus.
muito obrigado por tudo

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

 

GRÁTIS: ebook Redes Wi-Fi – 2ª Edição

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!