Conteúdo principal
Curso: Programação > Unidade 5
Lição 4: Vetores- Introdução aos vetores
- Mais matemática de vetores
- Magnitude e normalização de vetores
- Movimento de vetores
- Funções estáticas vs. métodos de instância
- Movimento interativo de vetor
- Desafio: Rastreador de mouse
- Projeto: Criaturas computacionais
© 2024 Khan AcademyTermos de usoPolítica de privacidadeAviso de cookies
Magnitude e normalização de vetores
Multiplicação e divisão, como vimos, são meios pelos quais o comprimento do vetor pode ser alterado sem afetar a direção. Talvez você esteja se perguntando: "ok, então como eu sei qual o comprimento de um vetor? Sei as componentes (
x
e y
), mas qual o comprimento (em pixels) da seta de fato? Entender como calcular o comprimento (também conhecido como magnitude) de um vetor é incrivelmente útil e importante.Note no diagrama acima como o vetor, representado por uma seta e duas componentes (
x
e y
), cria um triângulo retângulo. Os lados são as componentes e a hipotenusa é a seta propriamente. Tivemos a sorte de obter este triângulo, pois em tempos antigos, um matemático Grego chamado Pitágoras desenvolveu uma amável fórmula para descrever a relação entre os lados (catetos) e a hipotenusa de um triângulo retângulo.O teorema de Pitágoras é ao quadrado, mais ao quadrado é igual a ao quadrado.
Com essa fórmula, agora podemos calcular a magnitude de como se segue:
Portanto, o código para implementação no objeto
PVector
seria:PVector.prototype.mag = funcao() {
return sqrt(este.x*este.x + este.y*este.y);
};
O exemplo a seguir visualiza a magnitude de um vetor com uma barra na parte superior:
Calcular a magnitude de um vetor é apenas o começo. A função de magnitude abre portas a inúmeras possibilidades; a primeira das quais é a normalização. Normalizar consiste no processo de fazer algo "padrão", ou, melhor, "normal". No caso dos vetores, assumiremos por ora que um vetor padrão possui o comprimento de 1. Para normalizar um vetor, portanto, tomamos um vetor de um comprimento qualquer e, mantendo-o apontado à mesma direção, mudamos seu comprimento a 1, tornando-o o que se define como vetor unitário.
Contanto que descreva a direção de um vetor sem levar o seu comprimento em consideração, é útil ter o vetor unitário prontamente acessível. Veremos como isto pode ser uma mão na roda assim que começarmos a trabalhar com forças na próxima seção.
Para qualquer dado vetor , seu vetor unitário (representado por ) é calculado como se segue:
Em outras palavras, para normalizar um vetor, simplesmente dividimos cada uma de suas componentes pela sua magnitude. Isto é bastante intuitivo. Digamos que um vetor possui comprimento 5. Bem, 5 sobre 5 é 1. Então, olhando o nosso triângulo retângulo. teríamos que escalar a hipotenusa, dividindo-a por 5 da mesma forma.
Assim, no objeto PVector, precisamos escrever nossa função de normalização assim:
PVector.prototype.normalize = funcao() {
var m = este.mag();
este.div(m);
};
Certamente há um pequeno problema. E se a magnitude do vetor é 0? Não podemos dividir por 0! Uma verificação de erros rápida pode consertar isto:
PVector.prototype.normalize = funca0() {
var m = este.mag();
if (m > 0) {
este.div(m);
}
};
Eis um programa no qual sempre normalizamos o vetor que representa a posição do mouse à partir do centro (e então a multiplica para que possamos vê-la, já que 1 pixel é bem pequeno!):
Este curso "Natural Simulations" é um derivado do "The Nature of Code" por Daniel Shiffman, usado sob a Creative Commons Attribution-NonCommercial 3.0 Unported License.
Quer participar da conversa?
- Aqui está meu código, para quem está com dificuldades:
mouseMoved = function() {
background(255, 255, 255);
var mouse = new PVector(mouseX, mouseY);
var m = mouse.mag();
var d = dist(0, 0, width, height);
var cor = map(m, 0, d, 0, 255);
println('D: '+d+" - M: "+m);
stroke(255, 0, 0);
strokeWeight(3);
background(cor, cor, cor);
line(0, 0, mouse.x, mouse.y);
fill(0);
text(m, mouse.x, mouse.y);
};(1 voto)