CCO 101 PROCESSAMENTO DE DADOS - rcosta62br.unifei.edu.br · ... porque os cálculos com números...

47
CIC 111 Análise e Projeto de Análise e Projeto de Algoritmos II Algoritmos II Universidade Federal de Itajubá Prof. Roberto Affonso da Costa Junior

Transcript of CCO 101 PROCESSAMENTO DE DADOS - rcosta62br.unifei.edu.br · ... porque os cálculos com números...

CIC 111Análise e Projeto de Análise e Projeto de

Algoritmos IIAlgoritmos II

Universidade Federal de Itajubá

Prof. Roberto Affonso da Costa Junior

AULA 29AULA 29

– Geometry• Complex numbers• Points and lines• Polygon area• Distance functions

GeometryGeometry

Em problemas geométricos, muitas vezes é difícil encontrar uma maneira de abordar o problema para que a solução para o problema possa ser convenientemente implementada e o número de casos especiais seja pequeno.

Como exemplo, considere um problema onde recebemos os vértices de um quadrilátero (um polígono que tem quatro vértices) e nossa tarefa é calcular sua área. Por exemplo, uma entrada possível para o problema é a seguinte:

GeometryGeometry

Uma maneira de abordar o problema é dividir o quadrilátero em dois triângulos por uma linha reta entre dois vértices opostos:

GeometryGeometry

Depois disso, basta somar as áreas dos triângulos. A área de um triângulo pode ser calculada, por exemplo, usando a fórmula de Heron

onde a, b e c são os comprimentos dos lados do triângulo e s = (a + b + c) / 2.

√ s(s−a)(s−b)(s−c),

GeometryGeometry

Esta é uma maneira possível de resolver o problema, mas há uma armadilha: como dividir o quadrilátero em triângulos? Acontece que às vezes não podemos escolher apenas dois vértices arbitrários opostos. Por exemplo, na seguinte situação, a linha de divisão está fora do quadrilátero:

No entanto, outra maneira de desenhar a linha funciona:

GeometryGeometry

É claro para um humano qual das linhas é a escolha correta, mas a situação é difícil para um computador.No entanto, descobrimos que podemos resolver o problema usando outro método que seja mais conveniente para um programador. Ou seja, existe uma fórmula geral

que calcula a área de um quadrilátero cujos vértices são (x

1, y

1), (x

2, y

2), (x

3, y

3) e (x

4, y

4). Essa fórmula é

fácil de implementar, não há casos especiais e podemos até generalizar a fórmula para todos os polígonos.

x1 y2−x2 y1+x2 y3−x3 y2+ x3 y4−x4 y3+x4 y1−x1 y4,

Complex NumbersComplex Numbers

Um número complexo é um número da forma x + yi, onde i = - 1 é a unidade imaginária. Uma interpretação geométrica de um número complexo é que ele representa um ponto bidimensional (x, y) ou um vetor da origem até um ponto (x, y).Por exemplo, 4 + 2i corresponde ao seguinte ponto e vetor:

(4,2)

Complex NumbersComplex Numbers

O complexo de classes C ++ de numéricos complexos é útil na resolução de problemas geométricos. Usando a classe, podemos representar pontos e vetores como números complexos, e a classe contém ferramentas que são úteis na geometria.

No código a seguir, C é o tipo de uma coordenada e P é o tipo de um ponto ou um vetor. Além disso, o código define as macros X e Y que podem ser usadas para se referir às coordenadas x e y.

Complex NumbersComplex Numbers

Por exemplo, o código a seguir define um ponto p = (4, 2) e imprime suas coordenadas x e y:

O código a seguir define os vetores v = (3, 1) e u = (2, 2) e, depois disso, calcula a soma s = v + u.

typedef long long C;typedef complex<C> P;#define X real()#define Y imag()

P p = {4,2};cout << p.X << " " << p.Y << "\n"; // 4 2

P v = {3,1};P u = {2,2};P s = v+u;cout << s.X << " " << s.Y << "\n"; // 5 3

Complex NumbersComplex Numbers

Na prática, um tipo de coordenada apropriado é geralmente longo (inteiro) ou longo duplo (número real). É uma boa ideia usar inteiro sempre que possível, porque os cálculos com números inteiros são exatos. Se forem necessários números reais, erros de precisão devem ser levados em conta ao comparar números. Uma maneira segura de verificar se os números reais a e b são iguais é compará-los usando |a - b| < ξ, em que ξ é um número pequeno (por exemplo, ξ = 10-9).

FunctionsFunctions

Nos exemplos a seguir, o tipo de coordenada é longo duplo.A função abs(v) calcula o comprimento |v| de um vector v = (x, y) usando a fórmula . A função também pode ser usada para calcular a distância entre os pontos (x

1, y

1) e (x

2, y

2), porque essa distância

é igual ao comprimento do vetor (x2 - x

1, y

2 - y

1) .

O código a seguir calcula a distância entre os pontos (4, 2) e (3, - 1):

√ x2+ y2

P a = {4,2};P b = {3,-1};cout << abs(b-a) << "\n"; // 3.16228

FunctionsFunctions

A função arg(v) calcula o ângulo de um vetor v = (x, y) em relação ao eixo x. A função dá o ângulo em radianos, onde r radianos é igual a 180 r / π graus. O ângulo de um vetor que aponta para a direita é 0 e os ângulos diminuem no sentido horário e aumentam no sentido anti-horário.

A função polar(s, a) constrói um vetor cujo comprimento é s e que aponta para um ângulo a. Um vetor pode ser girado por um ângulo a, multiplicando-o por um vetor com comprimento 1 e ângulo a.

FunctionsFunctions

O código a seguir calcula o ângulo do vetor (4, 2), gira 1/2 radianos no sentido anti-horário e calcula o ângulo novamente:

P v = {4,2};cout << arg(v) << "\n"; // 0.463648v *= polar(1.0,0.5);cout << arg(v) << "\n"; // 0.963648

Points and LinesPoints and Lines

O produto escalar a×b dos vetores a = (x1, y

1) e b = (x

2, y

2)

é calculado usando a fórmula x1y

2 - x

2y

1. O produto

escalar nos diz se b vira à esquerda (valor positivo), não vira (zero) ou vira à direita (valor negativo) quando é colocado diretamente depois de a.A figura a seguir ilustra os casos acima:

a a a

bb

b

a×b=6 a×b=0 a×b=−8

Points and LinesPoints and Lines

Por exemplo, no primeiro caso a = (4, 2) e b = (1, 2). O código a seguir calcula o produto cruzado usando a classe de número complexo:

O código acima funciona, porque a função conj nega a coordenada y de um vetor, e quando os vetores (x

1, -y

1) e

(x2, y

2) são multiplicados juntos, a coordenada y do

resultado é x1y

2 - x

2y

1.

P a = {4,2};P b = {1,2};C p = (conj(a)*b).Y; // 6

p

s1

s2

Point LocationPoint Location

Os produtos escalares podem ser usados para testar se um ponto está localizado à esquerda ou à direita de uma linha. Suponha que a linha passe pelos pontos s

1 e s

2, estamos olhando de s

1 para s

2 e o ponto é p.

Por exemplo, na figura a seguir, p está no lado esquerdo da linha:

s1

ps

2

Point LocationPoint Location

O produto escalar de (p - s1) × (p - s

2) nos informa a

localização do ponto p. Se o produto escalar for escalar, p está localizado no lado esquerdo, e se o produto escalar for negativo, p está localizado no lado direito. Finalmente, se o produto vetorial é zero, os pontos s

1, s

2 e p estão na mesma linha.

b

c

d

Line Segment IntersectionLine Segment Intersection

Em seguida, consideramos o problema de testar se dois segmentos de linha ab e cd se cruzam. Os casos possíveis são:

Caso 1: os segmentos de linha estão na mesma linha e se sobrepõem. Nesse caso, há um número infinito de pontos de interseção. Por exemplo, na figura a seguir, todos os pontos entre c e b são pontos de interseção:

a

b

p

d

Line Segment IntersectionLine Segment Intersection

Este caso é fácil de verificar, porque existem apenas quatro possibilidades para o ponto de interseção: a = c, a = d, b = c e b = d.

Caso 3: Existe exatamente um ponto de interseção que não é um vértice de nenhum segmento de linha. Na figura a seguir, o ponto p é o ponto de interseção:

a

c

Line Segment IntersectionLine Segment Intersection

Neste caso, os segmentos de linha se cruzam exatamente quando ambos os pontos c e d estão em lados diferentes de uma linha através de a e b, e os pontos a e b estão em lados diferentes de uma linha através de c e d. Podemos usar produtos escalares para verificar isso.

Point Distance from a LinePoint Distance from a Line

Outra característica dos produtos cruzados é que a área de um triângulo pode ser calculada usando a fórmula

onde a, b e c são os vértices do triângulo. Usando esse fato, podemos derivar uma fórmula para calcular a menor distância entre um ponto e uma linha. Por exemplo, na figura a seguir, d é a menor distância entre o ponto p e a linha que é definida pelos pontos s

1 e s

2

|(a−c)×(b−c)|2 ,

d

Point Distance from a LinePoint Distance from a Line

A área do triângulo cujos vértices são s1, s

2 e p pode

ser calculada de duas maneiras: é e . Assim, a menor distância é

d=(s1−p)×(s2−p)

|s2−s1|.

p

s1

s2

12|s2−s1|

12 ((s1−p)×(s2−p))

a

Point Inside a PolygonPoint Inside a Polygon

Vamos agora considerar o problema de testar se um ponto está localizado dentro ou fora de um polígono. Por exemplo, no seguinte ponto de imagem a está dentro do polígono e o ponto b está fora do polígono.

b

Point Inside a PolygonPoint Inside a Polygon

Uma maneira conveniente de resolver o problema é enviar um raio do ponto para uma direção arbitrária e calcular o número de vezes que ele toca o limite do polígono. Se o número for ímpar, o ponto estará dentro do polígono e, se o número for par, o ponto estará fora do polígono.

Por exemplo, podemos enviar os seguintes raios:

a

Point Inside a PolygonPoint Inside a Polygon

Os raios de a tocom 1 e 3 vezes o limite do polígono, então a está dentro do polígono.

Correspondentemente, os raios de b tocam 0 e 2 vezes o limite do polígono, portanto b está fora do polígono.

b

Polygon AreaPolygon Area

Uma fórmula geral para calcular a área de um polígono, às vezes chamada de fórmula de cadarço, é a seguinte:

Aqui os vértices são p1 = (x

1, y

1), p

2 = (x

2, y

2), … , p

n =

(xn, y

n) em tal ordem que p

i e p

i + 1 são vértices

adjacentes no limite do polígono, e o primeiro e último vértice é o mesmo, ou seja, p

1 = p

n.

12|∑

i=1

n−1

(pi×pi+1)|= 12|∑

i=1

n−1

(xi y i+1−xi+1 y i)|,

Polygon AreaPolygon Area

Por exemplo, a área do polígono

é

(2,4)

(4,5)

(5,3)

(3,6) (6,6)

|(2∗6−3∗4)+(3∗6−6∗6)+(6∗3−5∗6)+(5∗5−4∗3)+(4∗4−2∗5)|2 =

112

Polygon AreaPolygon Area

A ideia da fórmula é percorrer trapezoides cujo lado é um lado do polígono, e outro lado está na linha horizontal y = 0. Por exemplo:

(2,4)

(4,5)

(5,3)

(3,6) (6,6)

Polygon AreaPolygon Area

A área do trapézio é

onde os vértices do polígono são pi e p

i + 1. Se x

i + 1 > x

i,

a área é positiva e, se xi + 1

< xi, a área é negativa.

A área do polígono é a soma das áreas de todos esses trapézios, o que produz a fórmula

(x i+1−x i)( yi+1+ y i)

2 ,

|∑i=1

n−1 (x i+1−x i)( yi+1+ y i)

2 |=12|∑

i=1

n−1

(x i y i+1−xi+1 yi)|,

Polygon AreaPolygon Area

Observe que o valor absoluto da soma é obtido, porque o valor da soma pode ser positivo ou negativo, dependendo de andarmos no sentido horário ou anti-horário ao longo do limite do polígono.

Pick’s TheoremPick’s Theorem

O teorema de Pick fornece outra maneira de calcular a área de um polígono, desde que todos os vértices do polígono tenham coordenadas inteiras. De acordo com o teorema de Pick, a área do polígono é

a + b / 2 - 1

onde a é o número de pontos inteiros dentro do polígono e b é o número de pontos inteiros no limite do polígono.

Pick’s TheoremPick’s Theorem

Por exemplo, a área do polígono

é 3 + 7/2 - 1 = 11/2.

(2,4)

(4,5)

(5,3)

(3,6) (6,6)

Distance FunctionsDistance Functions

Uma função de distância define a distância entre dois pontos. A função de distância usual é a distância euclidiana onde a distância entre os pontos (x

1, y

1) e

(x2, y

2) é

Uma função de distância alternativa é a distância de Manhattan onde a distância entre pontos (x

1, y

1) e (x

2,

y2) é

é 3 + 7/2 - 1 = 11/2.

z

√(x2−x1)2+( y2− y1)

2 .

|x2−x1|+|y2− y1|.

Distance FunctionsDistance Functions

Por exemplo, considere a seguinte imagem:

(2,1)

(5,2)

(2,1)

(5,2)

Distância Euclideana Distância Manhattan

Distância ManhattanDistância Euclideana

Distance FunctionsDistance Functions

A distância euclidiana entre os pontos é

e a distância de Manhattan é

A figura a seguir mostra regiões que estão a uma distância de 1 do ponto central, usando as distâncias euclidiana e de Manhattan:

√(5−2)2+(2−1)2=√10 .

|5−2|+|2−1|=4 .

Rotating CoordinatesRotating Coordinates

Alguns problemas são mais fáceis de resolver se forem usadas distâncias de Manhattan em vez de distâncias euclidianas. Como exemplo, considere um problema em que recebemos n pontos no plano bidimensional e nossa tarefa é calcular a distância máxima de Manhattan entre dois pontos.

Por exemplo, considere o seguinte conjunto de pontos:

AD

C

B

Rotating CoordinatesRotating Coordinates

A distância máxima de Manhattan é 5 entre os pontos B e C:

Uma técnica útil relacionada às distâncias de Manhattan é girar todas as coordenadas em 45 graus para que um ponto (x, y) se torne (x + y, y - x). Por exemplo, depois de girar os pontos acima, o resultado é:

AD

C

B

Rotating CoordinatesRotating Coordinates

Considere dois pontos p1 = (x

1, y

1) e p

2 = (x

2, y

2) cujas

coordenadas rotacionadas são p’1 = (x’

1, y’

1) e p’

2 =

(x’2 , y’

2). Agora existem duas maneiras de expressar

a distância de Manhattan entre p1 e p

2:

Por exemplo, se p1 = (1, 0) e p

2 = (3, 3), as

coordenadas rotacionadas são p’1 = (1, - 1) e p’

2 = (6,

0) e a distância de Manhattan é

|x2−x1|+|y2− y1|=max (|x '2−x '1|,|y ' 2− y '1|) .

|3−1|+|3−0|=max (|1−6|,|−1−0|) .

Rotating CoordinatesRotating Coordinates

As coordenadas rotacionadas fornecem uma maneira simples de operar com as distâncias de Manhattan, porque podemos considerar as coordenadas x e y separadamente. Para maximizar a distância de Manhattan entre dois pontos, devemos encontrar dois pontos cujas coordenadas rotacionadas maximizam o valor de

Isso é fácil, porque a diferença horizontal ou vertical das coordenadas rotacionadas deve ser máxima.

max (|x '2−x '1|,|y '2− y '1|) .

RuleRule

Os alunos devem:Ler e descrever os problemas;Avaliar a solução e descrevê-la cada um dos problemas;Identificar as técnicas utilizadas e adicionar a cada problema;Apresentar as bibliografias referentes aos assuntos;Montar a conclusão do trabalho em cima do que foi realizado no documento;Colocar em anexo o código do problema. (obrigatório)

Deve usar os arquivos que estão na página do professor.

Data da Entrega: 01/06/2018 as 23:00hs

Group OneGroup One

URI 1875UVa 11524

Group TwoGroup Two

UVa 10991URI 2158

Group ThreeGroup Three

UVa 11227URI 2518

Group FourGroup Four

UVa 10263URI 1124

Group FiveGroup Five

UVa 11068URI 1834