[Tutorial] lengthdir_x e lengthdir_y

Ver o tópico anterior Ver o tópico seguinte Ir em baixo

[Tutorial] lengthdir_x e lengthdir_y

Mensagem por saim em Ter 29 Nov 2011, 11:45

Nome: Usando lengthdir_x e lengthdir_y
Descrição: Algumas pessoas têm dificuldade com essas funções. Resolvi criar esse tutorial com a teria necessária pra compreendê-las
Nível de dificuldade: Pra programação, nenhum, mas pode requerer um pouco de entendimento em matemática.
Requerimentos: Primeiro grau completo. Noções em geometria
Desenvolvimento: Antes de entrar na teoria, farei como o método kumon: vou voltar um pouco na matéria, até a parte que você já domina, e começar daí.

Coordenadas cartesianas:

Você conhece e está acostumado com as coordenadas cartesianas. Localizar um ponto na tela quando eu te digo os valores de x e y é fácil, pra você. Mesmo que os valores de x e y NÃO estejam na tela.
Mas vamos rever um pouco essa teoria.

O que te é fornecido pra que você localize um ponto? Além dos valores de x e y, temos a escala, em pixels (ou: quanto mede cada unidade) e a origem (onde, afinal, é o zero).
Com isso, você parte da origem e põe uma régua na vertical. Anda com ela pra esquerda ou direita, dependendo do sinal, ao longo do eixo x, e anda o número de unidades que corresponde ao valor de x dentro da escala usada. Repete o mesmo com o eixo y e, onde as duas réguas se cruzarem, lá estará seu ponto.
Como você consegue fazer tudo isso sem nem perceber?

Coordenadas polares:

Coordenadas polares servem pra mesma coisa, porém os dados que você dispõe são diferentes. E se ao invés de termos duas réguas, tivéssemos uma régua e um transferidor (aquela regüinha circular que serve pra medir ângulos)? O ponto seria encontrado do mesmo jeito. Desde que se mantivessem os sinais, os valores e a escala.
Faríamos o seguinte: prenderíamos uma régua na origem e andaríamos pra esquerda ou direita, dependendo do sinal, o número de unidades na escala correspondente ao valor. Até aqui, tudo muito parecido. Agora é que vem o pulo do gato: ao invés de repetir tudo no outro eixo, nós giraríamos a régua. Como ela está presa na origem, giramos ela ao redor da origem em um número de graus que determinará o ângulo. E, assim, chegamos a um ponto a partir de dados diferentes das coordenadas (x, y)!
Nesse sistema, o ângulo chama ângulo mesmo, mas a distância chama raio.
Esse sistema de coordenadas é corriqueiro, na matemática. Se você terminou o segundo grau, você conhece isso. Se terminou e não conhece, é porque não gosta da área de exatas e está perdendo tempo num fórum sobre produção de jogos (a menos que você seja desenhista ou sonoplasta, mas aí não precisa ler tutoriais sobre programação).
importante: No game maker, bem como na matemática em geral, o ângulo zero é aquele que aponta para a direita. Os ângulos crescem em sentido anti-horário e fecham-se num círculo de 360 graus.
menos importante, mas relevante: Podem ser usados valores negativos, tanto no ângulo quanto no raio. Um raio negativo significa que você deve andar pra esquerda, na régua. Um ângulo negativo significa que você deve girar a régua no sentido horário.

Transformação de coordenadas cartesianas para polares:


Não vou ensinar toda a trigonometria envolvida no conceito, mas pense no seguinte: um ponto depende do sistema de coordenadas que você está usando?
Não, não depende. Ele existe. Como você vai fazer pra chegar até ele é assunto seu. Então, logicamente, é possível chegar ao mesmo ponto usando qualquer sistema de coordenadas.
Por sorte, a única diferença que teremos é que um usa distâncias em x e y e o outro usa um raio e um ângulo. A escala e a origem serão iguais.

Pra transformar as coordenadas cartesianas em polares, no game maker, fazemos o seguinte:
pra achar o raio, usamos "raio=point_distance(0, 0, x, y)".
pra achar o ângulo, usamos "ângulo=point_direction(0, 0, x, y)".
Você tinha entendido que as coordenadas do origem são (0, 0), né? Se não, volte pro começo do tutorial e releia tudo até entender.

E o caminho inverso? Como achar os valores de x e y se eu tiver um raio e um ângulo. Uma dica: foi pra isso que eu fiz esse tutorial!

Usando lengthdir:
Lengthdir serve pra transformar coordenadas polares em cartesianas. Porque, muitas vezes, você acha mais fácil usar coordenadas cartesianas. Porque, às vezes, você só quer o valor em x ou em y. Porque, ora bolas, o game maker se baseia em coordenadas cartesianas e você pode precisar determinar a posição de um objeto em termos de X e Y.
O que você tem em coordenadas polares é um raio, ou seja, um comprimento - length - e um ângulo, ou seja, uma direção - direction. length+direction=lengthdir. Pra saber o valor em x correspondente àquele comprimento e àquela direção, use lengthdir_x. Em y, use lengthdir_y.
Pra achar o valor x, use "lengthdir_x(raio, ângulo)".
Pra achar o valor y, use "lengthdir_y(raio, ângulo)".
Saim, saim! Dá pra fazer isso usando seno e cosseno!
É, dá sim. Agora vai brincar de lego star wars, vai. Seu nerd!

Extrapolando: (se você teve dificuldade pra chegar até aqui, nem leia o resto)
Deixa eu diminuir a letra pra parte mais filosófica: Claro que nem sempre você quer a posição de um ponto com relação à origem da room. Raramente você quer isso. Normalmente você quer a posição de um ponto em relação a outro ponto, que você já conhece. Notou que point_distance e point_direction tem alguns argumentos que declaramos como (0, 0)? Essa é a origem da room. Podemos criar nosso próprio sistema de coordenadas se deslocarmos a origem pro ponto que quisermos e, aí, teremos maior facilidade em achar o próximo ponto. Podemos fazer isso quantas vezes quisermos.
O que estamos fazendo é deixar de encontrar a posição de um ponto com relação ao ponto "origem" e passaremos a encontrar a posição dele com relação a outro ponto. É só uma forma de organizar as informações na nossa cabeça.
Pra matemática, os pontos estão lá e eles existem ao mesmo tempo em relação a todos os pontos do plano e do espaço.
Então pegue um plano e desenhe os pontos 1 e 2. Olhe pra eles. Cada um tem as coordenadas (x, y), que serão (x1, y1) e (x2, y2). Cada um terá as coordenadas polares (raio, ângulo) que serão (raio1, ângulo1) e (raio2, ângulo2).
Qual é a distância entre esses pontos? Qual o ângulo entre esses dois pontos? Qual a diferença entre as coordenadas x e entre as coordenadas y?
distância, fácil: "distância=point_distance(x1, y1, x2, y2)".
ângulo, fácil: "ângulo=point_direction(x1, y1, x2, y2)".
Notou que só substituímos o ponto (0, 0) por (x1, y1)?
diferença entre coordenadas x (chamarei de "dx"), fácil: "dx=x2-x1"
MAS, se você só tiver a distância e o ângulo entre esses pontos, pode usar "dx=lengthdir_x(distância, ângulo)" - conforme aprendemos.
Pra dy, mesma coisa: ou "dy=y2-y1" ou "dy=lengthdir_y(distância, ângulo)".
Hei, mas não usamos raio1, ângulo1, raio2 nem ângulo2!!!
É. Em coordenadas polares, os dados relativos à origem não são muito úteis pra saber a relação entre os pontos. Na verdade, podem ser sim, mas isso é mais pra faculdade.

Esses dados (dx e dy) são suficientes pra encontrar um ponto no planos?
NÃO
Eles são suficientes pra encontrar um ponto no plano desde que você tenha o outro ponto a que ele se refere. "x2=x1+dx" e "y2=y1+dy".

Então, finalmente, se você quer colocar um objeto numa posição relativa à posição de outro objeto, numa distância e ângulo já determinados, você precisa ter
- as coordenadas do outro objeto (x1, y1)
- a distância a ser usada (raio, em coordenadas polares)
- o ângulo entre os objetos (ângulo mesmo)
Como o game maker só trabalha com cartesianas, você TEM que definir a posição (x2, y2) do seu objeto. Você já sabe como fazer isso:
Código:
//primeiro, os dados que você tem:
distancia=valor dado;
angulo=valor dado;
x1=outroObjeto.x;
y1=outroObjeto.y;
//agora, calculando as distâncias em x e y do seu objeto:
dx=lengthdir_x(distancia, angulo);
dy=lengthdir_y(distancia, angulo);
x2=x1+dx;
y2=y1+dy;
Voilà, você achou as coordenadas do seu objeto!

Exemplo: Fazendo um objeto orbitar o outro

Suponha que você esteja fazendo um mago num jogo tpo-down. Esse mago tem esferas de energia que ficam rodando ao redor dele. Como determinar a posição das bolas sem trocadilho?
Você, primeiro, define a que distância elas estarão do mago. Uma vez definido isso, basta saber que ela estará num ângulo em relação a ele.
Então, a posição da bo... da esfera será igual à posição do mago + um raio e um ângulo.
Código:
esfera.x=mago.x+algo;
esfera.y=mago.y+algo;
E esse "algo" é...
Lengthdir! Lengthdir(ângulo, raio)!
Quase. Lengthdir(raio, ângulo). A ordem dos argumentos é importante.
Código:
esfera.x=mago.x+lengthdir_x(raio, angulo);
esfera.y=mago.y+lengthdir_x(raio, angulo);
Notou algum erro no código? Eu deixei lá de propósito.
Vai lá, leia de novo.
O segundo lengthdir tá "x"!
Isso. Isso sempre acontece quando usamos ctrl+c, ctrl+v. Tomem cuidado.
Bom, a esfera ainda não está rodando. Está acompanhando o mago, paradinha. Pra ela rodar, ela precisa mudar o ângulo. Então criamos mais uma variável, a velocidade angular, ou velocidade de giro, ou torque, ou rotação, ou...
Vou simplesmente chamá-la de "giro".
A cada step, o ângulo deve ser somado ao "giro". Depois, re-atualizamos a posição da esfera.
Código:
angulo+=giro;
esfera.x=mago.x+lengthdir_x(raio, angulo);
esfera.y=mago.y+lengthdir_y(raio, angulo);
Simples, não é?
Agora brinquem um pouco com os valores de raio e giro DURANTE o jogo pra ver que efeitos legais você cria!

Beijo!

Até o próximo tutorial!

PS: esse tutorial já tinha sido postado, mas perdeu-se no último ataque hacker ao fórum

saim

Ranking : Nota B
Número de Mensagens : 2964
Idade : 38
Data de inscrição : 14/01/2011
Notas recebidas : C-D-A-B
Reputação : 121
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 3

Voltar ao Topo Ir em baixo

Re: [Tutorial] lengthdir_x e lengthdir_y

Mensagem por GameMakerTutoriais em Dom 27 Maio 2012, 12:48


Ótimo tutorial! Adorei a explicação sobre o sistema de coordenadas polares. É uma coisa que acaba "passando batido" mas é interessante demais. Em modelagem 3d, por exemplo, essa conversão de coordenadas é muito útil na aplicação de texturas em formas arredondadas, porque embora o sistema seja um pouco mais complexo, o conceito de "coordenada e ponto" funciona sempre do mesmo jeito.

Tá de parabéns, tutorial fino.

Flws!

GameMakerTutoriais

Número de Mensagens : 800
Data de inscrição : 29/01/2011
Reputação : 26
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 0
   : 0
   : 0

Voltar ao Topo Ir em baixo

Ver o tópico anterior Ver o tópico seguinte Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum