Geometria Computacional Aula 1 – Pontos e Vetores

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 $$(x, y)$$, 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, $$y = f(x)$$.

A coordenada $$x$$ de um ponto $$(x, y)$$ é comumente chamada abscissa do ponto, e representa o deslocamento horizontal de tal ponto no plano. Já a coordenada $$y$$ é denominada ordenada do ponto, e representa o deslocamento vertical do ponto no plano.

A imagem contêm um plano cartesiano com os pontos (1, 3) e (2, 2)No plano acima estão presentes os pontos $$(x, y)$$: $$(1, 3)$$ e $$(2, 2)$$. (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 $$x$$ e $$y$$.

Clique aqui para conferir a prova do Teorema de Pitágoras:

Teorema de Pitágoras

Teorema de Pitágoras: Dado um triângulo retângulo com catetos de comprimento $$A$$ e $$B$$ e hipotenusa de comprimento $$C$$, vale que $$A^2 + B^2 = C^2$$.

Prova:

Seja $$ABCD$$ um quadrado de lado $$L$$ tal que $$A + B = L$$.A área do quadrado $$ABCD$$ é $$(A+B)^2$$ e a área de um triângulo vermelho é $$A*B/2$$.

Assim, a área do quadrado cinza é $$(A+B)^2 – 2*A*B = C^2$$.

Expandindo: $$A^2 + 2*A*B + B^2 – 2*A*B = C^2$$.

Logo: $$A^2 + B^2 = C^2$$, como queríamos demonstrar.

[collapse]

Observe o exemplo abaixo:


Imagine que queremos calcular a distância $$d$$ entre os pontos $$(1, 3)$$ (digamos, ponto $$A$$) e $$(2, 2)$$ (ponto $$C$$). Defina o ponto $$B$$ (ponto $$(1, 2)$$ na figura) como a interseção da reta horizontal que passa por $$C$$ com a reta vertical que passa em $$A$$.

Definindo $$d_x$$ como o comprimento do segmento ligando $$B$$ e $$C$$ e $$d_y$$ como o comprimento do segmento ligando $$A$$ e $$B$$, temos que $$d_y = 3 – 2 = 1$$ e $$d_x = 2 – 1 = 1$$. Como o triângulo formado ao ligar os pontos $$A$$, $$B$$ e $$C$$ é retângulo, podemos aplicar o Teorema de Pitágoras:

$$\begin{cases} d^2 = d_x^2 + d_y^2 \\ d^2 = 1^2 + 1^2 \\ d^2 = 1 + 1 = 2 \\ d = \sqrt{2} \end{cases}$$

Logo, a distância entre os pontos $$A$$ e $$C$$ é $$\sqrt{2}$$.

De modo geral, para dois pontos $$A$$ e $$B$$ de coordenadas $$(A_x, A_y)$$ e $$(B_x, B_y)$$, respectivamente, temos que $$dist(A, B) = \sqrt{(A_x-B_x)^2 + (A_y-B_y)^2}$$, onde $$dist(A, B)$$ é 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 $$d$$, normalmente é utilizado o $$d^2$$ ao invés do $$d$$, pois $$d$$ 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 $$\overrightarrow{AB}$$ tem a mesma direção do vetor $$\overrightarrow{BA}$$; o que muda nesse caso é o sentido deles, já que um vai de $$A$$ pra $$B$$ e o outro de $$B$$ para $$A$$.

Normalmente representamos o vetor apenas como um ponto $$(x, y)$$, pois utilizamos a origem do vetor como sendo a origem do plano cartesiano $$(0, 0)$$, ou seja, o módulo do vetor representado pelo ponto é a distância entre os pontos $$(0, 0)$$ e $$(x, y)$$, o que deixa as contas bem mais simples. Quando a origem de um vetor dado não se localiza no ponto $$(0, 0)$$, 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 $$(x_1, y_1)$$ e $$(x_2, y_2)$$ é representado pelo vetor da soma de suas coordenadas, ou seja, o vetor $$(x_1 + x_2, y_1 + y_2)$$. Como um exemplo, a soma dos vetores $$(1, 3)$$ e $$(3, 2)$$ é o vetor $$(4, 5)$$.

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 $$\vec{w}$$ é a soma dos vetores $$\vec{u}$$ e $$\vec{v}$$. Aplicando o truque citado acima, obteremos a seguinte figura:

Ao colocar a origem do vetor $$\vec{v}$$ na extremidade do vetor $$\vec{u}$$, podemos ligar o início do vetor $$\vec{u}$$ com a extremidade do vetor $$\vec{v}$$, obtendo, assim, o vetor $$\vec{w}$$.

A subtração de vetores é definida de maneira semelhante à soma. O resultado da subtração de vetores $$(x_1, y_1)$$ e $$(x_2, y_2)$$ é o vetor $$(x_1-x_2, y_1-y_2)$$.

Para desenhar a subtração de dois vetores no plano, trataremos a subtração dos vetores $$\vec{u}$$ e $$\vec{v}$$ como sendo a soma do vetor $$\vec{u}$$ com o vetor $$(-\vec{v})$$, que possui mesmo módulo e direção que $$\vec{v}$$, com sentido contrário. Assim, realizaremos o mesmo truque da soma de vetores, invertendo o sentido do vetor $$\vec{v}$$.

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 $$(0, 0)$$; 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 $$(0, 0)$$, mantendo os seus módulos, direções e sentidos.

Ao realizarmos a translação da origem do vetor $$\vec{u}$$ para $$(0, 0)$$, as coordenadas de sua extremidade irão ser alteradas. Portanto, o que queremos descobrir (de modo a manter as propriedades do vetor $$\vec{u}$$) são as coordenadas da sua extremidade após a translação.

Defina $$(u_x, u_y)$$ como as coordenadas da extremidade de $$\vec{u}$$ antes da translação e $$(v_x, v_y)$$ como as coordenadas da origem de $$\vec{u}$$. Como iremos levar o ponto $$(v_x, v_y)$$ para $$(0, 0)$$, notamos que a extremidade do vetor irá se deslocar em $$-v_x$$ no sentido horizontal e em $$-v_y$$ no sentido vertical, já que mantemos o módulo, a direção e o sentido de $$\vec{u}$$. Portanto, concluímos que as coordenadas da extremidade de $$\vec{u}$$ após a translação serão $$(u_x – v_x, u_y – v_y)$$. Desta forma, conseguimos uma maneira de trabalhar apenas com vetores de origem em $$(0, 0)$$.

A figura abaixo mostra o vetor $$\vec{u}$$ após a translação.