Progressão Aritmética e Geométrica / Interpolação

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

Progressão Aritmética e Geométrica / Interpolação

Mensagem por Meta Ridley em Seg 11 Fev 2013, 22:41

Progressão Aritmética e Geométrica / Interpolação

Não é apenas para animação, também me é importante na programação.

Claro que a gente geralmente ouve isso relacionado à animação, mas a minha dúvida não tem nada a ver com isso.
Acontece que muitas vezes eu preciso criar um sistema de progressão, exemplo:

Eu tava escrevendo um script para simular duas bolinhas que se mexem, uma puxando a outra, como que presas por um elástico. Fiz isso para uma pessoa aqui do Game Maker Brasil.

http://gmbr.forumeiros.com/t25031-duas-esferas-que-se-puxam

Eu pedi para que, quando a distância entre as duas bolinhas fosse maior que um certo valor(50, no caso) a bolinha azul seguisse a vermelha.


O problema é que eu queria que a bolinha vermelha(que é a que você controla) simplesmente fosse perdendo velocidade. Quanto mais longe a bolinha vermelha estivesse da azul mais esticado estaria o elástico, e portanto, mais devagar ela deveria ir. Isso porque quanto mais esticado estivesse o elástico, mais tensão ele teria e mais força seria necessária para puxá-lo(esticá-lo ainda mais). Como você estaria sempre aplicando a mesma força, uma hora o elástico vai começar a reduzir a sua velocidade, até que ele começa a te puxar. A menos que a outra bolinha seja mais leve o que significa que ela é quem deve te seguir. Para simular melhor isso eu faria o seguinte:

Quando a tensão do elástico for maior que um certo valor a bolinha começa a ti seguir
A velocidade com a qual a bolinha te segue fica determinada pelo nível de tensão do elástico:
Quanto maior a tensão mais rápido a bolinha te segue
E a tensão do elástico fica determinada pela distância entre as duas bolinhas. Onde quanto maior fosse a distância mais tensão se teria.

Mas como passar essa lógica pro Script?
(Aliás "como passar esta lógica por Script" SEMPRE é o meu problema ao programar)


Uma outra situação era com o próprio elástico. Eu o simulei usando o Draw Line:

draw_line(objeto 1(x,y);objeto 2(x,y);espessura da linha)

Mas eu queria que quanto mais esticado estivesse o elástico, ou seja, quanto mais distantes as duas bolinhas estivessem umas das outras, mais fina seria a linha. Consequentemente, quanto mais próximas elas estivessem mais grosso seria o elástico.


Sendo que isso foi apenas 1 exemplo. Isso porque essa dúvida surgiu de novo quando eu tava nesse probleminha aí das bolinhas. Mas acontece que tem várias vezes em que eu preciso resolver uma situação com uma expressão estilo: Quanto mais isso acontecer mais aquilo ocorre.

Então vamos à outros exemplos que eu consegui lembrar:

Eu queria o seguinte:

Quanto mais longe a personagem estiver do inimigo mais difícil será enxergá-la. Então, se a distância entre o inimigo e a sua personagem aumentasse, a visibilidade da sua personagem para àquele inimigo diminuiria.
Sendo que eu queria que muitos outros fatores diminuíssem a visibilidade como uma atmosfera densa: Chuva, névoa/neblina, neve; onde quanto mais densa a atmosfera mais difícil fica enxergar, por exemplo: quanto mais densa a chuva mais difícil vai ficar de enxergar um inimigo. E também com a claridade do ambiente: Quanto mais escuro menor a visibilidade. Tem também o caso da luz contra os olhos do inimigo onde quanto mais forte a luz mais difícil fica enxergar.

Outra situação eram as reações dos inimigos aos diversos níveis de visibilidade. Digamos que com 100% de visibilidade o inimigo teria 100% de certeza de ver a personagem. Com 50% ele estaria na área da dúvida. Com 0% ele não veria nada.

Portanto:
Com 90% seria uma quase certeza de ter visto algo
Com 60 ou 70% ele já teria uma certa dúvida
Com 30% ele já esta começando a achar que não viu nada("Must be just my imagination": Metal Gear)
E com 10% ele já teria dificuldades de perceber algo ali.


Um segundo exemplo é quando eu quero fazer uma progressão de cor como nos inimigos de Metroid. Acontece que nos clássicos desta série a barra de vida do inimigo era substituída por uma mudança em sua coloração. Por exemplo o inimigo poderia começar com uma cor normal e ir ficando vermelho até morrer.


Eu já tentei fazer o seguinte:

No evento Step do objeto 1(obj_1)
Código:
///////Quanto mais longe a bolinha vermelha estiver da azul mais fino fica o elástico
if distance_to_object(obj_2)+=1{
draw_line(obj_1.x,obj_1.y,obj_2.x,obj_2.y, w-=1)}

E não tinha dado certo.

Eu procurei no Google e não encontrei nenhuma maneira de se fazer isso ou alguém respondendo a um pergunta igual ou semelhante à minha.

Concluindo:
Alguém sabe como criar sistemas de progressão no Game Maker?

Alguém???

Meta Ridley

Número de Mensagens : 171
Idade : 25
Data de inscrição : 09/12/2010
Reputação : 7
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: Progressão Aritmética e Geométrica / Interpolação

Mensagem por RafaelCazarotto em Seg 11 Fev 2013, 23:24

Eu fiz um miniprograma no GM que acha o valor de um termo em uma PA eu fiz isso para usar na escola e ta postado aqui procure como
Termo em progessao aritimerica
Provavelmente vc vai achr Smile talvez possa te dar uma luz ou uma ideia Smile

RafaelCazarotto

Ranking : Nota C
Número de Mensagens : 564
Idade : 19
Data de inscrição : 15/03/2012
Notas recebidas : D-D-D-C-C-B
Reputação : 13
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   : 0
   : 1

Voltar ao Topo Ir em baixo

Re: Progressão Aritmética e Geométrica / Interpolação

Mensagem por PedroX em Ter 12 Fev 2013, 00:10

Código:
draw_line(obj_1.x,obj_1.y,obj_2.x,obj_2.y, 100/distance_to_object(obj_2))

Você não pode simplesmente adicionar um valor (+=) a uma função. Você pode salvar numa variável e depois somar um valor. No caso acima, como a função somente retorna o valor e eu não adiciono nada, então é permitido.

Como você disse que tem problemas em transformar lógica em código, seria bom ler uns tutoriais de lógica de programação.

Até mais!

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Progressão Aritmética e Geométrica / Interpolação

Mensagem por Meta Ridley em Ter 12 Fev 2013, 10:00

PedroX

Deu certo! Mas

Infelizmente deu um erro pois quando as duas bolas colidem dá um erro indicado o comando distance_to_object(). Eu acho que quando não há distância ou ela for 0 esse comando não é válido. Eu tentei fazer uma checagem de colisão e pedir para que apenas caso não houvesse uma colisão que se fosse desencadeada a expressão. Mas não deu certo. Ou dava o erro, ou a linha não era desenhada



Código:
___________________________________________
ERROR in
action number 1
of Draw Event
for object obj_1:

Error in code at line 3:
  draw_line_width(obj_1.x,obj_1.y,obj_2.x,obj_2.y,100/distance_to_object(obj_2))}
                                                      ^
at position 54: Division by 0.

RafaelCazarotto

No caso, apesar ser uma relação com o conceito de progressão, eu não quero exatamente achar um dos termos dela, como geralmente pedem em exercícios. Eu quero poder alterar outros valores com base na alteração de outro valor. Eu acho que o PedroX conseguiu. Mas eu ainda não testei em outras coisas para ver se àquele errinho é mesmo só neste caso.

Meta Ridley

Número de Mensagens : 171
Idade : 25
Data de inscrição : 09/12/2010
Reputação : 7
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: Progressão Aritmética e Geométrica / Interpolação

Mensagem por PedroX em Ter 12 Fev 2013, 14:26

Código:
draw_line_width(obj_1.x,obj_1.y,obj_2.x,obj_2.y,100/max(5, distance_to_object(obj_2)))

Assim o mínimo será 5, o que dará 20 de largura.

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Progressão Aritmética e Geométrica / Interpolação

Mensagem por Meta Ridley em Ter 12 Fev 2013, 15:01

nervoso

Divisão por zero de novo
___________________________________________
ERROR in
action number 1
of Draw Event
for object obj_1:

Error in code at line 3:
draw_line_width(obj_1.x,obj_1.y,obj_2.x,obj_2.y,100/distance_to_object(obj_2))}
^
at position 54: Division by 0.

Meta Ridley

Número de Mensagens : 171
Idade : 25
Data de inscrição : 09/12/2010
Reputação : 7
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: Progressão Aritmética e Geométrica / Interpolação

Mensagem por PedroX em Ter 12 Fev 2013, 16:03

Você não colocou o max(), como eu disse.

Até mais!

PedroX

Ranking : Nota C
Número de Mensagens : 6034
Idade : 21
Data de inscrição : 26/07/2008
Notas recebidas : C+B
Reputação : 286
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   :
   :
   :

Voltar ao Topo Ir em baixo

Re: Progressão Aritmética e Geométrica / Interpolação

Mensagem por Kabeção em Ter 12 Fev 2013, 16:26

Meta Ridley, me parece que seu maior problema e não saber aplicar vetores unitários e o calculo de escalas.
O termo mais usado para isso na programação é vetor normalizado.

O que é vetor normalizado?

Basicamente o que você quer é achar um valor proporcional e/ou entre dois outros valores.
Digamos que queremos desenhar um texto em que a posição x no correspondente a 50% dos seguintes valores:
20 a 40
Como achar esses 50% entre os dois valor?

Primeiro pare de pensar nos valores como 20 a 40!

Usei esses número simples para facilitar a compreensão, você provavelmente já sabe a resposta de cabeça mas se fosse 14556 a 89563?
Nós precisamos simplificar-los então vamos substituir seus valor por uma escala de 0 a 1 (vetor unitário).
Agora que não temos mais números complexos podemos facilmente saber qual o 50% do nosso vetor: (1/100)*50 = 0.5.
Agora que temos nossa escala final 0.5 tudo o que precisamos fazer e calcular (valor_final-valor_inicial)*escala.

(40-20)*0.5 = 10
Temos então o resultado! 50% de 20 a 40 vale 10 pontos.
Por final somamos nosso resultado ao ponto inicial e temos a posição exata para nosso ponto x.
20+(40-20)*0.5 = 30

Agora é fácil achar os 50% de quaisquer valores
14556 a 89563
(89563-14556)*0.5 = 37503,5
14556+37503,5 = 52059,5

E o contrário?
Temos os números
20 a 40
Como saber qual valor da escala representa o número 10?
A formula é fácil: valor/(valor_final-valor_inicial).
10/(40-20) = 0.5
37503,5/(89563-14556) = 0.5

Agora como aplicar isso ao que perguntou tópico?

Mas eu queria que quanto mais esticado estivesse o elástico, ou seja, quanto mais distantes as duas bolinhas estivessem umas das outras, mais fina seria a linha. Consequentemente, quanto mais próximas elas estivessem mais grosso seria o elástico.
Exemplo:
Código:
// Defina um valor mínimo e um máximo para o tamanho do elástico
w1 = 3;
w2 = 10;

// distancia mínima e máxima entre os objetos
d1 = 0;
d2 = 50;

// Calcule a distancia atual entre os dois
dist = point_distance(obj1.x,obj1.y,obj2.x,obj2.y);

// Agora você precisa achar a escala entre d1 e d2 e dist e aplicar essa escala ao tamanho da linha w1 e w2
escala = dist/(d2-d1);

draw_line_width(obj1.x,obj1.y,obj2.x,obj2.y,w1+(w2-w1)*escala);

Saber usar escalas é quase que obrigatório na hora de fazer jogos.
Isso que expliquei serve para situação em que precise achar valores relativos a outros números

Código:
// ficar vermelho
hp_min = 0;      // note que quando o mínimo é 0 você nem preciso inclui-lo na conta, coloquei nos exemplo só para deixar mais claro
hp_max = 100;
hp_atual = 20;

escala = hp_atual/(hp_max-hp_min);
// Quanto menor o hp menor sera green e blue deixando só o red
image_blend = make_color_rgb(255,255*escala,255*escala);

Código:
velocidade_min = 2;
velocidade_max = 8;

// distancia mínima e máxima entre os objetos
d1 = 0;
d2 = 50;

dist = point_distance(obj1.x,obj1.y,obj2.x,obj2.y);
escala = dist/(d2-d1);

// quanto mais distante mais baixa a velocidade que o objeto pode atingir
velocidade_max_possivel = velocidade_min+(velocidade_max*escala)

Kabeção

Ranking : Sem avaliações
Número de Mensagens : 2314
Data de inscrição : 08/06/2008
Reputação : 100
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 3
   : 0
   : 1

http://blackcapapps.blogspot.com.br/

Voltar ao Topo Ir em baixo

Re: Progressão Aritmética e Geométrica / Interpolação

Mensagem por Meta Ridley em Ter 12 Fev 2013, 17:28

PedroX

Olha, desculpa tava funcionando sim. O erro era em outra coisa, uma bobagem por sinal.

Kabeção


Pô valeu mesmo. Vou testar os códigos aqui.



Aliás, eu vou aproveitar e perguntar se vocês e quaisquer outros membros podem me recomendar algum curso de programação e lógica de programação. Se possível on-line, mas pode ser em outros lugares como o CCAA. Se tiver um gratuito que não seja perca de tempo eu aceito também. Se alguém tiver previsões de preços e custos totais diga, porque vai me ajudar também.

Meta Ridley

Número de Mensagens : 171
Idade : 25
Data de inscrição : 09/12/2010
Reputação : 7
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0

Voltar ao Topo Ir em baixo

Re: Progressão Aritmética e Geométrica / Interpolação

Mensagem por Dancity em Ter 12 Fev 2013, 17:48

Bom, eu nunca conheci um curso que tratasse de lógica da programação em geral. Mas sim de Lógica da Programação em C++ e outras linguagens, pelo simples fato de que seria muito difícil fazer um material que atendesse todos os alunos com suas diferentes linguagens de programação.

Você pode continuar lendo tutoriais de game maker em geral, você vai acabar pegando o jeito. É bom também ter um bom conhecimento em exatas, quando você sabe aplicar esse conhecimento em código a programação melhora muito. Foi isso que o kabeção fez, cálculo de escalas. Pura matemática.

Mas se você quiser um curso mesmo de lógica da programação seja em GML ou um Global. Me desculpa, não conheço nenhum.

Abraços!

Dancity

Ranking : Nota A
Número de Mensagens : 1339
Data de inscrição : 11/01/2009
Notas recebidas : A
Reputação : 8
Insignia 1 x 0 Insignia 2 x 0 Insignia 3 x 0
Prêmios
   : 1
   :
   :

Voltar ao Topo Ir em baixo

Re: Progressão Aritmética e Geométrica / Interpolação

Mensagem por Conteúdo patrocinado Hoje à(s) 08:14


Conteúdo patrocinado


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