Introdução a Matemática e Física Não há como fugir delas — se você quer aprender IA, você tem que saber um pouco de matemática e física. Com certeza você pode usar muitas técnicas de IA através de "copiar e colar", mas você estará se prejudicando; no momento em que precisar resolver um problema ligeiramente diferente de um que você copiou o código, você terá sérias dificuldades. Porém se você entender a teoria por trás das técnicas, você terá uma chance muito melhor de desenvolver uma solução alternativa para o seu problema. Além disso, é uma boa prática entender a ferramenta com que se trabalha. E qual a melhor razão para você aprender essas coisas do que essa? Eu estou escrevendo este capítulo assumindo que você sabe pouca coisa sobre matemática ou física. Assim me perdoe se já sabe a maior parte do que for ensinado, mas eu acredito que desta maneira eu alcançarei todos, não interessando a experiência do leitor. Vá passando o capítulo até você ver algo que não sabe ou encontrar um tópico onde acha que precisa refrescar a sua memória. Nesse ponto, comece a ler. Se você já está confortável com matemática de vetores e física do movimento, eu sugiro que pule este capítulo inteiro e só volte se encontrar algo que não entende. 1. Matemática Começaremos com matemática, pois tentar aprender física sem matemática é como tentar voar sem asas. 1.1 Coordenadas Cartesianas Você provavelmente já está familiarizado com o sistema de coordenadas Cartesianas. Se você alguma vez, fez um programa que desenhasse imagens na tela então você com certeza usou o sistema de coordenadas Cartesianas para descrever as posições dos pontos, linhas e bitmaps que formavam a imagem. Em duas dimensões, o sistema de coordenadas é definido por dois eixos posicionados a um ângulo reto um do outro e marcados com unidades de comprimento. O eixo horizontal é chamado de eixo x e o eixo vertical é o eixo y. O ponto onde os eixos se cruzam é chamado de origem. Veja a Figura 1.1. Figura 1.1: O sistema de coordenadas Cartesianas A ponta das setas de cada eixo na Figura 1.1 indicam a direção onde eles se estendem infinitamente. Se você se imaginar segurando uma folha de papel infinita com os eixos x e y desenhados nela, o papel representa o plano xy — o plano onde todos os pontos no sistema de coordenadas Cartesiano bidimensional poderão ser inseridos. Um ponto no espaço 2D é representado por um par de coordenadas (x, y). Os valores de x e y representam as distâncias ao longo dos respectivos eixos. Hoje em dia, uma série de pontos ou linhas inseridos em um sistema de coordenadas Cartesiano é usualmente chamada de gráfico, o que evita um bocado de digitação também. :o) Nota Para representar o espaço tridimensional, um outro eixo é necessário — o eixo z. O eixo z “sai da tela” do computador, passando pela origem. Veja a Figura 1.2. Figura 1.2: Um sistema de coordenadas de três eixos (3D) 1.2 Funções e Equações O conceito de funções é fundamental para a matemática. Uma função expressa o relacionamento entre dois (ou mais) termos chamados variáveis, e é tipicamente escrita na forma de uma equação (um conjunto de expressões algébricas igual a uma outra expressão algébrica). As variáveis são chamadas assim porque, como o nome implica, seus valores podem variar. As variáveis são expressadas usualmente com letras do alfabeto. As duas variáveis mais comuns que você verá sendo usadas em equações matemáticas são x e y (entretanto qualquer letra ou símbolo também é valido). Se cada valor de x pode ser associado com um outro valor de y, então y é uma função de x. O y então é chamado de variável dependente já que seus valores dependem do valor de x. Aqui um par de exemplos: (1.1) (1.2) No segundo exemplo, o m e o c representam constantes (algumas vezes chamados coeficientes) — valores que nunca mudam, não interessando o valor de x. Eles são efetivamente similares ao 2 na equação (1.1). Portanto, se a = 2, a equação (1.1) pode ser escrita da seguinte maneira: (1.3) Dado qualquer valor de x, o valor correspondente de y pode ser calculado pela colocação do valor de x na função. Sendo x = 5 e x = 7 a função y =2x, os valores de y serão: (1.4) Neste tipo de função, onde o y depende unicamente do valor de uma única outra variável, é chamada de função de variável-simples. As funções de variável-simples podem ser visualizadas pelo desenho delas no plano Cartesiano xy. Para desenhar uma função, tudo o que você tem de fazer é moverse ao longo do eixo x e para cada valor de x use a função para calcular o valor de y. É claro que é impossível desenhar um gráfico para cada valor de x — isso pode demorar para sempre (literalmente) — então você deve selecionar um conjunto de valores. A esquerda da Figura 1.3 é mostrado como a função y =2x parece quando desenhada no plano xy, usando um conjunto de valores de x entre -5.0 e 5.0. Figura 1.3: Funções desenhadas no espaço Cartesiano Para desenhar a função y = mx + c em um gráfico, você deve primeiro ter alguns valores para as constantes m e c. Vamos dizer que m = 2 e c = 3, dada a função y =2x + 3. O direita da Figura 1.3 mostra o gráfico resultante. Os gráficos parecem muito similares não é? Isso é porque y = mx + c é a função que define todas as linhas retas no espaço 2D. A constante m define a inclinação da linha e a constante c dita onde a linha intersecta o eixo y. A função y =2x, mostrada na esquerda da figura, é equivalente a função y = mx + c, onde m = 2 e c = 0. O gráfico da direita é quase idêntico, porém, o valor c é 3, o ponto onde a linha intersecta o eixo y é levantado em três unidades. Algumas vezes você verá uma função como y=mx+c escrita assim: (1.5) A notação f(x) está declarando que a variável dependente — neste exemplo, o y — depende da variável x na expressão dada no lado direito da equação, mx+c. Entretanto, você verá outros símbolos além de um f para representar a função, então não se preocupe de ver algo como. (1.6) O g(x) representa exatamente a mesma coisa se a equação fosse escrita assim: (1.7) As funções podem depender de mais de uma variável. Tome o cálculo de área de um retângulo, por exemplo. Se o comprimento é denotado pela letra l (length), e a largura por w (width), então a área A e dada pela equação: (1.8) Para desenhar uma função de duas variáveis como (1.8) em um gráfico, uma terceira dimensão, z, deve ser adicionada, perpendicularmente aos outros eixos. Agora é possível desenhar A no eixo z, l no eixo x e w no eixo y. Veja a Figura 1.4. Figura 1.4: A função A = lw desenhada em três dimensões O volume de um cubo é dado por uma função de três variáveis: (1.9) Onde o h representa a altura (height) do cubo. Para desenhar isso em um gráfico você precisa adicionar um quarto eixo. Infelizmente, a menos que sob influência de compostos psicotrópicos, humanos não podem ver mais do que três dimensões. Entretanto, nós temos a habilidade de imaginar, então é isso o que você tem que fazer se quiser desenhar funções com mais de três variáveis em um gráfico. Os matemáticos parecem achar isso fácil de fazer, mas muitos programadores, incluindo eu, não! Nota O espaço que uma função n-dimensional ocupa, onde n é maior que 3, é frequêntemente chamado de hiperespaço pelos matemáticos. 1.2.1 Expoentes e Potências Uma função exponencial é definida assim: (1.10) O a é conhecido como base e o x como potência (ou expoente). Se a equação é falada, você diz que f(x) é igual a a elevado a x. Isso significa que a é multiplicado por ele mesmo x quantidade de vezes. Então se 72 é o mesmo que escrever 7x7, e 34 é o mesmo que 3x3x3x3. Um número elevado a 2 é conhecido como o quadrado do número e um número elevado a 3 é conhecido como cubo. Sendo assim, o cubo de 5 é: (1.11) A Figura 1.5 mostra a equação (1.10) desenhada em um gráfico onde a = 2. A curva mostra claramente como o valor de y cresce rapidamente com x. Este tipo de curva é frequentemente chamado de crescimento exponencial. x Figura 1.5: A função f(x) = 2 desenhada no plano xy Nota Histórica Por uma razão perdida no tempo, os matemáticos decidiram que usariam a parte final do alfabeto para representar variáveis e o resto dele para representar constantes. Esta é a razão porque os eixos no sistema de coordenadas Cartesiano são intitulados x, y e z. 1.2.2 Raízes (Radicais) A raiz quadrada de um número é o valor que multiplicado por ele mesmo resulta nesse número. As raízes quadradas são escritas usando o símbolo radical seguinte maneira: . Assim, a raiz quadrada de 4 é escrita da (1.12) Nós podemos usar esta equação também para mostrar o relacionamento entre potência e raiz: (1.13) A raiz quadrada de um número é também conhecida como a segunda raiz desse número. Nós também podemos calcular a terceira, quarta, quinta ou qualquer tamanho da raiz de um número. A terceira raiz de um número é conhecida como raiz cúbica e é escrita assim: . Note como precisamos do 3 para dizer que a raiz é a terceira. A raiz cúbica de um número da um valor que quando multiplicado pela potência de três resulta nesse número. Por exemplo: (1.14) Mais uma vez podemos mostrar nessa equação a relação entre potência e raiz: (1.15) Também é possível escrever a raiz de um número como um expoente fracional. Por exemplo, a raiz quadrada de um número pode ser escrita como , e a raiz cúbica como e assim por diante. 1.2.3 Simplificação de Equações Volta e meia, para resolver uma equação você deve primeiro simplificá-la. Um dos princípios para chegar a isso é que podemos adicionar, subtrair, dividir ou multiplicar termos de ambos os lados. (Há uma exceção a esta regra: O termo não deve ser zero quando multiplicado ou divido.) Enquanto a mesma coisa for feita em ambos os lados, então estes permanecerão iguais. Isto é mais bem compreendido com a ajuda de alguns exemplos. Exemplo 1 Considere a seguinte equação: (1.16) Essa equação pode ser simplificada pela subtração de 7 de ambos os lados. (1.17) Ela pode logo então se simplificada pela adição de 2x em ambos os lados: (1.18) Podemos então dividir ambos os lados por 5, dando a resposta para x: (1.19) Vamos passar para um exemplo ligeiramente mais complexo. Exemplo 2 Vamos dizer que queremos resolver o seguinte para y: (1.20) Primeiro de tudo podemos remover os parênteses pela multiplicação dos termos de dentro (3x 5y), pelo termo de fora (2), dando: (1.21) A seguir, seria uma boa idéia remover todos os termos fracionais pela multiplicação de todos os termos de ambos os lados pelos denominadores das frações (os denominadores são os valores embaixo da linha). Neste exemplo, a multiplicação de todos os termos de ambos os lados da equação (1.21) por 3 dá: (1.22) Até este ponto temos um termo y na esquerda e os termos x e y na direita. Precisamos transpor termos similares para que eles compartilhem o mesmo lado na equação (separar os y dos x). Neste exemplo podemos fazer isso adicionando 30y em ambos os lados. (1.23) Agora que temos os termos agrupados podemos combiná-los. Assim: (1.24) Finalmente, podemos dividir ambos os lados pelo coeficiente de uma das variáveis. Neste exemplo estamos resolvendo para y então devemos dividir ambos os lados por 33, dando: (1.25) Exemplo 3 Aqui estão algumas regras a mais que podem vir a ser úteis quando simplificamos equações: (1.26) (1.27) (1.28) (1.29) (1.30) Vamos dar uma olhada nessas novas regras em ação. Desta vez a equação para simplificar é: (1.31) Usando a regra (1.29) temos: (1.32) Pela multiplicação de ambos os lados por x para dispensar a parte fracional temos: (1.33) Agora para tirar os parêntesis da esquerda: (1.34) Para remover os parêntesis da direita usamos a regra (1.28): (1.35) Adicionando 2xy em ambos os lados, temos: (1.36) Pela subtração de x2 dos dois lados e rearranjando a para simplificar a equação: (1.37) A etapa final é tirar a raiz quadrada dos dois lados: (1.38) A simplificação de equações pode ser bem mais difícil é claro, mas estas poucas regras são o bastante para você entender qualquer simplificação apresentada neste livro. 1.3 Trigonometria A trigonometria é baseada no estudo dos triângulos. A palavra vem do grego trigon, triângulo e metria, medida. Este é um campo enormemente útil da matemática e possui muitas aplicações práticas na informática. No campo da IA para jogos, você a encontrará sendo usada em cálculos de linha de visão (LOS - line-of-sight), detecção de colisão, alguns aspectos do pathfinding, etc. Muito da IA é dependente da matemática; então será muito vantajoso você aprender isto bem. 1.3.1 Raios e segmentos de linha Um raio é uma linha com apenas uma ponta. Ele tem comprimento infinito e é definido por uma direção (usualmente expressada como um vetor normalizado; veja a seção sobre vetores mais tarde neste capítulo) e uma origem. A Figura 1.6 mostra um raio situado na origem. Figure 1.6: Um segmento de linha e um raio Um segmento de linha é a b de uma linha e é definido por duas pontas. A Figura 1.6 também mostra um segmento de linha definido por dois pontos p1 e p2. 1.3.2 Ângulos Um ângulo é definido como a medida de divergência de dois raios que compartilham a mesma origem. Veja a Figura 1.7. Figura 1.7: Um ângulo Você pode estar acostumado a pensar em ângulos em termos de graus. As paredes na maioria das casas ficam a ângulos de 90 graus uma das outras, por exemplo, e círculos possuem 360 graus de circunferência. Os matemáticos preferem medir a magnitude de um ângulo usando radianos. Radianos é uma unidade de medida baseada em um circulo de uma unidade de raio — um raio de 1 — centrado na origem. O raio de um circulo é a distância do centro do círculo até seu perímetro. Desenhando os dois raios da Figura 1.7 no mesmo diagrama com um circulo, temos a Figura 1.8. O comprimento do segmento de linha curvada entre os dois raios — mostrado no diagrama como uma linha pontilhada — é o ângulo medido em radianos entre eles. Figura 1.8: O comprimento da linha pontilhada é o ângulo em radianos entre os dois raios. Agora que você sabe o que é um radiano, vamos calcular quantos radianos têm um circulo. Você pode se lembrar da letra grega pi (π) dos seus dias de escola. Ela é bem conhecida e é frequêntemente usada como uma constante matemática de valor 3.14159 (aqui só com cinco casas decimais). Você pode usar o pi para calcular a circunferência de um circulo — a distância ao redor do perímetro inteiro — usando a equação: (1.39) Usando essa equação para determinar o perímetro um circulo de uma unidade (raio 1) nós obtemos o número de radianos de um circulo. Isso porque o número de radianos em um circulo é o comprimento do perímetro do circulo com raio 1. Então apenas substituímos 1 por r na equação (1.39) para ter: (1.40) Portanto, há 2π radianos em cada circulo. Dica Agora que você sabe quantos radianos fazem um circulo, você pode converter entre radianos e graus sempre que quiser. Há 360 graus em um circulo, isso significa que: 360° = 2 π rads Dividindo ambos os lados por 360 temos: 1° = 2 π /360 rads Os ângulos são usualmente denotados usando a letra grega theta (θ). Nota do Tradutor No Brasil é comum nas aulas de matemática (de escolas ou universidades) não usar-se o termo raio (tradução de ray) para se referir a vetores com uma posição de origem definida para não haver confusão com o raio das circunferências (tradução de radius). 1.3.3 Triângulos Um triângulo consiste em três segmentos de linha conectados em suas pontas. A soma do ângulo dos 3 cantos de cada triângulo sempre é π radianos (180 graus). A Figura 1.9 mostra os diferentes tipos de triângulos que você pode encontrar. Figura 1.9: Os diferentes tipos de triângulo • • • • • • • Um triângulo eqüilátero (equilateral) tem todos os lados de comprimento igual. Os triângulos com esta propriedade também possuem ângulos de tamanho igual; Um triângulo isosceles possui dois lados e dois ângulos de tamanho igual; Um triângulo retângulo (right-angled) possui um dos ângulos com π/2 radianos (90 graus) — um ângulo reto. O ângulo reto é sempre representado por um quadrado; Um triângulo agudo (acute) tem todos os ângulos agudos (menores que π/2 radianos); Um triângulo obtuso (obtuse) possui um ângulo obtuso (maior que π/2 radianos); Um triângulo escaleno não possui nenhum lado ou ângulo igual. Um triângulo oblíquo não possui nenhum ângulo reto. Teorema de Pitágoras Os triângulos que você usará em sua maioria são triângulos retângulos. Eles possuem muitas propriedades interessantes, das quais você pode fazer bom uso. Possivelmente a mais famosa propriedade dos triângulos retângulos foi descoberta por Pitágoras, um matemático grego que viveu de 569 a 475 AC. Ele foi um cara muito inteligente mesmo e sua mais famosa declaração é a seguinte: O quadrado da hipotenusa de um triângulo retângulo é igual a soma dos quadrados dos catetos. A hipotenusa de um triângulo é o lado mais longo, como mostrado na Figura 1.10. Figura 1.10 Nota do Tradutor No texto em inglês original o autor não usava nenhum termo que se pudesse traduzir por “cateto”, em vez disso ele chama esses lados do triângulo de “outros dois lados do triângulo” ou “lado oposto” e “lado adjacente”. Por isso de agora em diante será usada a nomeação do autor. O dicionário de inglês-inglês usado pelo tradutor é o WordWeb Pro 5.2 e ele não possui nenhuma referência a um termo em inglês equivalente a “cateto”. Se a hipotenusa é denotada por h, o teorema de Pitágoras pode ser escrito assim: (1.41) Tirando a raiz quadrada de ambos os lados, temos: (1.42) Isso significa que se soubermos o comprimento de dois lados qualquer de um triângulo retângulo, podemos facilmente encontrar o comprimento do terceiro lado. Dica Quando você trabalhar com IA para jogos você frequêntemente se encontrará usando o teorema de Pitágoras para calcular se o Agente A está mais perto de um objeto que o Agente B. Isso pode normalmente requerer duas chamadas a função de raiz quadrada, a qual, como todos devem saber, é lenta e deve ser evitada sempre que possível. Felizmente, quando comparamos os comprimentos dos lados de dois triângulos (a soma dos quadrados dos catetos somente), se os lados do triângulo A forem maiores que os lados de B, então o A sempre será maior, sejam os lados quadrados ou não. Isso significa que podemos evitar de tirar raízes quadradas somente para comparar distâncias. Isto é conhecido como trabalho no espaço da distância quadrada e é algo que você verá frequêntemente nos códigos mostrados neste livro. Um exemplo prático do Teorema de Pitágoras Vamos dizer que você tem um arqueiro na posição A (8, 4) e seu alvo na posição T (2, 1). O arqueiro pode somente disparar uma flecha a uma distância máxima de 10 unidades. Consequentemente, para determinar se ele pode atingir seu alvo, a distância até ele deve ser calculada. Isso é fácil de determinar usando-se o teorema de Pitágoras. Primeiro, os comprimentos dos lados de TP e AP mostrados na Figura 1.11 são calculados. Figure 1.11 Para encontrar a distância AP, o componente y da posição do arqueiro é subtraído do componente y da posição do alvo: (1.43) Para encontrar a distância TP, fazemos o mesmo, mas com os componentes x: (1.44) Agora que TP e AP são conhecidos, a distância do arqueiro até o alvo pode ser calculada pelo uso do teorema de Pitágoras: (1.45) Bem dentro do alcance. Deixe a flecha voar! Os Mistérios de SohCahToa Revelados Se você conhece o comprimento de um dos lados de um triângulo retângulo e um dos dois ângulos remanescentes (fora o ângulo reto), você pode determinar tudo sobre o triângulo usando trigonometria. Primeiro, olhe a Figura 1.12. Ela mostra os nomes de cada lado de um triângulo retângulo. Figura 1.12: Nomes dos lados de um triângulo O lado oposto ao ângulo é chamado de oposto (opposite) (surpresa, surpresa) e o lado que fica entre o ângulo e o ângulo reto é chamado de adjacente (adjacent). Há três funções trigonométricas que ajudam a calcular as características de um triângulo retângulo. Você provavelmente conhece elas da escola. Elas são o seno, o cosseno e o tangente, e são comumente abreviadas como sin, cos e tan (em inglês). Isto é o que elas representam: (1.46) (1.47) (1.48) Será muito útil você memorizar esses três relacionamentos porque você os usará frequêntemente. Minha professora de matemática me ensinou a memorizá-las com uma palavra mnemônica: Soh-Cah-Toa, pronunciado "sôcátua" (aí você imagina uma cacatua). Embora isso pareça esquisito, é fácil de dizer e fácil de lembrar. Nota do Tradutor A pronúncia em inglês é "sowcahtowa" (onde "sow" e "tow" rimam com "know"). O recurso mnemônico foi adaptado para o português, pois a associação de palavras com animais é tão poderosa quanto à associação com um verso como no original. Se você não entendeu a palavra ela é uma sigla para “Seno é Oposto sobre Hipotenusa, Cosseno é o Adjacente sobre a Hipotenusa e o Tangente é o Oposto sobre o Adjacente”. A melhor maneira de ver como as funções de seno, cosseno e tangente podem ser usadas é vendo alguns exemplos. Dica Quando trabalhar nos seguintes problemas com uma calculadora (na imagem a do Windows), assegure-se de trabalhar com radianos e não com graus! Dê uma olhada na Figura 1.13. Figura 1.13 Queremos calcular o comprimento do lado oposto, tendo o comprimento do lado adjacente e o ângulo. Apartir da SohCahToa podemos lembrar que o tangente de um ângulo é igual ao lado oposto sobre o adjacente. Rearranjando a equação um pouco, temos: (1.49) Então tudo o que temos de fazer é para obter o o é pegar uma calculadora (para determinar o tangente) e colocar os números, assim: (1.50) Fácil pra chuchu. Certo, vamos tentar outro, só que desta vez você tentará resolver primeiro. Calcule o comprimento do lado h mostrado na Figura 1.14 . Figura 1.14 Você conseguiu? Neste exemplo sabemos o ângulo e o lado oposto. Recordando a SohCahToa, vemos que será a função seno que devemos usar porque o seno de um ângulo é igual ao oposto sobre a hipotenusa. Rearranjando a equação temos: (1.51) E colocando os números temos: (1.52) Até aqui tudo bem. Mas como resolver o problema mostrado na Figura 1.15? Desta vez você terá que encontrar o ângulo, sabendo apenas o comprimento do adjacente e da hipotenusa. Figura 1.15 Desta vez nosso amigo é a função cosseno, mas ao colocar os números temos um problema. (1.53) Sabemos que o cosseno do ângulo é 0.769, mas qual é o ângulo? Como faremos para encontrá-lo? Bem, o ângulo é determinado usando-se o cosseno inverso. Isso é normalmente escrito como cos-1. Então, tudo o que você precisa fazer é usar o botão do cosseno inverso na calculadora (se você não tem cos-1 na sua calculadora, você terá de apertar o botão inverse antes do botão do cosseno, na calculadora do Windows é o checkbox Inv que faz isso) para obter o resultado: (1.54) Aqui terminam as lições sobre trigonometria. Entretanto, este é um assunto vasto, o teorema de Pitágoras e a SohCahToa são toda a teoria sobre trigonometria que iremos precisar no resto deste livro. 1.4 Vetores Você usará a matemática dos vetores frequêntemente quando projetar a IA para seus jogos. Os vetores em tudo, desde o cálculo em qual direção um agente do jogo poderá disparar sua arma até a expressão de entradas e saídas de uma rede neural artificial. Os vetores são seus amigos. Você deverá conhecê-los bem. Você já aprendeu que um ponto no plano Cartesiano pode ser expresso como dois números, como isto: (1.55) Um vetor 2D parece igual, abaixo temos um: (1.56) Entretanto, embora similares, um vetor representa dois valores: direção e magnitude. O lado direito da Figura 1.16 mostra o vetor (9, 6) situado na origem. Figura 1.16: Um ponto P e um vetor V Nota Os vetores são tipicamente denotados em negrito ou como uma letra com uma seta em cima como esta: . Eu usarei a notação em negrito neste livro. O rumo da seta mostra a direção do vetor e o comprimento da linha representa a magnitude deste. Certo, até aqui tudo bem. Mas o que isso significa? Qual o uso disso? Bem, para iniciantes, um vetor pode representar a velocidade de um veículo. A magnitude do vetor representa a velocidade do veiculo e a direção representa para onde o veículo está indo. Realmente é muita informação em apenas dois números (x, y). Os vetores não são restritos a duas dimensões também. Eles podem ter qualquer tamanho. Você pode usar um vetor 3D (x, y, z), por exemplo, para representar a velocidade de um veículo que se move em três dimensões, como um helicóptero. Vamos dar uma olhada em algumas coisas que você pode fazer com vetores. 1.4.1 Adição e Subtração de Vetores Imagine que você é um concorrente em um reality show de TV. Você está em uma clareira na selva. Vários outros concorrentes estão ao seu lado. Você está muito nervoso e excitado porque o prêmio do vencedor é namorar a Cameron Diaz… e os perdedores terão de assistir. O suor está correndo na sua testa, suas mão estão úmidas e você lança olhares nervosos para os outros competidores. Os passos do apresentador de TV bronzeado, com queixo de bigorna seguem enquanto ele entrega nas mãos de cada competidor um envelope com enfeites dourados. Seus passos voltam e ele ordena que você e todos os outros abram seus envelopes. A primeira pessoa a completar as instruções será o vencedor. Você freneticamente dilacera o papel. Dentro há uma nota. Ela diz: Eu estou esperando por você em um lugar secreto. Por favor, corra, está muito quente aqui. Você pode chegar a este lugar seguindo os vetores (-5, 5), (0, -10), (13, 7), (-4, 3). Cameron Com um sorriso em sua face você vê o resto dos outros competidores correr na direção do primeiro vetor. Você faz alguns cálculos atrás do envelope e então vai numa direção completamente diferente, sem nenhuma pressa. Depois de um tempo os outros competidores alcançam o esconderijo de Cameron, suando como queijo velho e arfando, eles então ouvem suas risadas nervosas e o barulho da água refrescante de um chuveiro… Você derrotou seus oponentes porque sabia como adicionar vetores. A Figura 1.17 mostra a rota que todos os outros competidores tomaram ao seguirem os vetores dados na nota de Cameron. Figura 1.17: A rota dos oponentes Você sabia, entretanto, que se adicionasse todos os vetores você obteria um simples vetor como resultado: um que o levaria diretamente ao destino final. Para adicionar vetores você simplesmente adiciona todos os valores x para obter o componente x do resultado, e o mesmo como os valores y para obter o componente y. Ao adicionar os quatro vetores na nota de Cameron temos: (1.57) Resultando no vetor (4, 5), exatamente o mesmo resultado se seguíssemos cada vetor individualmente. Veja a Figura 1.18. Figura 1.18: A sua rota 1.4.2 Multiplicação de Vetores Multiplicar vetores é moleza. Você apenas multiplica cada componente pelo valor. Por exemplo, o vetor v (4, 5) multiplicado por 2 é (8, 10). 1.4.3 Cálculo da Magnitude de um Vetor A magnitude de um vetor é seu comprimento. No exemplo anterior, a magnitude do vetor v (4, 5) é a distância do ponto inicial até o esconderijo de Cameron. Figura 1.19: A descoberta da magnitude de um vetor Isso é fácil de calcular usando o teorema de Pitágoras. (1.58) Se você tem um vetor tridimensional então você pode usar uma equação similar: (1.59) Os matemáticos colocam duas barras verticais em volta de um vetor para denotar seu comprimento. (1.60) 1.4.4 Normalização de Vetores Quando um vetor é normalizado, ele retém sua direção, mas sua magnitude é recalculada para que tenha uma unidade de comprimento (um comprimento de 1). Para fazer isso você divide cada componente do vetor pela magnitude dele. Os matemáticos escrevem uma fórmula como esta: (1.61) Entretanto, para normalizar o vetor (4, 5) você pode fazer isto: (1.62) Isso pode parecer uma coisa estranha de se fazer em um vetor de fato, mas vetores normalizados são incrivelmente úteis. Você saberá o porquê em breve. 1.4.5 Resolução de Vetores É possível se usar trigonometria para transformar um vetor em dois vetores separados, um paralelo ao eixo x e o outro ao eixo y. Dê uma olhada no vetor v, representando a velocidade aceleração de um avião caça mostrado na Figura 1.20. Figura 1.20 Para resolver v em seus componentes x/y precisamos encontrar Oa e Ob. Isto nos dará o componente da velocidade do avião que está agindo no eixo y, e o componente que está agindo no eixo x, respectivamente. Outra maneira de interpretar é que Oa é a quantidade de velocidade aceleração agindo no eixo x, e Ob é a quantidade agindo no eixo y. Primeiro, vamos calcular a quantidade de velocidade ao longo do eixo y: Oa. Apartir da trigonometria que conhecemos: (1.63) Rearranjando temos: (1.64) Para calcular Ob, esta equação é usada: (1.65) Dando: (1.66) 1.4.6 O Produto Escalar (Dot Product) O produto escalar é o ângulo entre dois vetores — algumas vezes você precisará calcular isso quando programar uma IA. Dado dois vetores 2D u e v, a equação é a seguinte: (1.67) O símbolo • denota o produto escalar (em inglês, ponto é dot). Entretanto a equação (1.67) não nos dá um ângulo. Eu prometi um ângulo, então você terá um! Aqui uma outra maneira de calcular o produto escalar: (1.68) Rearranjando temos: (1.69) Lembre que as linhas verticais em volta do vetor indicam a sua magnitude. Agora é quando você descobre um dos usos úteis da normalização de vetores. Se v e u são ambos normalizados, então a equação é simplificada enormemente: (1.70) Substituindo a equação (1.67) pelo lado direito temos: (1.71) Dando a equação para o ângulo entre vetores. Um grande uso do produto escalar é que ele pode rapidamente informar se uma entidade está atrás ou na frente do plano de face de outra. Como assim? Veja a Figura 1.21. Figura 1.21 A figura mostra um agente do jogo de face para o norte. A linha horizontal é relativa ao agente e descreve seu plano de face. Tudo que estiver na frente dessa linha pode ser dito que está na frente do agente. Usando-se o produto escalar é fácil determinar se um objeto está na frente ou atrás do agente. O produto escalar do vetor da face do agente (Facing) e o vetor do agente para o objeto, será positivo se o objeto está na frente do plano de face do agente e negativo se estiver atrás. 1.4.7 Um exemplo prático da matemática dos vetores Aqui está um exemplo com alguns dos métodos para vetores que você aprendeu. Vamos dizer que você tem um agente de jogo, Eric o Troll, que está na posição T (a origem) e de face para a direção dada pelo vetor normalizado H (para heading, direção em inglês). Ele pode farejar uma princesa desamparada na posição P e gostaria muito de bater com sua clava nela, para amaciá-la um pouco, antes de parti-la em pedaços. Para fazer isso, ele precisa saber quantos radianos ele deve rotacionar para ficar de face para ela. A Figura 1.22 mostra a situação. Figura 1.22 Você descobriu que pode calcular o ângulo entre dois vetores usando o produto escalar. Entretanto, neste problema você tem somente um vetor para começar, H. Precisamos determinar o vetor — o vetor que aponta diretamente para a princesa. Isso é calculado pela subtração do ponto T do ponto P. Porque T é a origem (0, 0), neste exemplo P-T = P. Assim, a resposta de P-T é um vetor, então vamos mostrar isso digitando em negrito e chamando de P. Sabemos que o cosseno do ângulo que o troll precisa girar para ficar de face para a princesa é equivalente ao produto escalar de H e P, providenciando ambos os vetores normalizados. O H já está normalizado, então apenas precisamos normalizar o P. Lembre que para normalizar um vetor, seus componentes são divididos pela sua magnitude. Consequentemente, a normal de P (NP) é: (1.72) O produto escalar pode agora ser usado para determinar o ângulo. (1.73) Então: (1.74) Para clarear o processo, vamos fazer a coisa toda de novo, mas com alguns números. Vamos dizer que o troll está situado na origem T (0, 0) e está de face para H (1, 0). A princesa está no ponto P (4, 5). Quantos radianos o troll tem que girar para ficar de face com a princesa? Sabemos que podemos usar a equação (1.74) para calcular o ângulo, mas primeiro temos que determinar o vetor TP, entre o troll e a princesa e normalizá-lo. Para obter TP subtraímos T de P, resultando no vetor (4, 5). Para normalizar TP dividimos seus componentes pela a magnitude. Este cálculo foi mostrado anteriormente na equação (1.62), resultando em NTP (0.62, 0.78). Finalmente colocamos os números na equação (1.74), substituindo a equação (1.71) pelo produto escalar. θ = cos-1 (NTP •H) θ = cos-1 ((0.62×1) + (0.78×0)) θ = cos-1 (0.62) θ = 0.902 radianos 1.4.8 O Struct Vector2D Todos os exemplos fornecidos neste livro usam o struct Vector2D. Ele é muito claro e implementa todas as operações de vetor discutidas. Eu listei a maioria das declarações aqui para que você possa se familiarizar com elas. struct Vector2D { double x; double y; Vector2D():x(0.0),y(0.0){} Vector2D(double a, double b):x(a),y(b){} //ajusta x e y para zero inline void Zero(); //retorna true e tanto x quanto y são zero inline bool isZero()const; //retorna o comprimento (magnitude) do vetor inline double Length()const; //retorna o comprimento quadrado do vetor (evitando o sqrt) inline double LengthSq()const; inline void Normalize(); //retorna o produto escalar deste vetor e de v2 inline double Dot(const Vector2D& v2)const; /*retorna positivo se v2 está no sentido horário deste vetor e negativo se anti-horário (assumindo que o eixo Y está apontando para baixo e X para a direita como numa janela de uma aplicação)*/ inline int Sign(const Vector2D& v2)const; //retorna o vetor perpendicular a este inline Vector2D Perp()const; /*ajusta x e y para que o comprimento do vetor não exceda max*/ inline void Truncate(double max); /*retorna a distância entre este vetor e um passado como parâmetro*/ inline double Distance(const Vector2D &v2)const; //versão quadrada da função acima inline double DistanceSq(const Vector2D &v2)const; //retorna o vetor que reverte este vetor inline Vector2D GetReverse()const; //precisamos de alguns operadores const Vector2D& operator+=(const Vector2D &rhs); const Vector2D& operator-=(const Vector2D &rhs); const Vector2D& operator*=(const double& rhs); const Vector2D& operator/=(const double& rhs; bool operator==(const Vector2D& rhs)const; bool operator!=(const Vector2D& rhs)const; }; 1.5 Espaço Local e Espaço do Mundo É importante que você entenda a diferença entre espaço local (local space) e espaço do mundo (world space). A representação do espaço do mundo é normalmente a que você vê renderizada na sua tela. Cada objeto é definido por uma posição e uma orientação relativa a origem do sistema de coordenadas do mundo (veja a Figura 1.23). Um soldado usa o espaço do mundo quando descreve a posição de um tanque de guerra em uma grade de referência, por exemplo. Figura 1.23: Alguns obstáculos e um veículo mostrado no espaço do mundo O espaço local, entretanto, descreve a posição e a orientação de objetos em relação a um sistema de coordenadas local de uma entidade em específico. Em duas dimensões, um sistema de coordenadas local de uma entidade pode ser definido pelo vetor da frente e pelo vetor do lado (representando os eixos locais x e y, respectivamente), com a origem posicionada no centro da entidade (para três dimensões um vetor adicional que descreve a parte de cima é necessário). A Figura 1.24 mostra os eixos descrevendo o sistema de coordenadas local de um veículo em forma de ponta de flecha. Figura 1.24: O sistema de coordenadas local de um veículo Usando este sistema de coordenadas local podemos transformar o mundo para que todos os objetos descrevam suas posições e orientações em relação a ele (veja a Figura 1.25). Isto é apenas como se visualizar o mundo através dos olhos da entidade. Os soldados usam o espaço local quando dizem coisas como "Alvo a 50m às 10 horas." Eles estão descrevendo a localização do alvo em relação a suas próprias posições e direções. Figura 1.25: Objetos transformados no espaço local do veículo Esta habilidade de transformar objetos entre o espaço local e do mundo pode ajudar a simplificar muitos cálculos como você verá mais tarde neste livro. (Entretanto você precisa entender o conceito, que está além do escopo deste livro — procure pelo capítulo sobre transformações de matrizes em um livro de computação gráfica). 2. Física Meu dicionário define a ciência da física como: A ciência da matéria, da energia e das interações entre as duas. Como um programador de IA para jogos você frequentemente trabalhará com as leis da física e especialmente uma concerne no movimento, a qual será coberta nesta seção. Você frequentemente se encontrará criando algoritmos para predizer onde um objeto ou agente estará no futuro, para calcular qual é o melhor ângulo para disparar uma arma ou para qual direção e com qual força um agente deverá chutar uma bola para passá-la a um receptor. Isto não é IA por si é claro, mas ela é toda a parte de criar a ilusão de inteligência e é normalmente parte do trabalho do programador de IA, então você precisa saber como isto funciona. Vamos dar uma olhada em alguns conceitos fundamentais usados na física. 2.1 Tempo O tempo é uma quantidade escalar (completamente especificado por sua magnitude e sem direção) medida em segundos, abreviado por s. Até um tempo atrás, um segundo era definido em termos do giro rotacional da Terra, mas como a rotação da Terra está diminuindo lentamente a cada ano, nos últimos 60 anos tornou-se um problema para cientistas que necessitavam de medidas cada vez mais precisas para seus experimentos. Hoje, entretanto, um segundo é medido como: A duração de 9.192.631.770 períodos de radiação correspondentes a transição entre os dois níveis hiperfinos do átomo de césio 133 em seu estado de mais baixa energia. Esta definição provê aos cientistas hoje um intervalo de tempo constante que eles necessitam para seus experimentos precisos. O tempo em jogos de computadores é medido em uma das duas maneiras: usando segundos (como no mundo real) ou usando o intervalo de tempo entre as atualizações, como uma espécie de segundo virtual. A última medida pode simplificar muitas equações, mas você deve ficar atento, isso porque, a menos que a taxa de atualização seja fixa, a física será diferente entre máquinas de velocidades diferentes! Entretanto, se você usar um segundo virtual, assegure-se que a frequência de atualização da física do seu jogo seja fixa em uma taxa razoável — em geral a taxa da máquina mais lenta para a qual você está desenvolvendo. Nota Não são todos os jogos de computador que usam taxas de atualização fixas e com cada componente — renderização, física, IA, etc. — sendo atualizados na mesma frequência. Muitos dos sofisticados jogos modernos, entretanto, especificam uma taxa única para cada componente. Por exemplo, a física pode ser atualizada a cada 30 vezes por segundo, a IA 10 vezes por segundo e a renderização pode se permitir que faça o mais rápido que a máquina puder. Sendo assim, eu nunca me referirei a uma "taxa de atualização" no texto, se eu não especificar um contexto, ele será o contexto do assunto sobre o qual eu estou falando. 2.2 Distância A unidade padrão de distância — uma quantidade escalar — é o metro, abreviado com m. 2.3 Massa A massa é uma quantidade escalar medida em quilogramas, abreviado com kg. A massa é a medida de quantidade de alguma coisa. Esta pode ser uma qualidade confusa de medir já que a massa de um objeto é calculada pelo peso dele, ainda que a massa não seja uma unidade de peso; ela é uma unidade de matéria. O peso de um objeto é a medida de quanta força gravitacional é exercida nesse objeto. Por causa da gravidade variar de lugar para lugar (inclusive aqui na Terra), isso significa que o peso de um objeto pode variar em diferentes lugares, entretanto a massa nunca mudará. Então como a massa pode ser medida de forma precisa? Os cientistas resolveram este problema criando um cilindro de liga platina-irídio que todos aceitaram chamar de O quilograma. Este cilindro é mantido em Paris e todas as medidas são feitas em relação a ele. Em outras palavras, você pode ir à França e fazer sua própria duplicata do quilograma, a qual pesará exatamente o mesmo que O quilograma. Agora que você sabe que esteja onde esteja, não interessando qual a gravidade, sua duplicata terá exatamente a mesma massa DO quilograma que está na França. Problema resolvido. 2.4 Posição Você pode pensar que a posição de um objeto é uma propriedade fácil de medir, mas de onde exatamente você fará sua medida de posição? Por exemplo, se você quiser especificar a posição do seu corpo no espaço, da onde você tomaria a medida? Poderia ser do seu pé, do seu estômago, ou da sua cabeça? Isto apresenta um problema porque pode haver uma grande discrepância entre a posição da sua cabeça e do seu pé. Os físicos resolveram este problema tomando o centro de massa de objeto como sua posição. O centro de massa de um objeto é o ponto de equilíbrio. Este é o lugar onde você pode amarrar um pedaço imaginário de corda no objeto e pode balançar em qualquer posição. Outra maneira de imaginar o centro de massa é que ele é a média da localização de toda a massa em um corpo. 2.5 Velocidade A velocidade é uma quantidade vetorial (um quantidade que tem magnitude e direção) que expressa a taxa de mudança de distância sobre o tempo. A unidade padrão de medida da velocidade é o metro por segundo, abreviado por m/s. Isto pode ser expresso matematicamente como: (1.75) A letra grega maiúscula, lida como delta, é usada na matemática para denotar uma mudança de quantidade. Assim, ∆t na equação (1.75) representa uma mudança no tempo (um intervalo de tempo) e ∆x uma mudança na distância (um deslocamento). O ∆ é calculado como a quantidade posterior menos a quantidade anterior. Assim, se a posição de um objeto em t = 0 é 2 (antes) e em = 1 é 5 (depois), ∆x é 5 2 = 3. Isto também pode resultar em valores negativos. Por exemplo, se a posição de um objeto no t = 0 é 7 (antes) e em t = 1 é 3 (depois), ∆x é 3 - 7 = -4. Nota O irmão menor do delta, o delta minúsculo, escrito como δ, é usado para representar pequenas mudanças. Você pode frequentemente o ver sendo usado em cálculos. Por causa do δ parecer a letra d, para prevenir confusão, os matemáticos tendem a evitar usar o d para representar distância ou deslocamento em suas equações. Em vez disso, um símbolo menos ambíguo como ∆x é usado. Usando a equação (1.75), é fácil calcular a velocidade média de um objeto. Vamos dizer que você precisa da velocidade média de uma bola que rola entre dois pontos. Primeiro calcule o deslocamento entre os dois pontos, e então o divida pela quantidade de tempo levado pela bola para cobrir essa distância. Por exemplo, se a distância entre os pontos é 5 m e o tempo levado pela bola para se deslocar de um ponto ao outro é 2 s, então a velocidade é: (1.76) É também possível calcular que distância um objeto se deslocou se sabemos a velocidade média e o tempo que o deslocamento demorou. Vamos dizer que você está dirigindo seu carro a 35 mph e gostaria de saber que distância percorreu na última meia hora. Rearranjando a equação (1.75) temos: (1.77) Colocando os números temos: (1.78) Relacionando isto a jogos de computador, se você tem um veículo na posição P no tempo t viajando na velocidade constante V, podemos calcular sua posição na próxima etapa da atualização (no tempo t + 1) através de: (1.79) Onde V∆t representa o deslocamento entre as etapas de atualização (da equação (1.77)). Vamos tornar isto mais claro pela demonstração de um código de exemplo. A seguir um trecho de código para uma classe Vehicle que encapsula o movimento de um veículo viajando com velocidade constante. class Vehicle { //um vetor representando a posição no espaço vector m_vPosition; //um vetor representando a velocidade vector m_vVelocity; public: //chamado a cada frame para atualizar a posição do veículo void Update(float TimeElapsedSinceLastUpdate) { m_vPosition += m_vVelocity * TimeElapsedSinceLastUpdate; } }; Note que seu jogo uma taxa de atualização fixa para a física, como muito dos exemplos deste livro, ∆t será constante e pode ser eliminado da equação. Isso resulta em um método Update simplificado como se segue: //atualiza a simulação usando uma atualização constante void Vehicle::Update() { m_vPosition += m_vVelocity; } Porém lembre-se, que se você escolher eliminar o ∆t como mostrado, a unidade de tempo que você usará em quaisquer cálculos não será mais o segundo, mas o intervalo de tempo entre as etapas de atualização. 2.6 Aceleração A aceleração é uma quantidade vetorial que expressa a taxa de mudança de velocidade sobre o tempo e é medida em metros por segundo por segundo, escrito como m/s2. A aceleração pode ser expressa matematicamente como: (1.80) Essa equação declara que a aceleração é equivalente a mudança de velocidade de um objeto dividida pelo intervalo de tempo que levou para essa mudança de velocidade ocorrer. Por exemplo, se um carro começa do repouso e acelera em 2 m/s2, então a cada segundo, são adicionados 2 m/s em sua velocidade. Veja a Tabela 1.1. Tabela 1.1 Tempo(s) Velocidade(m/s) 0 0 1 2 2 4 3 6 4 8 5 10 Desenhando estes dados como velocidade versus tempo em um gráfico, temos a Figura 1.26. Se examinarmos um intervalo de tempo, digamos o intervalo entre t = 1 e t = 4, podemos ver que a inclinação, dada por , é equivalente a aceleração durante o intervalo. Figura 1.26: A velocidade do carro desenhada contra o tempo Você aprendeu mais cedo como a equação y = mx + c define todas as linhas retas em um plano Cartesiano 2D, onde m é a inclinação e c a interseção no eixo y. Por causa do que podemos ver na Figura 1.26, a aceleração constante é sempre desenhada como uma linha reta, então podemos usar essa a para a aceleração de um carro. Sabemos que o eixo y representa a velocidade v, e o eixo x representa o tempo t. Também sabemos que a inclinação m relata a aceleração. Assim a equação fica: (1.81) A constante u representa a velocidade de um carro no tempo t = 0, a qual pode ser vista como a intersecção da linha no eixo y. Por exemplo, se o carro no exemplo começa com a velocidade de 3 m/s, então o gráfico pode ser idêntico mas com um deslocamento para cima de 3 como mostrado na Figura 1.27. Figura 1.27: O mesmo carro, mas andando com uma velocidade inicial de 3 m/s no tempo t =0 Para testar a equação vamos determinar que a velocidade inicial do carro é 3 m/s e ele acelera em 2 m/s durante 3 segundos. Colocando os números na equação (1.81) temos: 2 (1.82) Isso é exatamente o que podemos ver no gráfico. Veja a Figura 1.28. Figura 1.28 Outra coisa interessante sobre um gráfico velocidade-tempo, é que a área no gráfico entre os dois tempos é equivalente a distância percorrida pelo objeto durante esse tempo. Vamos primeiro olhar um simples exemplo. A Figura 1.29 mostra um gráfico de tempo versus velocidade para um veículo que anda durante 2 segundos a 4 m/s e pára. Figura 1.29 A área no gráfico (a região cinza) é dada pela altura × largura, a qual é equivalente a velocidade × tempo, o que como você pode ver resulta em 8 metros. Este é o mesmo resultado de usarmos a equação ∆x = v∆t. A Figura 1.30 mostra o exemplo anterior onde o veículo acelera do repouso com uma aceleração constante de 2 m/s2. Vamos dizer que queremos calcular a distância percorrida entre os tempos t = 1 e t =3. Figura 1.30 Sabemos que a distância percorrida entre t = 1 e t = 3 é a área no gráfico entre esses tempos. Como é claramente mostrado na figura, a área é a soma das áreas do retângulo A e do triângulo B. A área de A é dada pelo tempo de deslocamento t, multiplicado pela velocidade inicial u, o que se escreve como: (1.83) A área de B, um triângulo, é metade da área do retângulo descrito pelos lados do triângulo. Os lados do triângulo são dados pelo tempo de deslocamento t, e a diferença entre a velocidade final e a velocidade inicial v - u. Isso pode ser escrito como: (1.84) Entretanto, a área total sob o gráfico entre os tempos t = 1 e t =3, a qual é equivalente a distância percorrida, é a somo desses dois termos, sendo assim: (1.85) Sabemos que v - u é equivalente a mudança de velocidade v, e que apartir da equação (1.80): (1.86) Este valor de v - u pode ser substituído na equação (1.85), resultando na equação que nos dá a distância apartir do tempo e da aceleração. (1.87) Colocando os números na equação temos: (1.88) Podemos também fazer outra coisa útil com essa equação: Podemos tirar o fator tempo fora para obter uma equação que usa apenas a velocidade e a distância percorrida. Apartir da equação (1.81) sabemos que: (1.89) Podemos substituir este valor pelo ∆t na equação (1.87), o que nos dá: (1.90) Essa equação horrível pode ser simplificada enormemente. (Se você é novato em álgebra, eu sugiro que tente simplificar você mesmo. Se tiver dificuldades, a simplificação inteira é explicada no fim do capítulo). (1.91) Essa equação é extremamente útil. Por exemplo, podemos usá-la para determinar a velocidade final de uma bola que é solta de cima do prédio Empire State (assumindo que não há nenhuma resistência do ar). A aceleração da queda de um objeto é a força exercida pelo campo gravitacional da Terra e é equivalente a aproximadamente 9.8 m/s2. A velocidade inicial da bola é 0 e a altura do prédio Empire State é 381 m. Colocando esses valores na equação temos: (1.92) As equações anteriores são verdadeiras para todos os objetos que se movimentam com aceleração constante, mas é claro que é possível também que os objetos se movimentem com acelerações variadas. Por exemplo, um avião decolando tem uma alta aceleração no início (a qual você pode sentir como uma força o empurrando para trás do seu banco), então esta decresce quando os limites da potência do motor são atingidos. Este tipo de aceleração parece com o que é mostrado na Figura 1.31. Figura 1.31: Um avião acelerando durante a decolagem Como outro exemplo, a Figura 1.32 mostra um gráfico de velocidade versus tempo para um carro que acelera até 30 km/h, freia bruscamente para evitar atropelar um cachorro desgarrado e então acelera de novo até 30 km/h. Figura 1.32 Quando você tem acelerações variadas como essas, somente é possível determinar a aceleração em um tempo em específico. Isso é obtido ao se calcular a inclinação de uma tangente à curva em um ponto. 2.7 Força De acordo com Isaac Newton: Uma força é uma ação exercida sobre um corpo para que este mude de estado, seja para o repouso, ou para um movimento uniforme em linha reta. Entretanto, a força é a qualidade que pode alterar a velocidade de um objeto ou a linha de movimento. A força não tem nada a ver com o movimento. Por exemplo, uma flecha voando não precisa de uma força constante sendo aplicada nela para que se mantenha voando (como pensava Aristóteles). A força está presente onde as mudanças de movimento ocorrem, como quando a flecha é parada ou quando um carro drag racer acelera ao longo da pista. A unidade de força é o Newton, abreviado por N, e é definido como: A força requerida para fazer uma massa de um quilograma mover-se do repouso até a velocidade de um metro por segundo em um segundo. Há dois tipos diferentes de força: forças com contato e sem contato. Forças com contato ocorrem entre objetos que estão se tocando, como a força friccional presente entre a neve e os esquis de um esquiador. Forças sem contato são as que ocorrem entre objetos que não estão se tocando um ao outro, como a força gravitacional da Terra sobre seu corpo ou a força magnética da Terra sobre a agulha de uma bússola. É importante notar que muitas forças podem agir sobre um simples objeto simultaneamente. Se a soma dessas forças for igual a zero, o objeto permanece em movimento com a mesma velocidade e na mesma direção. Em outras palavras, se um objeto está parado ou se movendo em linha reta com velocidade constante, a soma de todas as forças agindo nele deve ser zero. Se, entretanto, a soma das forças não é igual a zero, o objeto agirá na direção da força resultante. Isso pode ser confuso, especialmente em relação a objetos estacionários. Por exemplo, como pode haver quaisquer forças agindo sobre uma maçã em cima de uma mesa? Além de tudo, ela não está se movendo! A resposta é que há duas forças agindo sobre a maçã: a força da gravidade tentando puxar a maçã em direção a Terra e uma força igual e oposta da mesa empurrando a maçã para fora da Terra. Isso é o porquê da maçã permanecer sem movimento. A Figura 1.33 mostra exemplos de varias quantidades de forças agindo sobre objetos do cotidiano. Figura 1.33: da esquerda para direita e de cima para baixo — uma maçã caindo, uma maçã em repouso numa mesa, uma bola rolando sobre uma mesa inclinada e um barco a vela na água. Sabemos que se a soma das forças agindo sobre um objeto não é zero, uma aceleração será adicionada na direção da força; mas quanto de aceleração? A resposta é que a quantidade de aceleração a, é proporcional a massa do objeto m e a força total aplicada F. Esse relacionamento é dado pela equação: (1.93) Porém mais comumente, você verá esta equação escrita como: (1.94) Usando esta equação, se sabemos o quão rápido um objeto está acelerando e a sua massa, então podemos calcular o total de força agindo nele. Por exemplo, se o barco na Figura 1.33 tem massa de 2000 kg e está acelerando a uma taxa de 1.5 m/s2, a força total agindo nele é: Ftotal = 2000 × 1.5 = 3000 N Usando-se as equações de força, aceleração, velocidade e posição, se sabemos quanta força está agindo em um objeto, podemos determinar a aceleração e então atualizar a posição e a velocidade desse objeto de acordo. Por exemplo, vamos dizer que você tem uma classe de uma espaçonave com atributos para massa, velocidade atual e posição atual. Como esta: class SpaceShip { private: vector m_Position; vector m_Velocity; float m_fMass; public: … }; Informando o intervalo de tempo desde a ultima atualização e a força aplicada, podemos criar um método que atualize a posição e a velocidade da nave. Aqui como: void SpaceShip::Update(float TimeElapsedSinceLastUpdate, float ForceOnShip) { float acceleration = ForceOnShip / m_fMass; Primeiro de tudo, calculamos a aceleração apartir da força usando a equação (1.93). m_Velocity += acceleration * TimeElapsedSinceLastUpdate; Depois, atualizamos a velocidade a partir da aceleração usando a equação (1.80). m_vPosition += m_Velocity * TimeElapsedSinceLastUpdate; } E finalmente, a posição pode ser atualizada com a velocidade atualizada usando a equação (1.77). 3. Conclusão Este capítulo cobriu muito chão. Se muito destas coisas é nova para você, você se sentirá um pouco confuso e até um pouco intimidado. Mas não se espante. Quando você vai lendo o livro, você verá como cada princípio é aplicado a um problema prático. Quando você vê uma teoria no contexto do mundo real, fica muito mais fácil entender. 3.1 Simplificação da Equação (1.90) Deixe-me mostrar como essa equação horrível é simplificada. Aqui, novamente em toda a sua glória. Primeiro, vamos trabalhar o termo mais a direita. Apartir da regra mostrada na equação (1.29) podemos mudar a equação: Podemos agora dar uma pequena limpada no a: Vamos agora tirar os parêntesis no termo (v - u)2 usando a regra dada na equação (1.28). Vamos remover os outros parêntesis também. Agora vamos tirar as partes fracionais multiplicando cada termo por 2a: Quase pronto! Só precisamos agrupar os termos semelhantes. 2a∆x = v2 - u2 E rearranjar a equação final. v2 = u2 2a∆x