Escrito por Leonardo Paes, Thiago Mota e Lúcio Figueiredo
Um dos tipos de problemas recorrentes na programação competitiva são os problemas de geometria computacional. Geometria computacional é uma aplicação direta da geometria analítica na informática. Nessa aula, iremos estudar pontos e vetores no plano cartesiano, que são a base na geometria computacional.
Pontos
Pontos situados no plano cartesiano são representados por pares de inteiros , normalmente chamados de coordenadas. Os pontos são adimensionais e podem representar inúmeras coisas como coordenadas em um mapa ou funções matemáticas como, por exemplo,
.
A coordenada de um ponto
é comumente chamada abscissa do ponto, e representa o deslocamento horizontal de tal ponto no plano. Já a coordenada
é denominada ordenada do ponto, e representa o deslocamento vertical do ponto no plano.
No plano acima estão presentes os pontos
:
e
. (Site utilizado: Desmos).
Em C++, iremos representar pontos usando o tipo pair, como representado no código abaixo:
Distância entre dois pontos
A distância entre dois pontos, mais conhecida como distância euclidiana, é definida como o tamanho da reta que liga os dois pontos. Para calcular a distância entre eles, podemos utilizar o Teorema de Pitágoras nas componentes e
.
Clique aqui para conferir a prova do Teorema de Pitágoras:
Teorema de Pitágoras: Dado um triângulo retângulo com catetos de comprimento e
e hipotenusa de comprimento
, vale que
.
Prova:
Seja um quadrado de lado
tal que
.
A área do quadrado
é
e a área de um triângulo vermelho é
.
Assim, a área do quadrado cinza é .
Expandindo: .
Logo: , como queríamos demonstrar.
Observe o exemplo abaixo:
Imagine que queremos calcular a distância entre os pontos
(digamos, ponto
) e
(ponto
). Defina o ponto
(ponto
na figura) como a interseção da reta horizontal que passa por
com a reta vertical que passa em
.
Definindo como o comprimento do segmento ligando
e
e
como o comprimento do segmento ligando
e
, temos que
e
. Como o triângulo formado ao ligar os pontos
,
e
é retângulo, podemos aplicar o Teorema de Pitágoras:
Logo, a distância entre os pontos e
é
.
De modo geral, para dois pontos e
de coordenadas
e
, respectivamente, temos que
, onde
é a distância entre os dois pontos.
O código a seguir calcula a distância entre dois pontos, utilizando a fórmula acima:
Obs: Em C++ , para pontos de distância , normalmente é utilizado o
ao invés do
, pois
pode ser um número decimal (tipo double), e isso pode causar imprecisão na realização de cálculos.
Vetores
Um vetor é utilizado para representar grandezas vetoriais. Uma grandeza vetorial, diferentemente de um número, possuí módulo, direção e sentido. Observe a seguinte imagem:
O módulo do vetor é representado por seu tamanho, ou seja, a distância entre os dois pontos que representam o vetor. Já a direção é a reta que o vetor está localizado, então o vetor tem a mesma direção do vetor
; o que muda nesse caso é o sentido deles, já que um vai de
pra
e o outro de
para
.
Normalmente representamos o vetor apenas como um ponto , pois utilizamos a origem do vetor como sendo a origem do plano cartesiano
, ou seja, o módulo do vetor representado pelo ponto é a distância entre os pontos
e
, o que deixa as contas bem mais simples. Quando a origem de um vetor dado não se localiza no ponto
, precisaremos realizar uma translação no vetor, tópico abordado nas seções abaixo.
Soma e subtração de vetores
A soma de dois vetores e
é representado pelo vetor da soma de suas coordenadas, ou seja, o vetor
. Como um exemplo, a soma dos vetores
e
é o vetor
.
Um truque para somar dois vetores geometricamente é colocar um dos vetores com a origem na ponta do outro vetor e ligar a origem de um com a extremidade do outro. Observe a imagem:
Como podemos ver, o vetor é a soma dos vetores
e
. Aplicando o truque citado acima, obteremos a seguinte figura:
Ao colocar a origem do vetor na extremidade do vetor
, podemos ligar o início do vetor
com a extremidade do vetor
, obtendo, assim, o vetor
.
A subtração de vetores é definida de maneira semelhante à soma. O resultado da subtração de vetores e
é o vetor
.
Para desenhar a subtração de dois vetores no plano, trataremos a subtração dos vetores e
como sendo a soma do vetor
com o vetor
, que possui mesmo módulo e direção que
, com sentido contrário. Assim, realizaremos o mesmo truque da soma de vetores, invertendo o sentido do vetor
.
Translação de vetores
Na seção de soma e subtração de vetores, assumimos que a origem de cada vetor se localizava no ponto ; no entanto, este nem sempre é o caso. Para trabalhar com vetores com origens em pontos quaisquer, iremos mover, ou seja, transladar as suas origens para o ponto
, mantendo os seus módulos, direções e sentidos.
Ao realizarmos a translação da origem do vetor para
, as coordenadas de sua extremidade irão ser alteradas. Portanto, o que queremos descobrir (de modo a manter as propriedades do vetor
) são as coordenadas da sua extremidade após a translação.
Defina como as coordenadas da extremidade de
antes da translação e
como as coordenadas da origem de
. Como iremos levar o ponto
para
, notamos que a extremidade do vetor irá se deslocar em
no sentido horizontal e em
no sentido vertical, já que mantemos o módulo, a direção e o sentido de
. Portanto, concluímos que as coordenadas da extremidade de
após a translação serão
. Desta forma, conseguimos uma maneira de trabalhar apenas com vetores de origem em
.
A figura abaixo mostra o vetor após a translação.