Geometria Computacional Aula 2 - Produto Vetorial e Escalar

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 \overrightarrow{V} \cdot \overrightarrow{W}. Geometricamente, essa operação pode ser interpretada como o tamanho da projeção do vetor \overrightarrow{V}, na reta formada pelo vetor \overrightarrow{W}, multiplicada pelo módulo de \overrightarrow{W}. Como mostra a figura 1, podemos calcular a projeção como |V|cos (\theta), onde \theta é o ângulo entre os dois vetores, dessa forma, o dot product é |V| |W| cos (\theta).

Figura 1
Figura 1

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: \overrightarrow{V} \cdot \overrightarrow{W}= V_x W_x + V_y W_y. 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

  1. O dot product é comutativo, ou seja, a ordem em que operamos os vetores não importa.
  2. Sempre escolheremos o menor ângulo, que será do intervalo [0,\pi] radianos. Nesse intervalo, a função coseno é injetora, ou seja, cada valor de \theta assume um valor único de imagem. Portanto, podemos usar as duas fórmulas para se calcular o ângulo entre dois vetores.
  3. Se fizermos o dot product de um vetor com ele mesmo, ou seja \overrightarrow{V} \cdot \overrightarrow{V}, teremos |V|^2

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 \overrightarrow{V} \times \overrightarrow {W}. 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 |V| |W| sin(\theta). 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:

\begin{vmatrix}V_x & V_y & 1\\ W_x & W_y & 1\\ 0 & 0 & 1\end{vmatrix}

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 \overrightarrow{W} está a direita de \overrightarrow{V}. Além disso, podemos observar então que: \overrightarrow{V} \times \overrightarrow{W} = V_x W_y - V_y W_x, que é mais cômodo para se trabalhar.

Propriedades e aplicações diretas do Cross Product

  1. O cross product não é comutativo, já que, como observamos, depende das posições relativas entre os vetores
  2. 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 \overrightarrow{V}, e o dedo médio para \overrightarrow{W}, o seu polegar estará no sentido de \overrightarrow{V} \times \overrightarrow{W}, como mostra a figura 2.

    Figura 2
  3. 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 \overrightarrow{A} \oplus \overrightarrow{B}, onde \oplus pode representar tanto o produto vetorial como o escalar. Iremos representar \overrightarrow{A} como um vetor saindo do centro do círculo trigonométrico e com direção horizontal com sentido para a direita. Já \overrightarrow{B} se representará exatamente a \theta graus no sentido anti-horário saindo de \overrightarrow{A}, onde \theta é o ângulo formado entre \overrightarrow{A} e \overrightarrow{B} no plano original.

Note que essa definição de \overrightarrow{A} como sendo paralelo ao eixo x 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 \overrightarrow{A} fique paralelo ao eixo x e o valor da operação se manterá constante.

Iremos representar ambos vetores com módulo 1 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:

Figura 3

Produto Vetorial - associado ao cos(\theta)

  1. Comutatividade: Podemos perceber que, se representarmos nesse modelo a operação \overrightarrow{B} \cdot \overrightarrow{A} teremos um desenho semelhante, porém com o ângulo entre os vetores no sentido horário como \theta' = 2 \pi - \theta , portanto pela propriedade dos cossenos de que cos(a) = cos(2 \pi -a) temos que |A| \cdot |B| \cdot cos(\theta ) = |A| \cdot |B| \cdot cos(2 \pi - \theta ), logo \overrightarrow{A} \cdot \overrightarrow{B} = \overrightarrow{B} \cdot \overrightarrow{A} . Segue uma imagem dessa situação para melhor entendimento.

    Figura 4
  2. Podemos verificar facilmente com o produto escalar se dois vetores são perpendiculares, e isso vem diretamente do fato de que cos(\frac{\pi}{2}) = 0.
  3. Também podemos verficar se o ângulo entre dois vetores é menor ou maior que \frac{\pi}{2}, extraindo essa informação do sinal do produto escalar, visto que  \forall \theta tal que  0 \leq \theta < \frac{\pi}{2} \implies cos(\theta )  data-recalc-dims= 0" />, e  \forall \theta tal que  \frac{\pi }{2} < \theta \leq \pi \implies cos(\theta ) < 0 (Lembre-se que sempre consideramos \theta no intervalo [0, \pi ], visto que cos( \theta ) = cos(2 \pi - \theta).

Produto Vetorial - associado ao sen(\theta)

  1. 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, sen( \theta ) \neq sen(2 \pi - \theta ), e ainda podemos extrair um pouco mais de informação e perceber que na realidade sen( \theta) = - sen(2 \pi - \theta ), logo \overrightarrow{A} \times \overrightarrow{B} = - \overrightarrow{B} \times \overrightarrow{A}.
  2. 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 sen(0) = sen( \pi ) = 0.
  3. 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 \overrightarrow{A} \times \overrightarrow{B}  data-recalc-dims= 0" />, podemos extrair que  \theta \in \hspace{0.1cm} ] 0, \pi [ , logo \overrightarrow{B} está no sentido anti-horário em relação a \overrightarrow{A} . Similiarmente se \overrightarrow{A} \times \overrightarrow{B} < 0, podemos extrair que  \theta \in \hspace{0.1cm}] \pi , 2 \pi [ , logo \overrightarrow{B} está no sentido horário em relação a \overrightarrow{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.

Construção de vetores para checar colinearidade

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  \overrightarrow{B} \times \overrightarrow{C} 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.

Triangulação de polígono convexo

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.

Problemas para praticar