Escrito por Luca Dantas e Pedro Racchetti
Tendo como base as definições e operações simples com pontos e vetores, nessa aula iremos conhecer novas operações entre vetores e aprender como aplicá-las no contexto da informática.
Definições
Produto Escalar - Dot Product
O Dot Product de dois vetores é uma operação, associada a multiplicação, resultando em um escalar, ou seja, um número e é denotada por um ponto (por isso seu nome) como . Geometricamente, essa operação pode ser interpretada como o tamanho da projeção do vetor , na reta formada pelo vetor , multiplicada pelo módulo de . Como mostra a figura 1, podemos calcular a projeção como , onde é o ângulo entre os dois vetores, dessa forma, o dot product é .
Esse modo de calcular o dot product, mesmo que correto, não é ótimo para a informática, já que depende do ângulo entre os dois vetores, que nem sempre é fornecido, e não se aplica muito bem para dimensões maiores. É possível se provar então, que o dot product é equivalente ao somatório do produto entre os valores das componentes de cada dimensão dos vetores, por exemplo, para 2 vetores: . Essa equivalência pode ser demonstrada a partir da lei dos cossenos, porém foge do escopo dessa aula*.
Propriedades e aplicações diretas de Dot Product
- O dot product é comutativo, ou seja, a ordem em que operamos os vetores não importa.
- Sempre escolheremos o menor ângulo, que será do intervalo radianos. Nesse intervalo, a função coseno é injetora, ou seja, cada valor de assume um valor único de imagem. Portanto, podemos usar as duas fórmulas para se calcular o ângulo entre dois vetores.
- Se fizermos o dot product de um vetor com ele mesmo, ou seja , teremos
Produto Vetorial - Cross Product
O Cross Product de dois vetores é uma operação também associada a multiplicação, porém, diferentemente do dot, ela resulta em um outro vetor e é denotada pela cruz de multiplicação como . O vetor resultante terá direção perpendicular aos dois vetores, e seu sentido dependerá das posições relativas entre eles. Seu módulo será igual a área do paralelogramo com arestas nos dois vetores, podendo ser calculada como . Note que isso equivale ao dobro da área do triangulo formado pelos pontos finais desses vetores e a origem, e esse valor pode ser calculada pelo seguinte determinante:
Note que essa é uma área que pode ser negativo, indicando que os pontos não estão em ordem anti-horária, e portanto o vetor está a direita de . Além disso, podemos observar então que: , que é mais cômodo para se trabalhar.
Propriedades e aplicações diretas do Cross Product
- O cross product não é comutativo, já que, como observamos, depende das posições relativas entre os vetores
- Uma regra prática para se determinar se o cross é positivo ou negativo chama-se "regra da mão direita". Se você apontar o indicador para , e o dedo médio para , o seu polegar estará no sentido de , como mostra a figura 2.
- Se o cross de dois vetores for positivo, como podemos ver na figura, o segundo estará à esquerda do primeiro, e caso contrário, a direita.
Clique aqui para conferir uma demonstração da equivalência.
Visualização no círculo trigonométrico e implicações da definição geométrica
O poder dos produtos escalar e vetorial mora na dualidade entre representação algébrica e geométrica, pois nós podemos calcular um valor com operações aritméticas básicas usando a definição algébrica e extrair dele informações sobre a disposição dos vetores no plano usando consequências da definição geométrica dessas operações. Logo ao analisar as propriedades obtidas vamos sempre pensar na definição geométrica e como ela explica o resultado obtido.
Iremos representar os vetores no círculo trigonométrico pois é um ambiente mais simples de observar e analisar as implicações.
Imagine que estamos realizando a operação , onde pode representar tanto o produto vetorial como o escalar. Iremos representar como um vetor saindo do centro do círculo trigonométrico e com direção horizontal com sentido para a direita. Já se representará exatamente a graus no sentido anti-horário saindo de , onde é o ângulo formado entre e no plano original.
Note que essa definição de como sendo paralelo ao eixo mantém a generalidade pois, como ambas operações (dot e cross) dependem somente do módulo dos vetores e do ângulo entre eles, podemos rotacionar ambos vetores de modo que o ângulo entre eles se permança inalterado e o vetor fique paralelo ao eixo e o valor da operação se manterá constante.
Iremos representar ambos vetores com módulo pois nesse momento somente temos interesse nas implicações do ângulo entre os vetores, e desse modo o módulo deles não afetará as observações e assim será mais fácil de visualizar, porém as observações que serão extraídas também valem para vetores com qualquer valor de módulo. A imagem a seguir mostra esse desenho no plano:
Produto Vetorial - associado ao
- Comutatividade: Podemos perceber que, se representarmos nesse modelo a operação teremos um desenho semelhante, porém com o ângulo entre os vetores no sentido horário como , portanto pela propriedade dos cossenos de que temos que , logo . Segue uma imagem dessa situação para melhor entendimento.
- Podemos verificar facilmente com o produto escalar se dois vetores são perpendiculares, e isso vem diretamente do fato de que .
- Também podemos verficar se o ângulo entre dois vetores é menor ou maior que , extraindo essa informação do sinal do produto escalar, visto que tal que , e tal que (Lembre-se que sempre consideramos no intervalo , visto que .
Produto Vetorial - associado ao
- Podemos analisar de maneira semelhante o produto vetorial e assim é facil de perceber a não comutatividade dessa operação, já que diferentemente do cosseno, , e ainda podemos extrair um pouco mais de informação e perceber que na realidade , logo .
- Também podemos utilizar essa operação para saber se dois vetores são colineares, que acontece quando o resultado do produto vetorial é 0, pois .
- Também podemos utilizar essa visualização para ter um melhor intuição sobre a regra da mão direita apresentada anteriormente, pois só precisamos lembrar que o ângulo é definido no sentido anti-horário partindo do primeiro vetor da operação, logo se , podemos extrair que , logo está no sentido anti-horário em relação a . Similiarmente se , podemos extrair que , logo está no sentido horário em relação a .
Implementação
Aqui apresentaremos um struct em C++ que trará as operações apresentadas anteriormente para facilitar a implementação. Note, porém, que todas estas operações podem ser realizadas sem uso de struct, utilizando apenas o tipo pair; optamos por utilizar o struct para simplificar implementações posteriores.
Aplicações
Existem diversas aplicações na geometria computacional dessas operações com vetores e agora abordaremos algumas delas.
Checar se 3 pontos são colineares
Lembre-se que na discussão das implicações geométricas do produto vetorial nos dissemos que poderíamos checar se dois vetores são colineares, porém nesse caso não temos 2 vetores e sim 3 pontos, logo não podemos aplicar a operação diretamente. Precisamos conseguir descrever os 3 pontos com 2 vetores para checar a colinearidade desses vetores usando o produto vetorial.
Uma possível ideia é escolher qualquer um dos pontos e tomá-lo como a origem do sistema de coordenadas, e a partir dele traçar vetores saindo para os outros 2 pontos. É possível perceber que com essa construção os vetores formados sempre nos darão a informação sobre colinearidade que nos interessa, e a demonstração consiste na análise de diferentes casos e foge ao escopo dessa aula. Segue a imagem de um caso dessa construção.
Segue a implementação desse ideia. Usaremos o struct apresentado anteriomente, utilizando as funções de cross e de subtração de vetores.
Checar em que lado de uma reta um ponto se encontra
De modo similar ao que fizemos anteriormente devemos representar esse sistema com 2 vetores, e esses vetores podem ser formados escolhendo 2 pontos da reta para representá-la e junto ao ponto dado recentrar o sistema em algum dos pontos, porém nesse caso é necessário escolhermos o primeiro ponto na reta (o mais à esquerda, e se for uma reta vertical o mais em baixo) como centro do sistema. Agora basta verificar o sinal do valor de e utilizando as propriedades observadas anteriormente quando trabalhando com vetores e assim extrair a informação correta da orientação do ponto em relação à reta. Segue uma implementação dessa ideia.
Calcular a área de um polígono convexo
Utilizando o produto vetorial podemos calcular a área do triângulo entre dois vetores, pois, como apresentado anteriormente, a área do triângulo formado entre os dois vetores é exatamente metade do valor do produto vetorial entre esses dois vetores. Logo se quisermos saber a área de um polígono convexo basta o dividirmos em triângulos e isso pode ser feito fixando um ponto qualquer e escolhendo todos os dois pontos adjacentes no polígono se os percorremos no sentido horário ou anti-horário e calculando a área de cada um desses triângulos. Segue uma imagem e implementação dessa ideia.
Vale notar que essa ideia, apesar de ter sido apresentada inicialmente para polígonos convexos, funciona para calcular a área de qualquer polígono, porém como a visualização é mais complexa resolvemos deixar a demonstração para outro momento.