1 Algoritmos Geométricos em SIG Diversas funções de SIG dependem fundamentalmente de resultados obtidos em algumas disciplinas da computação, da matemática e da estatística, entre outras áreas. Especificamente na computação, as técnicas derivadas da área de bancos de dados são especialmente importantes, uma vez que são responsáveis pelos mecanismos de armazenamento e recuperação de dados geográficos. No entanto, como o diferencial do SIG está no uso de informação georreferenciada, em geral visualizável graficamente, duas outras disciplinas da computação adquirem grande importância nesse contexto: processamento digital de imagens e computação gráfica. A primeira é essencial para o uso de imagens em SIG, em aplicações que vão desde a conversão de dados até o sensoriamento remoto. A segunda reúne as técnicas de tratamento e visualização de dados vetoriais, que por sua vez se beneficiam dos avanços obtidos em uma área de pesquisas nova, porém importante: a geometria computacional. A geometria computacional procura desenvolver e analisar algoritmos e estruturas de dados para resolver problemas geométricos diversos. Neste particular, tem um ponto importante de contato com a área de projeto e análise de algoritmos, uma vez que também procura caracterizar a dificuldade de problemas específicos, determinando a eficiência computacional dos algoritmos e usando técnicas de análise de complexidade assintótica [Knut73a]. Existe também uma preocupação em desenvolver soluções para problemas clássicos de geometria, construindo estruturas mais apropriadas para a representação geométrica robusta no ambiente computacional, que tem limitações conhecidas quanto à precisão numérica e a capacidade de armazenamento de dados. Os mesmos problemas ocorrem na área de topologia, em que se procura desenvolver soluções, geralmente baseadas em estruturas de dados, para representar as relações espaciais que são independentes da geometria, tais como contenção, adjacência e conectividade. Além da caracterização e comparação das estruturas topológicas propriamente ditas, a geometria computacional preocupa-se com os algoritmos necessários para compor e manter estas estruturas a partir da geometria básica dos objetos. Existe também muito desenvolvimento na área de indexação espacial para SIG. São algoritmos e estruturas de dados desenvolvidos especialmente para agilizar a busca e recuperação de dados em bancos de dados geográficos. As estruturas de indexação espacial procuram agilizar a resposta a dois tipos fundamentais de perguntas: • dada uma região do espaço, identificar o que está contido nela;
1. 1 Algoritmos Geomtricos em SIG Diversas funes de SIG
dependem fundamentalmente de resultados obtidos em algumas
disciplinas da computao, da matemtica e da estatstica, entre outras
reas. Especificamente na computao, as tcnicas derivadas da rea de
bancos de dados so especialmente importantes, uma vez que so
responsveis pelos mecanismos de armazenamento e recuperao de dados
geogrficos. No entanto, como o diferencial do SIG est no uso de
informao georreferenciada, em geral visualizvel graficamente, duas
outras disciplinas da computao adquirem grande importncia nesse
contexto: processamento digital de imagens e computao grfica. A
primeira essencial para o uso de imagens em SIG, em aplicaes que vo
desde a converso de dados at o sensoriamento remoto. A segunda rene
as tcnicas de tratamento e visualizao de dados vetoriais, que por
sua vez se beneficiam dos avanos obtidos em uma rea de pesquisas
nova, porm importante: a geometria computacional. A geometria
computacional procura desenvolver e analisar algoritmos e
estruturas de dados para resolver problemas geomtricos diversos.
Neste particular, tem um ponto importante de contato com a rea de
projeto e anlise de algoritmos, uma vez que tambm procura
caracterizar a dificuldade de problemas especficos, determinando a
eficincia computacional dos algoritmos e usando tcnicas de anlise
de complexidade assinttica [Knut73a]. Existe tambm uma preocupao em
desenvolver solues para problemas clssicos de geometria,
construindo estruturas mais apropriadas para a representao
geomtrica robusta no ambiente computacional, que tem limitaes
conhecidas quanto preciso numrica e a capacidade de armazenamento
de dados. Os mesmos problemas ocorrem na rea de topologia, em que
se procura desenvolver solues, geralmente baseadas em estruturas de
dados, para representar as relaes espaciais que so independentes da
geometria, tais como conteno, adjacncia e conectividade. Alm da
caracterizao e comparao das estruturas topolgicas propriamente
ditas, a geometria computacional preocupa-se com os algoritmos
necessrios para compor e manter estas estruturas a partir da
geometria bsica dos objetos. Existe tambm muito desenvolvimento na
rea de indexao espacial para SIG. So algoritmos e estruturas de
dados desenvolvidos especialmente para agilizar a busca e recuperao
de dados em bancos de dados geogrficos. As estruturas de indexao
espacial procuram agilizar a resposta a dois tipos fundamentais de
perguntas: dada uma regio do espao, identificar o que est contido
nela;
2. dado um ponto, determinar que objetos geogrficos o contm.
Com isso, a indexao espacial utilizada a todo momento na operao de
um SIG, em situaes corriqueiras como a execuo de um zoom ou a
identificao de um objeto na tela com o mouse. As sees seguintes
abordam alguns dos principais algoritmos e estruturas de dados
aplicados freqentemente em SIG, nas reas de geometria vetorial,
topologia e indexao espacial. 1.1 Geometria computacional aplicada
a SIG Num sentido amplo, a geometria computacional compreende o
estudo de algoritmos para resolver problemas geomtricos em um
computador. Nesta seo, os algoritmos geomtricos utilizados para
resolver problemas tpicos de um SIG vetorial sero enfatizados,
procurando transmitir uma noo dos recursos utilizados pelos
sistemas na soluo de problemas geogrficos. O enfoque ser o de
mostrar como os algoritmos funcionam, indicando tambm, porm com
menor nfase, a sua complexidade. 1.1.1 Definies bsicas Em um SIG
vetorial, cada objeto codificado usando um ou mais pares de
coordenadas, o que permite determinar sua localizao e aparncia
visual. Adicionalmente, os objetos so tambm caracterizados por
atributos no-espaciais, que os descrevem e identificam
univocamente. Este tipo de representao no exclusivo do SIG:
sistemas CAD e outros tipos de sistemas grficos tambm utilizam
representaes vetoriais. Isto porque o modelo vetorial bastante
intuitivo para engenheiros e projetistas, embora estes nem sempre
utilizem sistemas de coordenadas ajustados superfcie da Terra para
realizar seus projetos, pois para estas aplicaes um simples sistema
de coordenadas cartesianas suficiente. Mas o uso de vetores em SIG
bem mais sofisticado do que o uso em CAD, pois em geral SIG envolve
volumes de dados bem maiores, e conta com recursos para tratamento
de topologia, associao de atributos alfanumricos e indexao
espacial. Por outro lado, os vetores que se constri tipicamente em
um SIG so menos sofisticados geometricamente que aqueles possveis
em um CAD. Enquanto em um SIG, em geral, se pode apenas representar
pontos e conjuntos de segmentos de reta, em um CAD possvel ter
tambm crculos, arcos de crculo, e curvas suavizadas como spline e
Bezier. Alm disto, o tratamento da terceira dimenso em SIG ainda
rudimentar, enquanto os sistemas CAD so utilizados para operaes
tridimensionais bem mais complexas, como modelagem de slidos. Para
entender melhor a maneira como os SIG tratam a informao vetorial,
esto relacionadas a seguir algumas definies fundamentais [ref.
Vetores em GIS]. Como na maioria dos SIG comerciais, as definies
consideram apenas duas dimenses. Ponto: um ponto um par ordenado
(x, y) de coordenadas espaciais. Alguns SIG denominam objetos
localizados com apenas um ponto como smbolos. Isto se deve ao fato
de sempre se associar um smbolo cartogrfico ao ponto, para fins de
apresentao em tela ou em um mapa.
3. Reta e segmento de reta: Sejam p1 e p2 dois pontos distintos
no plano. A combinao linear . ( )p p1 21+ , onde qualquer nmero
real, uma reta no plano. Quando 0 1 , se tem um segmento de reta no
plano, que tem p1 e p2 como pontos extremos. Esta definio
estritamente geomtrica, e nos interessa uma definio mais aplicada.
Assim, partimos para o conceito de linha poligonal, que composta
por uma seqncia de segmentos de reta. O mais comum, no entanto,
definir a linha poligonal atravs da seqncia dos pontos extremos de
seus segmentos, ou seja, seus vrtices. Linha poligonal: Sejam v v
vn0 1 1, , , n pontos no plano. Sejam s v v s v v s v vn n n0 0 1 1
1 2 2 2 1= = = , , , uma seqncia de n - 1 segmentos, conectando
estes pontos. Estes segmentos formam uma poligonal L se, e somente
se, (1) a interseo de segmentos consecutivos apenas o ponto extremo
compartilhado por eles (i.e., s s vi i i =+ +1 1 ), (2) segmentos
no consecutivos no se interceptam (i.e., s si j = para todo i, j
tais que j i +1), e (3) v vn0 1 , ou seja, a poligonal no fechada.
Observe-se, na definio acima, a excluso da possibilidade de
auto-interseo. Os segmentos que compem a poligonal s se tocam nos
vrtices. Formalmente, poligonais que no obedecem a este critrio so
chamadas poligonais complexas. De modo geral, os SIG no impedem que
poligonais complexas sejam criadas; no entanto, dificilmente este
tipo de linha ocorrer na natureza. Alm do mais, poligonais
complexas podem criar dificuldades na definio da topologia e em
operaes como a criao de buffers (ref. Interna). Polgono: Um polgono
a regio do plano limitada por uma linha poligonal fechada. A
definio acima implica que, apenas invertendo a condio (3) da linha
poligonal, temos um polgono. Assim, tambm aqui no permitida a
interseo de segmentos fora dos vrtices, e os polgonos onde isto
ocorre so denominados polgonos complexos. Os mesmos comentrios que
foram feitos para poligonais valem para os polgonos. Observe-se
tambm que o polgono divide o plano em duas regies: o interior, que
convencionalmente inclui a fronteira (a poligonal fechada) e o
exterior. Assim, quando utilizamos a expresso vetores, estamos nos
referindo a alguma combinao de pontos, poligonais e polgonos,
conforme definidos acima. Combinaes porque teoricamente poderamos
utilizar mais de um tipo de primitiva grfica na criao da
representao de um objeto. Por exemplo, pode-se ter objetos de rea
mais complexos, formados por um polgono bsico e vrios outros
polgonos contidos no primeiro, delimitando buracos. Pode-se tambm
ter objetos compostos por mais de um polgono, como seria necessrio
no caso do estado do Par, que alm da parte continental tem a ilha
de Maraj e outras como parte de seu territrio. 1.1.1.1 Classes de
vetores Apesar de estarmos sempre concebendo representaes sob a
forma de pontos, linhas e reas para objetos em SIG, existem algumas
variaes com relao adaptao destas representaes realidade, ou seja,
considerando a forma com que estes objetos
4. ocorrem na natureza. A opo entre as alternativas a seguir
feita na fase de modelagem conceitual do SIG, e deve ser feita com
bastante cuidado. Objetos de rea podem ter trs formas diferentes de
utilizao: como objetos isolados, objetos aninhados ou objetos
adjacentes. O caso de objetos isolados bastante comum em SIG
urbanos, e ocorre no caso em que os objetos da mesma classe em
geral no se tocam. Por exemplo, edificaes, piscinas, e mesmo as
quadras das aplicaes cadastrais ocorrem isoladamente, no existindo
segmentos poligonais compartilhados entre os objetos. O caso tpico
de objetos aninhados o de curvas de nvel e todo tipo de isolinhas,
em que se tem linhas que no se cruzam, e so entendidas como estando
empilhadas umas sobre as outras. Este caso tem muitas variaes, pois
curvas de nvel podem ser tambm representadas como linhas, uma vez
que podem permanecer abertas em algumas situaes, e tambm podem ser
entendidas como subproduto de modelos digitais de terreno, que so
campos. Finalmente, temos objetos adjacentes, e os exemplos tpicos
so todas as modalidades de diviso territorial: bairros, setores
censitrios, municpios e outros. So tambm exemplos mapas geolgicos e
pedolgicos, que representam fenmenos que cobrem toda a rea de
interesse. Neste caso, pode-se ter o compartilhamento de fronteiras
entre objetos adjacentes, gerando a necessidade por estruturas
topolgicas. Estes tambm so os casos em que recursos de representao
de buracos e ilhas so mais necessrios. Tambm objetos de linha podem
ter variadas formas de utilizao. Analogamente aos objetos de rea,
pode-se ter objetos de linha isolados, em rvore e em rede. Objetos
de linha isolados ocorrem, por exemplo, na representao de muros e
cercas em mapas urbanos. Objetos de linha organizados em uma rvore
podem ser encontrados nas representaes de rios e seus afluentes, e
tambm em redes de esgotos e drenagem pluvial. E podem ser
organizados em rede, nos casos de redes eltricas, telefnicas, de
gua ou mesmo na malha viria urbana e nas malhas rodoviria e
ferroviria. 1.1.1.2 Problemas de nomenclatura Um problema que
aflige a todos os usurios de SIG a grande variedade de diferentes
nomenclaturas para elementos vetoriais. A linha poligonal, conforme
definida, pode ser denominada de diversas formas em SIG e CAD:
linha, polilinha, arco, link, 1-cell, cadeia, e outras. Algumas
destas denominaes incluem consideraes topolgicas. Por exemplo, um
arco muitas vezes definido como um elemento que conecta dois ns e
que pode ter ou no uma direo, e n (ou 0-cell) uma denominao
alternativa para ponto ou smbolo. O mesmo ocorre com relao a
polgonos, denominados s vezes como reas, regies ou ainda 2-cells.
Quase sempre aparecem sutilezas com relao definio que sero
especificamente ligadas a aspectos da lgica de construo do software
SIG. Um SIG baseado em topologia, por exemplo, define reas ou
regies a partir de seqncias de arcos, que por sua vez conectam ns.
Um sistema desktop mapping poder impedir a utilizao de objetos
compostos por vrios polgonos. Um SIG baseado em SGBD relacional
poder permitir buracos, mas no permitir polgonos externos
adicionais.
5. 1.1.1.3 Tipos abstratos para dados vetoriais Ser apresentada
a seguir um breve resumo das definies da seo anterior, seguida da a
formulao de tipos abstratos de dados para suportar os dados
vetoriais. Esta formulao ser usada na descrio de algoritmos
geomtricos no restante deste captulo. Ponto: um ponto um par
ordenado (x, y) de coordenadas espaciais. Linha poligonal: Sejam v
v vn0 1 1, , , n pontos no plano. Sejam s v v s v v s v vn n n0 0 1
1 1 2 2 2 1= = = , , , uma seqncia de n - 1 segmentos, conectando
estes pontos. Estes segmentos formam uma poligonal L se, e somente
se, (1) a interseo de segmentos consecutivos apenas o ponto extremo
compartilhado por eles (i.e., s s vi i i =+ +1 1 ), (2) segmentos
no consecutivos no se interceptam (i.e., s si j = para todo i, j
tais que j i +1), e (3) v vn0 1 , ou seja, a poligonal no fechada.
Polgono: Um polgono a regio do plano limitada por uma linha
poligonal fechada. Estas trs entidades geomtricas bsicas podem ser
definidas em uma linguagem de programao usando tipos abstratos de
dados, conforme apresentado no Programa 1.1. Essa definio inclui
tipos abstratos para retngulos e para segmentos, que sero bastante
teis na indexao espacial e em alguns algoritmos geomtricos. No foi
definido um tipo abstrato especfico para polgonos, uma vez que
corresponde a poligonais em que o primeiro e o ltimo vrtices
coincidem. Para as poligonais, foi includo no tipo uma varivel
Retngulo, para armazenar os limites do objeto em cada eixo1 . 1
Este retngulo usualmente denominado retngulo envolvente mnimo
(REM), e o menor retngulo com lados paralelos aos eixos que contm o
objeto em questo.
6. Um grande problema para a implementao de rotinas geomtricas
est relacionado com a preciso numrica. Como se sabe, a representao
de nmeros no computador finita, uma vez que uma seqncia finita de
bits apenas consegue representar uma seleo limitada de nmeros de
ponto flutuante [Schn97]. Esta limitao em geral no considerada nos
desenvolvimentos tericos. O fechamento desta lacuna de preciso
deixado a cargo do programador, o que conduz a freqentes problemas
numricos e de topologia nas aplicaes reais. Assim, em muitas
situaes, para minimizar o problema de preciso e melhorar o
desempenho no tratamento da geometria, SIG e outros tipos de
sistemas optam por representar coordenadas por meio de variveis
inteiras2 . Isso viabiliza clculos mais robustos e precisos, mas em
contrapartida aparece a possibilidade de overflow numrico em
determinadas circunstncias. Em SIG, este problema torna-se ainda
mais complicado devido aos sistemas de coordenadas utilizados mais
freqentemente. O sistema UTM (Universal Transverso de Mercator),
por exemplo, divide o globo longitudinalmente em 60 fusos. Cada
fuso cobre 6 graus de longitude, e identificado por seu meridiano
central. Em cada fuso, um sistema cartesiano de coordenadas
estabelecido, usando metros como unidades. O eixo y (ou seja,
Norte) tem origem no Equador, e o eixo x (Leste) posicionado de
modo que a coordenada x seja equivalente a 500.000 metros sobre o
meridiano central. As coordenadas y, que no hemisfrio sul seriam
negativas, so somadas a um fator constante de 10.000.000 metros.
Assim, coordenadas UTM podem basicamente variar entre 0 e 1.000.000
metros em x, e entre 0 e 10.000.000 2 Esta opo tambm feita neste
trabalho, considerando principalmente que a alternativa mais usada
pelos SIG comerciais. estrutura Ponto incio inteiro x; inteiro y;
fim; estrutura Segmento incio Ponto p1; Ponto p2; fim; estrutura
Retngulo incio inteiro x1; inteiro y1; inteiro x2; inteiro y2; fim;
estrutura Poligonal incio inteiro numPontos; Retngulo
retnguloEnvolventeMnimo; Ponto[] vertice; fim; Programa 1.1 - Tipos
abstratos de dados para Ponto, Retngulo e Poligonal
7. metros em y. Para limitar a possibilidade de distoro na
projeo, no entanto, os valores x variam de fato apenas de 166.667 a
666.667 metros. Muitos SIG adotam inteiros de 32 bits, sem sinal,
para representar coordenadas. Isto permite valores entre 0 e
4.294.967.295. Valores decimais so geralmente representados pela
adoo de um nmero fixo de casas decimais, validos para todos os
dados grficos. Por exemplo, para representar coordenadas UTM com
preciso de 1 centmetro, pode ser estabelecido um fator de preciso
de 100. As coordenadas inteiras no mais representam metros, mas
centmetros. O SIG assume a responsabilidade de inserir o ponto
decimal na posio correta quando necessrio, mas todos os clculos
internos sero realizados usando as coordenadas inteiras. Com um
fator de 100, adequado para aplicaes urbanas, a faixa de
coordenadas efetivamente utilizveis passa a ser de 0 a
42.949.672,95, que corresponde a mais de 40.000 quilmetros
suficiente para dar a volta ao mundo, e claramente mais do que o
necessrio para representar um fuso UTM. No entanto, este limite nos
fora a prestar ateno a operaes de multiplicao envolvendo
coordenadas, ou valores derivados. Dependendo da ordem de grandeza
dos valores a e b, o numerador da Equao 1.8 pode exceder os limites
de representao. O valor de a pode se tornar arbitrariamente grande,
medida em que a reta se torna mais vertical. O valor de b tambm
pode ser grande, dependendo do valor de a e da ordem de grandeza
das coordenadas de um dos pontos extremos. Este problemas poderiam
ser resolvidos com uma mudana de eixos, mas o processo seria muito
complicado, computacionalmente intensivo e sujeito a erros. Seria
tambm possvel usar variveis de ponto flutuante para estas operaes,
mas neste caso estariam sendo introduzidos erros de arredondamento
e mais esforo computacional. Um enfoque alternativo apresentado em
[Schn97], onde so descritas as bases da geometria computacional de
preciso (ou resoluo) finita. A idia bsica consiste em apoiar as
coordenadas de quaisquer pontos ou vrtices em uma malha regular
baseada em valores inteiros. Qualquer ponto com coordenadas
fracionrias (por exemplo, um ponto de interseo entre segmentos)
deslocado para o n mais prximo desta grade regular. Este enfoque
robustece bastante o tratamento numrico das coordenadas de pontos e
vrtices, e ainda garante consistncia na representao topolgica. No
entanto, ainda no est presente em SIG comerciais. 1.1.2 Formulaes e
algoritmos bsicos 1.1.2.1 Tringulos e produtos vetoriais Diversos
problemas de geometria computacional utilizam resultados bsicos de
problemas mais simples em sua soluo. Alguns destes resultados
bsicos vm da anlise geomtrica do mais simples dos polgonos, e o
nico que sempre plano: o tringulo. rea. Uma vez que na representao
vetorial se trabalha com vrtices e suas coordenadas, a frmula
elementar da geometria para clculo da rea de um tringulo (a rea de
um tringulo igual metade do produto entre sua base e sua altura) no
muito prtica. Em vez dela, sero utilizados dois resultados
equivalentes da lgebra linear. O primeiro usa o produto de dois
vetores, que determina a rea de um
8. paralelogramo, o dobro da rea do tringulo que interessa.
Outro mtodo calcula a rea diretamente, por meio de um determinante
3x3. C B A U V Figura 1.1 - Produto vetorial dos vetores U e V,
equivalente ao dobro da rea do tringulo ABC O primeiro mtodo pode
ser descrito como se segue. Sejam U e V vetores. A rea do
paralelogramo com lados U e V U V (Figura 1.1). O produto vetorial
pode ser calculado a partir do seguinte determinante: ( ) ( ) ( ) i
j k x y z x y z y z z y i z x x z j x y y x kU U U V V V U V U V U
V U V U V U V= + + onde , , i j k so vetores unitrios nas direes x,
y e z respectivamente. Como se est tratando de vetores
bidimensionais, temos zU = zV = 0, e portanto a rea S do tringulo
dada por S x y y xU V U V = ( ) 2 Mas, na realidade, U = B - A, e V
= C - A. Portanto, a expresso acima pode ser reescrita como S x y y
x y x x y x y y xA B A B A C A C B C B C= + + 1 2 ( ) (1.1) A rea
calculada pela expresso acima ser positiva se os vrtices A, B e C
formarem um circuito em sentido anti-horrio, e negativa se formarem
um circuito no sentido horrio. A rea ser exatamente zero se os trs
vrtices estiverem alinhados.
9. A expresso acima pode ser tambm obtida quando se calcula o
determinante dos trs pares de coordenadas, substituindo a
coordenada z por 1: S x y x y x y x y y x y x x y x y y x A A B B C
C A B A B A C A C B C B C= = + + 1 2 1 1 1 1 2 ( ) (1.2) Tambm
neste caso a rea ser negativa se a seqncia de vrtices estiver
orientada em sentido horrio, e positiva caso contrrio. O clculo
efetivo da rea de um tringulo, em nmeros reais, desprezando o
sinal, pode ser feito usando a funo reaTringulo (Programa 1.2).
Como pode ser interessante obter a rea orientada, ou seja, com
sinal, o Programa 1.2 tambm inclui a funo reaOrientadaTringulo.
Coordenadas baricntricas. Para determinar se um determinado ponto
pertence ou no a um tringulo, utiliza-se um mtodo baseado em
coordenadas baricntricas [FiCa91]. Teorema 1.1 - Sejam p1, p2 e p3
pontos no colineares no plano. Ento cada ponto p do plano pode ser
escrito na forma p p p p= + + 1 1 2 2 3 3 (1.3) onde 1, 2 e 3 so
nmeros reais e 1 2 3 1+ + = . Os coeficientes 1, 2 e 3 so
denominados coordenadas baricntricas de p em relao a p1, p2 e p3.
Prova - Com as coordenadas dos pontos p, p1, p2 e p3, e a equao 1 2
3 1+ + = , constri-se um sistema de trs equaes e trs incgnitas para
encontrar as coordenadas baricntricas: 1 1 2 2 3 3 1 1 2 2 3 3 x x
x x y y y y p p + + = + + = + + = O sistema acima tem por
determinante exatamente aquele apresentado na Equao 1.2 e seu valor
corresponde ao dobro da rea do tringulo p1p2p3. A rea no-nula, pois
p1, p2 e p3 no so alinhados por hiptese. Assim, o sistema tem soluo
nica para cada p. funo reaOrientadaTringulo(Ponto A, Ponto B, Ponto
C): real incio retorne ((A.x*C.y - A.y*C.x + A.y*B.x - A.x*B.y +
C.x*B.y - C.y*B.x) / 2); fim; funo reaTringulo(Ponto A, Ponto B,
Ponto C): real incio retorne abs(reaOrientadaTringulo(A, B, C));
fim. Programa 1.2 - Funes reaTringulo e reaOrientadaTringulo
10. Os valores de 1, 2 e 3 podem ser obtidos usando a regra de
Cramer, e expressos em termos de reas de tringulos. Temos,
portanto: 1 2 3 1 2 3 = S pp p S p p p ( ) ( ) , 2 1 3 1 2 3 = S p
pp S p p p ( ) ( ) e3 1 2 1 2 3 = S p p p S p p p ( ) ( ) A anlise
do sinal das coordenadas baricntricas indica a regio do plano em
que se encontra p, em relao ao tringulo p1p2p3 (Figura 1.2).
Observe-se que, para isso, as reas devem ser orientadas, ou seja,
com sinal. p1 p2 p3 2 =0 3=0 1 =0 1 >0 2 >0 3 >0 10 3>0
1>0 20 1>0 2>0 3 0 A B C S = 0 Figura 1.3 - Posicionamento
relativo de ponto e segmento orientado Uma implementao possvel para
este teste est apresentada no Programa 1.4. Observe- se que, em
comparao com a funo reaTringulo, o clculo da rea est incompleto: no
h a necessidade de efetuar a diviso por 2. A mesma formulao vale
para determinar a posio relativa entre dois vetores U e V. Se o
resultado do produto vetorial U V for positivo, ento o giro de U a
V anti- horrio (Figura 1.4a); caso contrrio, o giro no sentido
horrio (Figura 1.4b). Tambm aqui, se o resultado for nulo,
significa que os vetores so colineares (Figura 1.4c). Este
resultado importante para a ordenao de raios no algoritmo de fecho
convexo de Graham [Sedg90] (vide seo 1.1.6). funo lado(Ponto A,
Ponto B, Ponto C): inteiro /* determina se C est direita, esquerda
ou alinhado com AB */ /* direita: retorna -1; esquerda: retorna 1;
alinhado: retorna 0 */ incio inteiro S; S = A.x*C.y - A.y*C.x +
A.y*B.x - A.x*B.y + C.x*B.y - C.y*B.x; se (S < 0) ento retorne
-1; se (S > 0) ento retorne 1 seno retorne 0; fim. Programa 1.4
- Funo lado
13. (a) U x V > 0 (b) U x V < 0 (c) U x V = 0 A C B U V A
B C V U A C B U V Figura 1.4 - Posicionamento relativo entre dois
vetores Com a funo lado, somada a um teste simples de coincidncia
de pontos, denominado sobre (Programa 1.5), pode-se implementar os
dois predicados da Tabela 1.1 (Programa 1.6) e, utilizando estes,
pode-se implementar alguns dos predicados relacionados na Tabela
1.2, como iguais, seEncontram, superpostos, alinhados e seTocam
(Programa 1.7). funo sobre(Ponto A, Ponto B): booleano /* testa se
A e B coincidem */ incio retorne ((P.x = A.x) e (P.y = A.y)); fim.
Programa 1.5 - Funo sobre funo em(Ponto P, Ponto A, Ponto B):
booleano /* testa se P est dentro de AB, mas no coincide com A ou B
*/ incio se (lado(A, B, P) = 0) /* P pertence reta AB */ ento incio
/* se AB no for vertical, testar em x; senao, em y */ se (A.x !=
B.x) ento retorne (((A.x < P.x) e (P.x < B.x)) ou ((A.x >
P.x) e (P.x > B.x)) ) seno retorne (((A.y < P.y) e (P.y <
B.y)) ou ((A.y > P.y) e (P.y > B.y)) ); fim ento seno retorne
falso; fim. funo extremo(Ponto P, Ponto A, Ponto B): booleano /*
testa se P coincide com um ponto extremo de AB */ incio retorne
(sobre(P, A) ou sobre(P, B)); fim. Programa 1.6 - Funes de comparao
entre ponto e segmento
14. No caso do predicado paralelos, a soluo mais simples
consiste em calcular e comparar os coeficientes angulares das retas
que contm os segmentos, tomando os cuidados necessrios para o caso
de retas verticais. Para evitar problemas numricos, pode-se usar a
formulao descrita abaixo. Para que a reta AB seja paralela reta CD,
devemos ter y y x x y y x x B A B A D C D C = funo iguais(Ponto A,
Ponto B, Ponto C, Ponto D): booleano /* testa se AB e CD so iguais
(coincidentes) */ incio retorne ((sobre(A, C) e sobre(B, D)) ou
(sobre(A, D) e sobre(B, C))); fim. funo seEncontram(Ponto A, Ponto
B, Ponto C, Ponto D): booleano /* testa se AB e CD se encontram (um
ponto extremo coincidente) */ incio se iguais(A, B, C, D) ento
retorne falso; retorne ((sobre(A, C) e no em(D, A, B) e no em(B, C,
D)) ou (sobre(A, D) e no em(C, A, B) e no em(B, C, D)) ou (sobre(B,
C) e no em(D, A, B) e no em(A, C, D)) ou (sobre(B, D) e no em(C, A,
B) e no em(A, C, D)); fim. funo superpostos(Ponto A, Ponto B, Ponto
C, Ponto D): booleano /* testa se AB e CD so alinhados e tm um
trecho em comum */ incio se ((lado(A, B, C) = 0) e (lado(A, B, D) =
0)) ento retorne (em(C, A, B) ou em(D, A, B) ou em(A, C, D) ou
em(B, C, D)); fim. funo alinhados(Ponto A, Ponto B, Ponto C, Ponto
D): booleano /* testa se AB e CD so alinhados e no tm um trecho em
comum */ incio se ((lado(A, B, C) = 0) e (lado(A, B, D) = 0)) ento
retorne (no em(C, A, B) e no em(D, A, B) e no em(A, C, D) e no
em(B, C, D)); fim. funo seTocam(Ponto A, Ponto B, Ponto C, Ponto
D): booleano /* testa se AB e CD se tocam */ incio se (alinhados(A,
B, C, D) ou superpostos(A, B, C, D)) ento retorne falso seno
retorne (em(C, A, B) ou em(D, A, B) ou em(A, C, D) ou em(B, C, D));
fim. Programa 1.7 - Funes iguais, seEncontram, superpostos,
alinhados e seTocam
15. e portanto ( ) ( ) ( ) ( )y y x x y y x xB A D C D C B A =
0 (1.4) Desenvolvendo, temos uma forma mais elegante, e mais
freqente na literatura: ( ) ( ) ( ) ( )x y y x y y x y y x y yA D C
B C D C A B D B A + + + = 0 (1.5) Note-se na Equao 1.5 que apenas
so realizadas operaes de multiplicao e subtrao, eliminando a
necessidade de testes para casos especiais, como retas verticais. A
implementao da funo paralelos est no Programa 1.8. dada preferncia
na implementao Equao 1.4, uma vez que, quando as operaes de subtrao
so realizadas antes da multiplicao, corre-se menos risco de
overflow. Observe-se os testes de alinhamento, superposio e
igualdade realizados no incio da funo, necessrios para eliminar as
outras trs situaes em que o coeficiente angular das retas tambm
coincide. Existem diversas maneiras de implementar o predicado
seInterceptam. A alternativa mais conveniente consiste em usar um
mtodo baseado no produto vetorial para detectar a interseo entre
dois segmentos, fazendo o exame dos tringulos que podem ser
formados por quaisquer trs dos quatro pontos extremos. Ser
utilizada para isso a funo lado, descrita anteriormente (Programa
1.4). Cuidados especiais devero ser tomados para garantir que a
interseo prpria. Se o ponto de interseo no pertence a pelo menos um
dos segmentos, diz-se que a interseo imprpria (Figura 1.6a). Quando
o ponto de interseo interior a ambos os segmentos, como na Figura
1.5, a interseo prpria. O conceito de interseo prpria em geral no
inclui o caso em que a interseo ocorre em um dos pontos extremos
(Figura 1.6b), que corresponde ao caso dos predicados seTocam e
seEncontram. funo paralelos(Ponto A, Ponto B, Ponto C, Ponto D):
booleano /* testa se A e B so paralelos */ incio se (alinhados(A,
B, C, D) ou superpostos(A, B, C, D) ou iguais(A, B, C, D)) ento
retorne falso; retorne (((B.y - A.y) * (D.x - C.x) - (D.y - C.y) *
(B.x - A.x)) = 0); fim. Programa 1.8 - Funo paralelos
16. C A B D P Figura 1.5 - Interseo prpria de segmentos C A B D
P (a) (b) C D A B Figura 1.6 - Interseo imprpria de segmentos A
implementao do teste de interseo entre dois segmentos pode ser
dividida em duas etapas [CLR90]. Inicialmente, utilizado um teste
rpido, para determinar se os retngulos definidos pelos segmentos se
tocam. Se os retngulos no se tocarem em x ou em y, os segmentos
tambm no tero interseo, mas no se pode afirmar o contrrio (Figura
1.7b). Este teste semelhante ao de interseo prpria. Os segmentos AB
e CD podero se tocar (Figura 1.7a) caso ( ) ( ) ( ) ( )x x x x y y
y y2 3 4 1 2 3 4 1 onde x min x x x max x x y min y y y max y y A B
A B A B A B 1 2 1 2 = = = = ( , ) ( , ) ( , ) ( , ) x min x x x max
x x y min y y y max y y C D C D C D C D 3 4 3 4 = = = = ( , ) ( , )
( , ) ( , ) ou seja, P = (x1, y1) e Q = (x2, y2) so respectivamente
o canto inferior esquerdo e superior direito do REM de AB, e P =
(x3, y3) e Q = (x4, y4) so, analogamente, os cantos do REM de CD
(Figura 1.7).
17. (a) (b) P' Q' P Q P' Q' P Q Figura 1.7 - Interseo de
retngulos envolventes mnimos A implementao deste teste, a funo
interseoRetngulos, est apresentada no Programa 1.9. O segundo
estgio consiste em verificar se os segmentos efetivamente se
interceptam. Isto ocorre quando os pontos extremos de um segmento
ficam de lados opostos da reta definida pelo outro, e vice-versa.
Os resultados do produto vetorial tm que ter sinais opostos (Figura
1.8a). Se apenas um dos produtos for nulo, ento um ponto extremo de
um segmento est contido na reta definida pelo outro (Figura 1.8b).
Se ambos os produtos forem nulos, os segmentos so colineares
(Figura 1.8c), com interseo (a possibilidade de colinearidade sem
interseo foi descartada pelo teste dos retngulos). O teste precisa
ser aplicado duas vezes, usando cada segmento como base, ou seja,
no basta verificar se C e D esto de lados opostos da reta definida
por AB, tambm preciso verificar se A e B esto de lados opostos da
reta CD. funo interseoRetngulos(Ponto A, Ponto B, Ponto C, Ponto
D): booleano incio Ponto P, Ponto Q, Ponto P1, Ponto Q1; P.x =
min(A.x, B.x); P.y = min(A.y, B.y); Q.x = max(A.x, B.x); Q.y =
max(A.y, B.y); P1.x = min(C.x, D.x); P1.y = min(C.y, D.y); Q1.x =
max(C.x, D.x); Q1.y = max(C.y, D.y); retorne ((Q.x >= P1.x) e
(Q1.x >= P.x) e (Q.y >= P1.y) e (Q1.y >= P.y)); fim.
Programa 1.9 - Interseo de retngulos envolventes mnimos
18. A BC D (a) (B-A) x (D-A) < 0 (B-A) x (C-A) > 0 A BC D
(b) (B-A) x (D-A) = 0 (B-A) x (C-A) > 0 A B C D (c) (B-A) x
(D-A) = 0 (B-A) x (C-A) = 0 Figura 1.8 - Verificao de interseo Para
implementar este teste, utiliza-se o teste de posicionamento
relativo entre ponto e reta (funo lado), gerando o predicado
seInterceptam (Programa 1.10). Nesta funo est contida uma chamada
ao teste rpido de interseo de retngulos, para que os produtos
vetoriais s sejam calculados caso estritamente necessrio. Se, em
alguma situao, o caso de interseo em um dos pontos extremos puder
ser considerado, basta incluir uma chamada s funes seEncontram e
seTocam, gerando uma nova funo, seInterceptamImprpria (Programa
1.11). O predicado restante, disjuntos, implementado com testes
para os demais casos, chegando a uma concluso por excluso: dois
segmentos so disjuntos se no so iguais, nem se encontram, nem se
tocam, nem so paralelos, nem se interceptam, nem se superpem
(Programa 1.12). funo seInterceptam(Ponto A, Ponto B, Ponto C,
Ponto D): booleano incio inteiro abc, abd, cda, cdb; se no
interseoRetngulos(A, B, C, D) ento retorne falso; abc = lado(A, B,
C); abd = lado(A, B, D); cda = lado(C, D, A); cdb = lado(C, D, B);
retorne ((abc * abd < 0) e (cda * cdb < 0)); fim. Programa
1.10 - Funo seInterceptam funo seInterceptamImprpria(Ponto A, Ponto
B, Ponto C, Ponto D): booleano incio retorne (seEncontram(A, B, C,
D) ou seTocam(A, B, C, D) ou seInterceptam(A, B, C, D)); fim.
Programa 1.11 - Funo seInterceptamImprpria
19. A funo seInterceptam serve para determinar, rapidamente e
com o mnimo de problemas numricos possvel, se um par de segmentos
tem interseo, o que suficiente em diversas situaes. O clculo das
coordenadas deste ponto de interseo exige um pouco mais de esforo.
A primeira e mais bvia soluo baseada em geometria analtica. Dados
dois pares de pontos, cada par definindo um segmento no plano,
deve-se deduzir as equaes das retas e resolver um sistema de duas
equaes e duas incgnitas, cuja soluo o ponto de interseo. A formulao
a seguinte: sejam AB e CD dois segmentos de reta quaisquer no plano
(Figura 1.5). A reta que passa por A e B tem a seguinte equao: y a
x b= +1 1 . (1.6) Como na reta AB temos y y x x y y x x A A B A B A
= , ento a y y x x B A B A 1 = e b y a xA A1 1= . O mesmo se aplica
reta CD, produzindo y a x b= +2 2 , (1.7) e a y y x x D C D C 2 = e
b y a xC C2 2= . Resolvendo o sistema formado pelas equaes 1.6 e
1.7, temos funo disjuntos(Ponto A, Ponto B, Ponto C, Ponto D):
booleano incio retorne (no iguais(A, B, C, D) e no seEncontram(A,
B, C, D) e no seTocam(A, B, C, D) e no paralelos(A, B, C, D) e no
superpostos(A, B, C, D) e no seInterceptam(A, B, C, D)); fim.
Programa 1.12 - Funo disjuntos
20. x b b a a = 2 1 1 2 e y b a b a a a = 2 1 1 2 1 2 (1.8) A
soluo para o sistema indica o ponto de interseo entre as retas AB e
CD, que no necessariamente pertence aos segmentos AB e CD. Assim,
um teste adicional necessrio para verificar se a interseo ou no
prpria. Isto pode ser feito verificando se ambas as coordenadas do
ponto de interseo P esto dentro do intervalo formado pelas
coordenadas dos pontos extremos de ambos os segmentos, ou seja: min
x x x max x xA B P A B( , ) ( , ) e min y y y max y yA B P A B( , )
( , ) e tambm min x x x max x xC D P C D( , ) ( , ) emin y y y max
y yC D P C D( , ) ( , ) . necessrio permitir a condio de igualdade,
nos testes acima, de modo a considerar o caso de retas verticais ou
horizontais. Portanto, para garantir que a interseo seja prpria,
ser ainda necessrio comparar diretamente o ponto de interseo com os
pontos extremos dos segmentos. Embora a formulao acima parea ser
uma boa maneira de resolver o problema, alguns obstculos e
inconvenincias persistem. Em primeiro lugar, um programa que
implemente esta formulao precisa lidar com a possibilidade de se
obter zero em um dos denominadores. Isto pode acontecer em trs
situaes: (1) a reta AB vertical (xA = xB), (2) a reta CD vertical
(xC = xD), ou (3) as retas AB e CD so paralelas (a1 = a2). Nos
casos (1) e (2), o ponto de interseo pode ser calculado de forma
trivial, aplicando a abscissa da reta vertical equao da outra reta.
No caso (3) fica claro que as retas no tm ponto de interseo, e
portanto o problema no tem soluo, i.e., no existe ponto de
interseo, prprio ou imprprio. Em todos os casos, no entanto, mas
problemas numricos ainda podem surgir quando o denominador quase
zero. Lidar com estas excees no cdigo pode ser problemtico, levando
ao desenvolvimento de programas menos robustos. Uma soluo um pouco
mais conveniente para o problema usa tambm a geometria analtica,
mas aplica uma representao paramtrica para os segmentos que evitar
as inconvenincias listadas acima. Esta formulao a seguinte: seja AB
um segmento de reta qualquer no plano. Seja U B A= um vetor
correspondente ao segmento. Qualquer ponto P ao longo da reta que
passa por A e B pode ser obtido a partir da soma vetorial P s A sU(
) = + , onde s denominado o parmetro da equao. Mas temos que P A(
)0 = , e P A U B( )1 = + = , e possvel chegar a qualquer ponto do
segmento AB variando s entre 0 e 1.
21. Analogamente, pode-se representar o segmento CD pela
expresso Q t C tV( ) = + , onde V D C= e t o parmetro. Um ponto de
interseo entre AB e CD aquele para o qual P s Q t( ) ( )= , e
portanto A sU C tV+ = + . Decompondo os pontos e os vetores em
coordenadas, temos novamente um sistema de duas equaes e duas
incgnitas em s e t, cuja soluo [ORou94]: ( ) ( ) ( )( ) s x y y x y
y x y y denom t x y y x y y x y y denom A D C C A D D C A A C B B A
C C B A = + + = + + ( ) ( ) ( ) (1.9) onde ( ) ( ) ( ) ( )denom x y
y x y y x y y x y yA D C B C D C A B D B A= + + + As coordenadas do
ponto de interseo I sero: ( ) ( ) x x s x x y y s y y I A B A I A B
A = + = + (1.10) mas a interseo somente ser prpria se 0 < s <
1 e 0 < t < 1. Observe-se que o valor de denom equivalente
expresso esquerda da Equao 1.5, e mais uma vez mais conveniente
implement-la sob a forma da Equao 1.4. Se denom for igual a zero,
ento os segmentos so paralelos e no existe ponto de interseo. No
caso, mais conveniente calcular o valor de denom e no utilizar a
funo paralelas para detectar este caso especial, uma vez que denom
ser utilizado no clculo de s e t. A implementao est no Programa
1.13. A funo pontoInterseo retornar um valor booleano, indicando se
existe ou no o ponto de interseo prprio, enquanto o ponto
propriamente dito, se existir, ser retornado na varivel I. Em uma
tentativa de evitar que o clculo seja feito inutilmente, ou seja,
para evitar que um ponto de interseo imprprio seja calculado,
inseriu-se no incio da funo um teste preliminar, usando o predicado
seInterceptam. Note-se tambm que os problemas numricos no so
totalmente eliminados com esta implementao. Ainda existe o risco,
por exemplo, de se ter um valor de denom exageradamente alto,
correspondente situao em que as retas so quase paralelas, podendo
gerar impreciso numrica no clculo de s e t. Faz sentido, portanto,
assumir o custo adicional do teste seInterceptam, que incorpora o
teste simples e seguro de interseo de retngulos, para evitar ao
mximo situaes numericamente problemticas.
22. 1.1.2.3 Robustez numrica das implementaes Como j
mencionado, um dos principais problemas que afetam os algoritmos
geomtricos a robustez numrica da implementao. Como se sabe, a
representao de nmeros reais em computador limitada, em termos de
preciso. No entanto, o desenvolvimento terico dos algoritmos
baseada na hiptese de que se dispe de operadores aritmticos com
preciso infinita, ignorando em sua concepo os possveis erros de
arredondamento. No momento da implementao prtica, o programador em
geral ignora este problema, e passa a conviver com uma srie de
problemas que so tratados caso a caso. Isso ajuda a explicar parte
da instabilidade de comportamento que infesta os SIG comerciais,
especialmente quando se trata de operaes sobre objetos geogrficos
vetoriais. A correo destes problemas feita, em geral, introduzindo
tolerncias em lugar de testes exatos. Por exemplo, a comparao se
denom = 0 na funo pontoInterseo pode ser implementada na prtica
como se denom < , para evitar overflow numrico na expresso
seguinte, e para diminuir provveis problemas de arredondamento.
Ainda assim, existe dvida sobre qual valor de utilizar. A concepo e
a descrio dos algoritmos apresentados na seo anterior procurou
evitar ao mximo possveis problemas numricos. Dentre todas as funes
apresentadas na seo anterior, apenas trs contm riscos relativos
robustez numrica de implementao: as funes lado, paralelos e
pontoInterseo Todas as outras funes que poderiam apresentar
problemas numricos, como em, superpostos e alinhados, utilizam
diretamente uma dessas funes. O problema funo pontoInterseo(Ponto
A, Ponto B, Ponto C, Ponto D, Ponto I): booleano incio real s, t,
denom; se no seInterceptam(A, B, C, D) ento retorne falso; denom =
((B.y - A.y) * (D.x - C.x) - (D.y - C.y) * (B.x - A.x)); se (denom
= 0) ento retorne falso; s = (A.x * (D.y - C.y) + C.x * (A.y - D.y)
+ D.x * (C.y - A.y)) / denom; t = - (A.x * (C.y - B.y) + B.x * (A.y
- C.y) + C.x * (B.y - A.y) / denom; se ((s > 0) e (s < 1) e
(t > 0) e (t < 1)) ento incio I.x = A.x + s * (B.x - A.x);
I.y = A.y + s * (B.y - A.y); retorne verdadeiro; fim seno retorne
falso; fim. Programa 1.13 - Funo pontoInterseo
23. numrico da funo lado est na exatido do teste de alinhamento
dos trs pontos, anlogo ao clculo da diferena entre inclinaes na
funo paralelos e ao clculo de denom em pontoInterseo. Seria possvel
estabelecer uma tolerncia para as comparaes nestas situaes? No caso
de aplicaes de SIG, a tolerncia precisaria variar de acordo com o
sistema de coordenadas e com a escala da representao. Uma
possibilidade tambm seria a determinao da tolerncia por parte do
usurio, considerando estes fatores, para cada camada de informao
vetorial. ORourke [ORou94] observa que a introduo generalizada de
tolerncias pode causar problemas em outras reas, como na deteco de
pontos coincidentes (funo sobre), e sugere que o nico mtodo
infalvel de soluo seria implementar os algoritmos usando nmeros
racionais, ao preo de tornar o cdigo excessivamente complexo.
Novamente, o caminho de soluo mais interessante parece ser o
proposto pela geometria computacional de preciso finita [Schn97],
mas ao custo de uma maior complexidade na implementao de funes
bsicas como as de interseo entre dois segmentos. 1.1.3 Interseo de
n segmentos Informalmente, este problema pode ser enunciado da
seguinte maneira: dados n segmentos de reta no plano, determinar se
existe alguma interseo entre quaisquer dois destes segmentos. Um
problema correlato seria: dados n segmentos de reta no plano,
determinar todas as intersees que ocorram. A idia para soluo do
primeiro problema vem da anlise de intervalos em uma dimenso.
Considere-se que, em vez de n segmentos, tenha-se n intervalos
entre nmeros reais, do tipo [xL, xR], onde x xL R . Uma soluo
exaustiva seria analisar todos os n2 pares de intervalos
existentes, comparando-os sempre dois a dois, e interrompendo o
processamento assim que a primeira interseo fosse detectada. No
entanto, uma maneira mais eficiente de resolver o problema
construir uma lista ordenada dos valores extremos dos intervalos,
tomando o cuidado de identific-los como sendo L ou R, de acordo com
sua situao no intervalo. Assim, no haver interseo alguma entre os
intervalos se e somente se a lista ordenada contiver uma seqncia
alternada de Ls e Rs: L R L R ... L R L R. Em qualquer outra
situao, pode-se afirmar que existe superposio entre algum par de
intervalos (Figura 1.9). Esta soluo tem complexidade computacional
da ordem de O(n log n), uma vez que dominada pela ordenao dos
valores extremos [PrSh88].
24. L LLL RRRR L RRR RLLL (a) (b) Figura 1.9 - Verificao de
interseo em intervalos na reta Em duas dimenses, o problema
torna-se um pouco mais complicado, j que no existe maneira de
produzir uma ordenao adequada para segmentos no plano. A tcnica
empregada clssica na geometria computacional, e denominada de
varredura do plano (plane sweep). Esta tcnica faz uso de duas
estruturas de dados bsicas, uma para registrar a situao da linha de
varredura (sweep line status), e a outra que registra eventos
ocorridos durante a varredura (event-point schedule). A idia
consiste em deslocar uma reta vertical pelo conjunto de segmentos,
buscando identificar inverses na ordem em que esta reta encontra
dois segmentos quaisquer. Para implementar esta idia, necessrio
definir uma nova relao de comparao, da seguinte forma: considere-se
dois segmentos s1 e s2 no plano, sendo que s1 no intercepta s2.
Diz-se que s1 comparvel a s2 se, para alguma abscissa x, existe uma
linha vertical que intercepta tanto s1 quanto s2. Assim, diz-se que
s1 est acima de s2 em x se, naquela abscissa, a interseo da reta
com s1 est acima da interseo da reta com s2. Esta relao denotada
como s1 >x s2. Na Figura 1.10, temos as seguintes relaes: s3
>v s2; s4 >v s3; s4 >v s2; s4 >w s2; s4 >w s3; s2
>w s3. s1 s 2 s 3 s4 v w Figura 1.10 - Relao de ordenao entre
segmentos
25. Com esta relao construda uma ordenao total dos segmentos,
que muda medida em que a linha deslocada da esquerda para a
direita. Nesse processo de varredura do plano, trs coisas podem
ocorrer: o ponto extremo esquerda de um segmento encontrado; o
segmento , portanto, inserido na ordenao; o ponto extremo direita
de um segmento encontrado; o segmento , portanto, retirado da
ordenao; um ponto de interseo entre dois segmentos s1 e s2 foi
encontrado; portanto, s1 e s2 trocam de posio na ordenao.
Observe-se que, para que s1 e s2 possam trocar de posio, necessrio
que exista algum x para o qual s1 e s2 so consecutivos na ordenao.
O algoritmo usa este fato, testando apenas elementos consecutivos,
medida em que novos eventos vo sendo detectados conforme descrito
acima. Portanto, necessrio operar duas estruturas de dados no
processo. A primeira (sweep line status) a responsvel por manter a
ordenao das intersees dos segmentos com a linha de varredura, e
usualmente implementada como um dicionrio [PrSh88] ou como uma
rvore red-black [CLR90]. As operaes que o sweep line status deve
suportar so insero (insere, complexidade O(log n)), excluso
(exclui, tambm O(log n)), e duas funes para determinar qual
segmento est imediatamente acima e imediatamente abaixo de um
segmento dado na ordenao (acima e abaixo, O(1)). A segunda
estrutura de dados (event-point schedule) responsvel por manter a
seqncia das abscissas que sero analisadas pela linha de varredura,
e implementada como uma fila de prioridades. Deve suportar as
clssicas operaes de incluso (insere), retirada do elemento de mais
alta prioridade (min) e uma funo que testa a presena de um
determinado elemento na estrutura (membro), todas com complexidade
O(log n). Inicialmente, as abscissas dos pontos extremos dos
segmentos so ordenadas e inseridas no event-point schedule. Em
seguida, as abscissas so retiradas a partir da menor, e so
realizadas as seguintes operaes: Se a abscissa corresponder a um
ponto extremo esquerda de algum segmento, inserir o segmento no
sweep line status. Verificar se existem intersees entre este
segmento e os segmentos que esto imediatamente acima e abaixo dele
na linha de varredura. Caso exista interseo, a abscissa do ponto de
interseo deve ser calculada e inserida no event-point schedule,
caso j no pertena a ele. Se for um ponto extremo direita, excluir o
segmento do sweep line status. Verificar se existem intersees entre
os segmentos que esto imediatamente acima e abaixo dele na linha de
varredura. Caso exista interseo (que estar necessariamente direita
do ponto extremo), a abscissa do ponto de interseo deve ser
calculada e inserida no event-point schedule, caso j no pertena a
ele. Se for um ponto de interseo entre dois segmentos, trocar a
posio destes segmentos no sweep line status. Informar a existncia
de um ponto de interseo e suas coordenadas.
26. O algoritmo final est delineado no Programa 1.14. Para
melhorar a legibilidade, foram omitidos detalhes da implementao e
uso das estruturas de dados bsicas, como as listas e a fila de
prioridades. procedimento interseoNSegmentos incio FILA A;
FILA_DE_PRIORIDADES E; SWEEP_LINE_STATUS L; Segmento s, s1, s2, s3,
s4; Ponto I; ordenar os 2N pontos extremos por x e y; organizar os
pontos extremos em uma fila de prioridades E; A = nil; enquanto (E
!= nil) faa incio p = min(E); se (p extremo esquerda) ento incio s
= segmento do qual p ponto extremo; insere(s, L); s1 = acima(s, L);
s2 = abaixo(s, L); se (seInterceptam(s1.p1, s1.p2, s.p1, s.p2))
ento insere(s1, s, A); se (seInterceptam(s2.p1, s2.p2, s.p1, s.p2))
ento insere(s, s2, A); fim seno incio se (p extremo direita) ento
incio s1 = acima(s, L); s2 = abaixo(s, L); se
(pontoInterseo(s1.p1,s1.p2, s2.p1,s2.p2, I)) ento se (I.x > p.x)
ento insere(s1, s2, A); exclui(s, L); fim seno incio /* p uma
interseo */ s1 = segmento que intercepta s2 em p; s2 = segmento que
intercepta s1 em p; /* sendo s1 acima de s2 esquerda de p */ s3 =
acima(s1, L); s4 = abaixo(s2, L); se (seInterceptam(s3.p1, s3.p2,
s2.p1, s2.p2)) ento insere(s3, s2, A); se (seInterceptam(s1.p1,
s1.p2, s4.p1, s4.p2)) ento insere(s1, s4, A); trocar s1 e s2 de
posio em L; fim; fim; /* processamento das intersees */ enquanto (A
!= nil) faa incio retira(s, s1, A); x = abscissa da interseo de s e
s1; se (membro(x, E) = FALSO) ento incio sada(Existe interseo entre
,s, e , s1); insere(x, E); fim; fim; fim; fim. Programa 1.14 -
Interseo entre N segmentos
27. Com relao complexidade deste algoritmo, observa-se que,
inicialmente, a operao de ordenao consome tempo O(n log n). As
operaes executadas a cada passo no event-point schedule consomem
O(log n), correspondente ao pior caso das trs operaes mutuamente
exclusivas que atuam sobre o sweep line status. O teste de interseo
propriamente dito (pontoInterseo) executado em tempo constante. O
nmero de iteraes do lao principal 2n + K, onde K o nmero de
intersees, o que corresponde ao nmero de eventos que so inseridos
no event-point schedule. O lao mais interno, de tratamento das
intersees, pode potencialmente ser executado a cada iterao do lao
principal, sendo portanto executado O(n + K) vezes. Como cada
execuo do teste de presena na fila de prioridades executada em
tempo logartmico, temos o tempo O(log(n + K)). Mas como K n O n = 2
2 ( ) , ento o tempo fica sendo simplesmente O(log(n)). Portanto, o
tempo total do lao externo O((n + K) log n) [PrSh88]. Com ligeiras
modificaes, o programa acima pode ser modificado para verificar se
existe alguma interseo entre os n segmentos. Neste caso, no
necessrio manter a fila de prioridades, pois a primeira interseo
detectada interromper o algoritmo, e o event-point schedule pode
ser implementado como um simples arranjo [CLR90]. Com isso, a
complexidade computacional cai para O(n log n), tendo sido
demonstrado que este resultado timo [PrSh88]. Em SIG, o algoritmo
de deteco de intersees entre n segmentos tem muita utilidade na
deduo de relaes topolgicas (como toca ou cruza), na deteco de
intersees entre poligonais, entre polgonos ou entre poligonais e
polgonos. Tambm serve para verificar a qualidade de dados
digitalizados, testando se uma dada poligonal ou polgono possui
auto-intersees indesejveis. 1.1.4 Simplificao de poligonais Muitas
entidades do mundo real podem ser modeladas como linhas ou, mais
genericamente, poligonais. Essas entidades so freqentes em bases de
dados geogrficas, onde correspondem tipicamente a cerca de 80% do
volume de dados vetoriais [McSh92]. So usadas para representar
feies tais como rios, estradas, ruas, linhas de transmisso e
adutoras. Os nomes dados pelos SIG comerciais a essas entidades, no
entanto, variam muito: linha, polilinha (polyline), line string,
arco, 1-cell, poligonal, cadeia (chain), e outros [Davi97]. A
complexidade das representaes lineares em SIG pode variar de
simples segmentos de reta (dois pares de coordenadas), como um
trecho de tubulao de esgoto, at poligonais contendo milhares de
pares de coordenadas, como um rio ou uma curva de nvel. Os
algoritmos que trabalham com poligonais3 so muito importantes para
os SIG, uma vez que diversas operaes bsicas, freqentemente
repetidas, so baseadas neles. Em particular, estamos interessados
em estudar problemas relacionados representao de objetos utilizando
poligonais, visando conseguir formas de representao mais simples e
3 Deste ponto em diante, ser utilizado o termo poligonal, em lugar
de simplesmente linha, para evitar confuso com a definio geomtrica
da linha reta (infinita).
28. compactas a partir de dados mais detalhados. Dentro desse
escopo, necessrio levar em considerao que uma das caractersticas da
poligonal em cartografia o fato de possuir sempre uma espessura
[Peuc75][Bear91], o que a distingue da linha geomtrica ideal.
1.1.4.1 Caracterizao do Problema Linhas poligonais so utilizadas em
muitas situaes para aproximar e representar vetorialmente os
limites de objetos complexos encontrados em aplicaes de
cartografia, SIG, computao grfica, reconhecimento de padres e
outros [ImIr86]. O problema de simplificao de linhas
particularmente importante em cartografia e SIG, e estudado
intensivamente desde os anos 60, quando ocorreram as primeiras
experincias com o uso de instrumentos de transcrio de mapas para o
computador, como a mesa digitalizadora. No processo de digitalizao
de linhas com esses instrumentos, freqentemente so introduzidos
vrtices em excesso, vrtices que, se descartados, no provocariam uma
alterao visual perceptvel na poligonal. Assim, um primeiro objetivo
para algoritmos de simplificao de linhas limpar
(significativamente, o verbo utilizado em ingls weed, capinar) a
poligonal de pontos claramente desnecessrios, do ponto de vista de
sua visualizao [Weib95], mantendo a qualidade de sua aparncia
grfica. Outro objetivo o de gerar uma nova verso da linha, uma
verso mais adequada para a representao do mesmo fenmeno geogrfico
em outra escala, menor que a escala original de digitalizao. Neste
caso, est sendo obtida uma generalizao da linha [McSh92]. Em uma
extenso deste enfoque, existe o interesse em organizar os vrtices
da poligonal de tal forma que seja possvel produzir, dinamicamente,
verses generalizadas adequadas para uma escala definida no momento
da visualizao [Oost93][OoSc95], conseguindo portanto gerar mltiplas
representaes geomtricas para o mesmo fenmeno sem introduzir dados
redundantes. No entanto, a utilizao de mtodos e algoritmos
desenvolvidos originalmente apenas pensando na reduo do nmero de
vrtices da linha podem no ser adequados para alcanar o objetivo de
generalizao [LiOp92], em geral por no conseguirem uma boa
representao geomtrica4 , e portanto devem ser analisados
cuidadosamente quanto a este aspecto. Medidas de proximidade.
Assim, o problema de simplificao de linhas consiste em obter uma
representao mais grosseira (formada por menos vrtices, e portanto
mais compacta) de uma poligonal a partir de uma representao mais
refinada, atendendo a alguma restrio de aproximao entre as duas
representaes. Essa restrio pode ser definida de vrias maneiras
[McMa86], mas em geral alguma medida da proximidade geomtrica entre
as poligonais, tais como o mximo deslocamento perpendicular
permitido (Figura 1.11a) ou o mnimo deslocamento angular permitido
(Figura 1.11b). Na Figura 1.11a, o vrtice 2 ser mantido, uma vez
que a distncia entre ele e a reta que passa pelos vrtices 1 e 3
superior permitida. Na Figura 1.11b, o vrtice 3 ser eliminado, uma
vez que o ngulo324 menor que o mnimo tolervel. Uma alternativa 4
Para auxiliar na manuteno do aspecto natural da poligonal, existem
enfoques que integram algoritmos de simplificao com algoritmos de
suavizao [McMa89].
29. mais rara a rea entre as poligonais (Figura 1.11c), onde se
estabelece um limite para ao deslocamento de rea. 4 1 2 3
deslocamento de rea mximo (c) 4 1 2 3 distncia mxima (a) 4 1 2 3
ngulo mnimo (b) Figura 1.11 - Medidas de proximidade para
simplificao de linhas Dentre todas as medidas possveis, a mais
utilizada a distncia perpendicular. Este fato provavelmente deriva
de trabalhos antigos, como o de Perkal ([Perk66] apud [Bear91]).
Perkal props o conceito de banda epsilon como sendo a regio ao
redor da poligonal que contm todos os pontos do plano situados a
uma distncia menor que ou igual a , em uma tentativa de simular o
comportamento da linha cartogrfica, que tem largura definida
[Peuc75]. Foi tambm definido que uma poligonal -convexa se todos os
pontos dela tivessem raio de curvatura superior a . Caso isso no
ocorra, a banda epsilon se auto-intercepta, indicando perda de
legibilidade. Este raciocnio valida o trabalho com distncias
perpendiculares, embora nos algoritmos que a utilizam no esteja
explcito qualquer teste de -convexidade5 . O conceito de banda de
tolerncia, apoiado no clculo de distncias perpendiculares,
utilizado em grande parte dos algoritmos de simplificao que sero
apresentados a seguir. Um problema eventualmente abordado na
literatura a escolha do parmetro de tolerncia (), e sua correlao
com a escala da representao simplificada. Uma regra freqentemente
utilizada em cartografia a chamada Lei do Radical [ToPi66], que
determina que o nmero de objetos a serem mantidos em uma operao de
generalizao deve ser proporcional raiz quadrada da mudana de
escala. Esta regra foi deduzida a partir da observao emprica da
tendncia apresentada pelos cartgrafos em manter aproximadamente
mesma quantidade de objetos em um mapa de determinada escala.
Considerando seu sucesso para esta finalidade prtica, foi tentada
sua adaptao para determinar a variao da tolerncia em funo da
escala, e para definir o nmero de segmentos a manter em cada
poligonal simplificada. No entanto, 5 Um algoritmo baseado nestes
conceitos foi implementado em um software chamado WHIRLPOOL
[Bear91], mas sua utilizao comprometida por sua tendncia em alterar
a topologia percebida das poligonais durante o processo de
generalizao, especialmente nas situaes em que canais estreitos e
pennsulas so estrangulados e ilhas inexistentes so formadas. Devido
a este problema, o algoritmo de Perkal no ser abordado por este
trabalho.
30. seu efeito incuo para o problema de simplificao, pois
conduz a uma seleo aleatria dos objetos e segmentos de poligonal
que sero mantidos, assumindo que a poligonal um conjunto de vrtices
equiprovveis [Butt85]. Assim, em generalizao a Lei do Radical
continua sendo til na determinao prtica de quantos objetos devem
ser mantidos pelo processo de generalizao embora no permita
determinar quais seriam estes objetos. Um enfoque mais interessante
o que determina a tolerncia com base no tamanho do menor objeto
visvel em uma determinada escala [LiOp92]. Este tamanho pode ser
dado em termos de uma distncia medida no espao de coordenadas do
mapa plotado, ou seja, em milmetros do papel, independente da
escala utilizada. Assim, definida uma correspondncia linear entre a
escala e a tolerncia linear adotada. No existe, contudo, consenso
sobre este critrio. Existem indicaes que o valor ideal seria funo
no apenas da escala, mas tambm da complexidade da poligonal
[Horn85][Butt89]. Por exemplo, um parmetro fixo poderia simplificar
suficientemente uma poligonal mais simples, e no simplificar
suficientemente uma poligonal mais complexa. Este fenmeno pode
ocorrer at mesmo dentro de uma dada poligonal, em situaes da
natureza que fazem com que a estrutura do fenmeno representado pela
poligonal mude. Apesar de todos os problemas relatados, a escolha
de um parmetro fixo de tolerncia parece ser mais indicado para
aplicaes prticas do que, por exemplo, a minimizao do nmero de
segmentos da poligonal [GHMS93], ou o acoplamento da distncia
linear com algum critrio de otimizao geomtrica [Crom88][CrCa91]. A
escolha do parmetro de tolerncia linear ideal ainda discutida, no
havendo consenso na literatura. Para aplicaes prticas, no entanto,
vai-se levar em especial considerao as necessidades da aplicao
proposta. Portanto, a escolha do parmetro de tolerncia, seja ele
linear, angular ou de rea, buscar eficincia geomtrica e
computacional na generalizao de poligonais para representao em
tela. Clculo de distncias ponto-reta. Grande parte dos algoritmos
de simplificao que sero apresentados a seguir necessita realizar de
maneira eficiente clculos de distncia entre um ponto dado e uma
reta definida por outros dois pontos. A maneira mais interessante
de calcular essa distncia utilizar o produto vetorial, conforme
apresentado na seo 1.1.2, para determinar a rea S do tringulo
formado por um ponto A e uma reta definida por outros dois (B e C),
de acordo com a equao 1.1. Assim, a distncia do ponto A reta
definida pelos pontos B e C pode ser calculada como: d S dist B C =
| | ( , ) onde dist(B, C) a distncia euclidiana entre os pontos B e
C, e o nico valor que tem que ser testado contra zero para evitar
erros numricos no processamento. Algoritmos hierrquicos e
no-hierrquicos. O resultado do algoritmo de simplificao pode ser
(1) uma nova poligonal formada por um subconjunto dos pontos da
poligonal original, ou (2) uma poligonal que formada por pontos
distintos dos que formam a poligonal original, exceo do primeiro e
do ltimo [ZhSa97]. No primeiro caso, se a aplicao de tolerncias
progressivamente menores simplesmente causam a incluso de novos
vrtices nova poligonal, o algoritmo dito hierrquico [Crom91]. Mais
formalmente, o algoritmo hierrquico aquele em que todos os
vrtices
31. selecionados para produzir uma poligonal de n vrtices sero
tambm selecionados quando for gerada uma poligonal com n+1 vrtices.
Na literatura existem propostas de utilizao de algoritmos
hierrquicos para construir bases de dados geogrficas independentes
de escala [BCA95][OoSc95]. Estes estudos indicam que os algoritmos
hierrquicos so mais eficientes na reduo do tempo operacional, j que
a simplificao fica reduzida a uma operao de recuperao de dados ou,
caso tenha sido formada uma estrutura de dados adequada, a uma
operao de pruning [Crom91]. Por outro lado, os algoritmos
no-hierrquicos tendem a produzir representaes mais eficientes, com
relao preservao de algumas caractersticas geomtricas da linha
[BCA95], de acordo com parmetros geomtricos estabelecidos na
literatura (vide seo 0). Classificao dos algoritmos. Uma
classificao dos algoritmos de simplificao de linhas foi proposta em
[McMa87a], considerando a poro da linha que processada a cada passo
(Tabela 1.3). Tabela 1.3 - Classificao dos algoritmos de
simplificao de poligonais Categoria Descrio Exemplos Algoritmos de
pontos independentes No consideram as relaes geomtricas entre
vrtices vizinhos; operam de forma independente da topologia k-simo
ponto [Tobl64] seleo aleatria de pontos [RSM78] Algoritmos de
processamento local Usam as caractersticas dos vrtices vizinhos
imediatos para determinar seleo/rejeio do ponto Jenks [Jenk81]
Visvalingam-Whyatt [ViWh93] Algoritmos de processamento local
restrito estendidos Pesquisam alm dos vizinhos imediatos, avaliando
sees da poligonal de cada vez. O tamanho das sees depende de
critrios baseados em distncias, ngulos ou nmero de vrtices Lang
[Lang69] Opheim [Ophe81] Algoritmos de processamento local
estendido irrestrito Pesquisam alm dos vizinhos imediatos,
avaliando sees da poligonal de cada vez. O tamanho das sees
limitado pela complexidade geomorfolgica da poligonal, e no por
critrios determinados no algoritmo Reumann-Witkam [ReWi74]
Zhao-Saalfeld [ZhSa97] Algoritmos globais Consideram a poligonal
inteira no processamento. Selecionam pontos crticos iterativamente.
Douglas-Peucker [DoPe73] A classificao acima no considera as
propostas includas em [PAF95], onde so apresentadas duas novas
formas de representao simplificada de poligonais. A primeira delas
a representao freqencial, baseada em sries de Fourier e wavelets,
que tentam capturar as tendncias oscilatrias presentes em alguns
tipos de linhas, como curvas de nvel e hidrografia. A segunda a
representao da poligonal com uma seqncia de
32. curvas algbricas (conjuntos de arcos cbicos), adequada para
estradas e outras feies construdas pelo homem. Esta adoo de
recursos diferentes para a simplificao de elementos diferentes
conduz necessidade de dividir a linha em sees que sejam
razoavelmente homogneas em relao a alguns parmetros geomtricos,
tais como sinuosidade, complexidade, homogeneidade local e
densidade de pontos. De modo geral, no entanto, os algoritmos de
simplificao existentes no conseguem captar este tipo de
comportamento da linha, com a possvel exceo dos algoritmos globais,
e ainda assim com problemas [ViWh93]. Avaliao da qualidade da
simplificao. A avaliao da qualidade da simplificao foi proposta por
McMaster [McMa86] com base em uma srie de medidas geomtricas. Estas
medidas so divididas em duas categorias: medidas de atributos de
uma nica linha, e medidas de deslocamento entre a poligonal
original e a poligonal resultante. So ainda divididas em grupos, de
acordo com a grandeza geomtrica que est sendo avaliada em cada
caso. Estas medidas esto listadas na Tabela 1.4. Tabela 1.4 -
Medidas para avaliao da qualidade da simplificao de linhas I.
Medidas de atributos lineares A. Dados sobre o comprimento 1. Razo
de mudana no comprimento da linha B. Dados sobre vrtices 2. Razo de
mudana no nmero de vrtices 3. Diferena do nmero mdio de vrtices por
unidade de comprimento 4. Razo de mudana do desvio padro de nmero
de vrtices por unidade de comprimento C. Dados sobre ngulos 5. Razo
de mudana da angularidade (somatrio dos ngulos entre vetores
consecutivos) 6. Razo de mudana da angularidade esquerda (positiva)
7. Razo de mudana da angularidade direita (negativa) 8. Diferena na
mudana angular mdia por unidade de comprimento 9. Diferena na
mudana angular mdia para cada ngulo individual 10. Razo de mudana
do nmero de ngulos positivos 11. Razo de mudana do nmero de ngulos
negativos 12. Diferena na mudana angular positiva mdia para cada
ngulo individual 13. Diferena na mudana angular negativa mdia para
cada ngulo individual D. Dados sobre curvilinearidade 14. Razo de
mudana do nmero de segmentos curvilneos (seqncias de ngulos
positivos ou negativos) 15. Razo de mudana da mdia do nmero de
segmentos curvilneos 16. Razo de mudana do comprimento mdio dos
segmentos curvilneos 17. Razo de mudana do desvio padro do
comprimento mdio dos segmentos curvilneos II. Medidas de
deslocamento linear E. Dados de diferenas vetoriais 18. Somatrio
das diferenas vetoriais por unidade de comprimento 19. Nmero de
diferenas vetoriais positivas por unidade de comprimento 20. Nmero
de diferenas vetoriais negativas por unidade de comprimento 21.
Somatrio das diferenas vetoriais positivas por unidade de
comprimento 22. Somatrio das diferenas vetoriais negativas por
unidade de comprimento F. Dados de diferenas poligonais 23.
Diferena de rea total (rea entre as poligonais)
33. 24. Nmero de polgonos-diferena positivos por unidade de
comprimento 25. Nmero de polgonos-diferena negativos por unidade de
comprimento 26. Diferena de rea positiva por unidade de comprimento
27. Diferena de rea negativa por unidade de comprimento G. Dados de
permetro 28. Permetro total das diferenas de rea (comprimento ao
redor dos polgonos de diferena) por unidade de comprimento 29.
Permetro total das diferenas de rea positivas (comprimento ao redor
dos polgonos de diferena) por unidade de comprimento 30. Permetro
total das diferenas de rea negativas (comprimento ao redor dos
polgonos de diferena) por unidade de comprimento Foram analisadas
em [McMa86] todas as 30 medidas listadas na Tabela 1.4, para 31
poligonais cartogrficas diferentes6 , com caractersticas
geomorfolgicas variadas. As poligonais foram inicialmente
digitalizadas e limpas, at que se tornassem, quando plotadas, cpias
fiis das linhas contidas nos mapas originais. Em seguida, o mesmo
algoritmo de simplificao (no caso, o algoritmo Douglas-Peucker) foi
aplicado a cada uma delas, com vrias tolerncias, obtendo-se as
medidas acima para cada situao. Ao final do processo, aps uma
anlise estatstica rigorosa, o autor concluiu pela possibilidade de
se reduzir o nmero de medies a apenas seis, que so suficientemente
descorrelacionadas para permitir uma comparao adequada. Estas
medidas so: Mudana percentual no nmero de vrtices: fornece uma
indicao do grau de compactao atingido, mas s pode ser usada para
verificar a qualidade da simplificao em conjunto com outras
medidas. Mais formalmente, pode ser definida como: MPCV n n = 100
onde n o nmero de vrtices da poligonal simplificada, e n o nmero de
vrtices da poligonal original. Mudana percentual no desvio padro do
nmero de coordenadas por unidade de comprimento: mede a
regularidade da insero de vrtices ao longo da poligonal, indicando
se a linha resultante assumiu uma densidade uniforme de vrtices em
relao linha original. Ou seja: MPCN n l n l = ( ) ( ) 100 onde l o
comprimento da poligonal simplificada, e l o comprimento da
poligonal original. 6 Neste e em outros estudos existe a preocupao
em utilizar naturally occurring lines, ou seja, poligonais usadas
para delimitar ou representar fenmenos que ocorrem na natureza,
considerando uma ampla gama de fenmenos: curso e esturio de rios,
linhas costeiras e curvas de nvel, por exemplo. Dentro de cada tipo
de fenmeno, busca-se selecionar poligonais com comportamento
variado. Por exemplo seriam includos tanto rios jovens, com muitos
meandros de curvatura brusca, quanto rios antigos, com curvas
suaves e em menor quantidade. Um estudo anterior que procurou
utilizar estes critrios foi [Mari79].
34. Mudana percentual na angularidade: avalia a reduo da
microssinuosidade aps a simplificao. Esta medida pode ser definida
como: MPCA ang v v v ang v v v i i i i n i i i i n= + + = + + = ( ,
, ) ( , , ) 1 2 0 3 1 2 0 3 100 onde ang uma funo que calcula o
ngulo definido por trs pontos (Figura 1.11b), que no caso utilizada
em segmentos consecutivos na poligonal simplificada e na poligonal
original. Deslocamento vetorial total por unidade de comprimento:
indica o deslocamento geomtrico total da linha com relao original.
Ou seja, DVT d v P l i i n = = ( , ) 0 1 onde P a poligonal
original, e a funo d calcula a distncia perpendicular entre um
ponto dado e uma poligonal (Figura 1.11a). Deslocamento de rea
total por unidade de comprimento: como a anterior, indica o
deslocamento geomtrico total da linha, s que considerando a rea
entre a poligonal simplificada e a original: DAT A P P l = ( , )
onde A uma funo que calcula a rea total entre duas poligonais
(Figura 1.11c), e l o comprimento da poligonal original. Mudana
percentual do nmero de segmentos curvilneos: quando processos de
suavizao so aplicados juntamente com a simplificao, muitos
segmentos curvilneos podero ser eliminados. Cada segmento curvilneo
caracterizado por uma seqncia de mudanas angulares (ngulos entre
segmentos consecutivos) direita ou esquerda. Esta medida indica o
grau de suavizao obtido na simplificao, pela eliminao de segmentos
curvilneos, e pode ser definida como: MPCS NSC NSC = 100 onde NSC e
NSC representam, respectivamente, o nmero de segmentos curvilneos
na poligonal simplificada e na original. Com base nas medidas
propostas em [McMa86], um estudo posterior [McMa87b] comparou nove
algoritmos, chegando concluso de que quatro deles apresentavam
comportamento superior: Douglas-Peucker, Opheim, Reumann-Witkam e
Lang. A avaliao visual, no entanto, indica que o algoritmo
Douglas-Peucker se comportou
35. melhor quanto ao deslocamento de rea. No entanto, o mais
computacionalmente complexo dos quatro. O artigo conclui que o
algoritmo de Lang mais adequado para certas tarefas de mapeamento
menos exigentes, tais como mapeamento temtico. Estes algoritmos, e
outros, sero apresentados em detalhes em seguida. Alguns algoritmos
de interesse especfico deste trabalho, tais como Visvalingam-Whyatt
e Zhao-Saalfeld, no fizeram parte do estudo, pois so mais recentes
do que ele. Algoritmos. Existem vrios algoritmos na literatura que
se propem a resolver o problema de simplificao de poligonais.
Conforme discutido na seo 0, a comparao entre os algoritmos no pode
se ater simplesmente anlise de sua complexidade computacional. So
muito importantes parmetros de avaliao da qualidade da representao
geomtrica resultante [Mari79][McMa86][Whit85], alm da avaliao do
grau de compactao atingido. Considerando as aplicaes em
generalizao, tambm necessrio avaliar as possibilidades de gerao de
estruturas de dados hierrquicas, para possibilitar a produo dinmica
de novas representaes. Em seguida sero apresentados alguns dos
algoritmos de simplificao de linhas propostos na literatura7 . A
seleo dos algoritmos foi feita com base na sua importncia histrica,
no grau de correo cartogrfica, em sua eficincia computacional, e
tambm com base na aplicabilidade ao problema de generalizao
dinmica. Em todas as descries abaixo, ser utilizada a letra n para
denotar o nmero de pontos na linha original, e n indicar o nmero de
pontos na linha simplificada. 1.1.4.2 k-simo vrtice [Tobl64] Este
algoritmo foi proposto por Tobler em 1964, para um experimento de
generalizao de mapas para a Marinha americana [Tobl64].
possivelmente o mais antigo algoritmo de simplificao conhecido, e
tambm o mais simples. A idia formar a nova poligonal selecionando
um vrtice a cada k, sendo k determinado pelo usurio, e desprezando
os demais. O grau de generalizao obtido bastante grosseiro, uma vez
que o algoritmo no considera qualquer fator geomtrico, correndo
portanto o risco de descaracterizar completamente a linha.
Observe-se que a mesma lgica utilizada para simplificar imagens
digitais, selecionando arbitrariamente um pixel a cada k, em um
processo conhecido como subamostragem [Jain89], que um caso
particular da reamostragem pelo mtodo do vizinho mais prximo,
quando se reduz o tamanho da imagem [Wolb90]. O mtodo tem tambm
pouco sucesso pois, apesar de ser simples, tende a provocar o
efeito de aliasing sobre a imagem. Complexidade computacional.
O(n/k) = O(n) 1.1.4.3 Vrtice aleatrio [RSM78] Proposto por Robinson
et al. [RSM78], este algoritmo pouco acrescenta ao do k-simo
vrtice. Parte do princpio de que a linha cartogrfica composta por
vrtices 7 So deixados intencionalmente de fora alguns algoritmos,
como os propostos em [Deve85], [Will78] e [Joha74], por no
acrescentarem elementos relevantes discusso.
36. equiprovveis [Peuc75][Butt85]. Trata-se de selecionar
aleatoriamente uma quantidade predeterminada (n) dos vrtices que
compem a poligonal, gerando desta forma uma nova poligonal
simplificada. Como no caso do k-simo vrtice, o algoritmo no
considera a geometria da linha, e tambm corre o risco de desprezar
pontos caractersticos. Complexidade computacional. O(n) 1.1.4.4
Jenks [Jenk81] Este algoritmo considera uma seqncia de trs vrtices
na linha, calculando a distncia do vrtice intermedirio reta
definida pelos outros dois [Jenk81]. Quando esta distncia inferior
a uma tolerncia dada, o vrtice central eliminado, e o algoritmo
reiniciado com o primeiro, o terceiro e o quarto vrtices. Se a
distncia exceder a tolerncia, o segundo vrtice mantido, e o
processamento recomea a partir dele (Figura 1.11a). Apesar de no
apresentar um tratamento mais sofisticado da geometria da linha,
este algoritmo consegue eliminar os vrtices efetivamente
desnecessrios, ou seja, que esto alinhados com os vrtices anterior
e posterior, e portanto so geometricamente dispensveis. Em
especial, este comportamento melhor caracterizado quando a
tolerncia bastante pequena. Uma variao interessante deste algoritmo
estabelece, como tolerncia, no a distncia do vrtice central ao
segmento formado pelos outros dois, mas sim o ngulo entre os
segmentos v1v2 e v1v3. Quando este ngulo estiver abaixo de um valor
dado, os pontos so considerados alinhados e v2 descartado, sendo
reiniciado o processamento em v3. Caso contrrio, v2 mantido, e o
processamento recomea por ele (Figura 1.11b). De acordo com
[McMa87a], Jenks posteriormente props uma variao desta rotina
angular considerando trs valores distintos de tolerncia,
denominados min1, min2 e ang. Se a distncia entre v1 e v2 for
inferior a min1, ou se a distncia entre v1 e v3 for inferior a
min2, ento v2 eliminado. Caso as duas distncias ultrapassem os
valores mnimos, ento testado o ngulo entre os segmentos v1v2 e v1v3
contra a tolerncia ang, da maneira descrita acima. Complexidade
computacional. O pior caso do algoritmo de Jenks ocorre quando
todos os vrtices so eliminados. Assim, cada iterao vai testar se o
vrtice vi (2 2 i n ) vai ser ou no mantido, calculando as distncias
dos vrtices entre v2 e vi reta definida por v1 e vi+1, totalizando
portanto i - 2 clculos de distncia. Este comportamento pode ser
traduzido pelo seguinte somatrio: ( ) ( ) ( ) ( )( ) ( )n i n n n n
i n = = 2 2 2 2 1 2 2 2 2 1 A complexidade computacional do
algoritmo de Jenks no pior caso , portanto, O(n2 ). O melhor caso,
por outro lado, ocorre quando nenhum vrtice eliminado. Nesta
situao, cada um dos n - 2 vrtices intermedirios testado uma nica
vez contra seus vizinhos imediatos, produzindo um clculo de
distncia ponto-reta. O algoritmo , assim, O(n) no melhor caso.
37. Observe-se que este comportamento o inverso do apresentado
pelo algoritmo Douglas- Peucker, que ser apresentado adiante, no
sentido de que seu pior caso ocorre quando elimina todos os
vrtices, e o melhor ocorre quando todos os vrtices so mantidos.
Sendo assim, este algoritmo poder ser mais eficiente que o
Douglas-Peucker em situaes de simplificao mnima, e est recomendado
para situaes em que o interesse seja simplesmente a eliminao de
vrtices alinhados, com tolerncia baixssima. 1.1.4.5 Reumann-Witkam
[ReWi74] Este algoritmo [ReWi74] utiliza, em cada iterao, duas
linhas paralelas a cada segmento da poligonal para determinar uma
regio de eliminao de vrtices. Naturalmente, a tolerncia
precisamente a metade da distncia entre as paralelas. A poligonal
analisada seqencialmente, sendo buscado o primeiro segmento que
intercepta uma das duas paralelas. Sendo vi vi+1 o segmento
localizado, o vrtice vi mantido e todos os intermedirios, entre o
vrtice inicial e vi, so descartados. 1 2 3 4 5 6 7 8 9 10 11 12 13
14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 (a) (b)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
26 27 28 29 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
22 23 24 25 26 27 28 29 (c) (d) Figura 1.12 - Algoritmo
Reumann-Witkam No exemplo da Figura 1.12, observe-se que, at o
vrtice v19, poucos vrtices haviam sido eliminados. Aplicando as
paralelas a partir de v19, na direo do segmento v19 v20, possvel
eliminar os vrtices v20 a v22 (Figura 1.12a). O processamento
retomado a
38. partir do vrtice v23 (Figura 1.12b), desta vez eliminando o
vrtice v24. Reiniciando de v25, elimina-se v26 (Figura 1.12c). O
processamento termina em seguida, eliminando v28 e terminando no
ltimo vrtice, v29 (Figura 1.12d). No total, doze vrtices foram
eliminados. O algoritmo Reumann-Witkam , segundo a classificao
proposta por McMaster [McMa87a], do tipo processamento local
estendido irrestrito, pois a verificao iniciada em um determinado
vrtice, e prossegue at que algum segmento tenha interceptado uma
das paralelas, ou at que a linha termine. Opheim [Ophe81] props uma
variao deste enfoque em que so impostos limites quanto seo da linha
que analisada, produzindo assim um algoritmo com processamento
local estendido restrito. So definidos uma distncia mnima (dmin) e
uma distncia mxima (dmax), que funcionam limitando, juntamente com
as paralelas, uma regio que contm todos os vrtices que sero
eliminados. Como no Reumann-Witkam, o processamento recomea no
primeiro vrtice do primeiro segmento que sai da regio limitada.
Esta variao apresenta a tendncia a preservar melhor a aparncia das
curvas, pois evita que vrtices muito prximos e vrtices muito
distantes do vrtice de partida sejam eliminados. Conseqentemente, o
grau de compactao ainda menor do que o que se pode alcanar com o
algoritmo Reumann-Witkam. Na Figura 1.13a apresentada a regio de
eliminao de vrtices do algoritmo Opheim. Qualquer vrtice que fique
dentro da rea marcada ser eliminado, a menos que seja o primeiro
vrtice de um segmento que intercepta as linhas paralelas. o caso do
vrtice v7 na Figura 1.13b, que no ser eliminado, e servir de ponto
de partida para a prxima iterao. O vrtice v6, tambm na Figura
1.13b, no ser eliminado pois est a uma distncia inferior a dmin com
relao ao vrtice de partida, v5. A mesma situao se repete a partir
de v7, pois v8 precisa ser mantido e v9 se torna o novo vrtice de
partida (Figura 1.13c). Partindo de v9, finalmente temos a eliminao
de v10. dm in dmax rea de eliminao de vrtices 1 2 3 4 5 6 7 8 9 10
11 22 23 (a) (b)
39. 1 2 3 4 5 6 7 8 9 10 11 22 23 1 2 3 4 5 6 7 8 9 10 11 21 22
23 24 (c) (d) Figura 1.13 - Algoritmo Opheim Complexidade
computacional. Como se pode perceber, cada vrtice considerado
apenas uma vez, buscando a interseo de segmentos da poligonal com
as retas paralelas. Caso a interseo ocorra, o procedimento
reiniciado a partir do ltimo vrtice analisado, mantendo o padro de
varredura. Assim, este algoritmo claramente linear sobre o nmero de
vrtices: O(n). O mesmo se aplica variao proposta por Opheim. Apesar
de eficiente computacionalmente, seu desempenho cartogrfico, por
outro lado, deixa bastante a desejar, pois tende a eliminar poucos
vrtices. Alm disso, tende a no eliminar pontos situados em curvas
mais abertas, como o vrtice v2 no caso do exemplo da Figura 1.12.
Por isso, este algoritmo foi posteriormente modificado por Roberge
[Robe85], que o robusteceu matematicamente com testes de linhas
crticas verticais e com uma verificao de pontos de inflexo. Roberge
props tambm um fator de extenso da linha crtica, visando permitir a
eliminao de vrtices em curvas de grande raio. 1.1.4.6 Lang [Lang69]
Este algoritmo, proposto por Lang [Lang69], requer dois parmetros
de entrada: uma distncia de tolerncia, semelhante do algoritmo de
Jenks, e um parmetro (p) de look- ahead, ou seja, uma quantidade de
vrtices que devem ser considerados a cada etapa do processo. Por
exemplo, se p for igual a 5, sero analisados os vrtices v1 a v6.
Nesse caso, ser calculada a distncia entre os vrtices v2, v3, v4 e
v5 reta que passa por v1 e v6. Se a alguma distncia obtida for
maior que a tolerncia, o algoritmo retrocede um ponto (no caso, at
v5) e recomea, se necessrio fazendo o mesmo enquanto existirem
vrtices intermedirios. Se todas as distncias intermedirias forem
menores que a tolerncia, os vrtices intermedirios so eliminados, e
o prximo passo ser iniciado no ltimo vrtice extremo encontrado,
considerando novamente p pontos frente. No exemplo da Figura 1.14,
foi necessrio recuar de v5 (Figura 1.14a) at v3, eliminando apenas
v2 (Figura 1.14d), uma vez que existiam em cada uma das etapas
intermedirias (Figura 1.14b e c) vrtices fora da faixa de
tolerncia. O algoritmo recomea a partir de v3, o ltimo vrtice
mantido, e vai analisar em seguida o trecho entre v3 e v8.
40. tolerncia 1 6 tolerncia 1 5 (a) (b) tolerncia 1 4 1 3 8
tolerncia (c) (d) Figura 1.14 - Algoritmo Lang Este algoritmo se
comporta bem do ponto de vista geomtrico [McMa87a], sendo capaz de
preservar razoavelmente as caractersticas da linha original. No
entanto, sofre a influncia do parmetro de look-ahead: valores
diferentes levaro a resultados diferentes. Apesar disso, sua
implementao interessante por fixar a quantidade mxima de pontos que
sero analisados a cada etapa, possibilitando um dimensionamento
esttico de memria em tempo de compilao, caso se limite o valor de
p. Com relao ao grau de compactao, observe-se que este algoritmo s
ser capaz de eliminar n n p vrtices, uma vez que, em cada intervalo
so preservados, no mnimo, os dois vrtices extremos. A manuteno dos
vrtices extremos de cada intervalo prejudica a aparncia final da
poligonal, pois sua seleo to arbitrria quanto a realizada pelo
algoritmo do k-simo vrtice. Complexidade computacional. O pior caso
ocorre quando nenhum ponto eliminado, e portanto o algoritmo
precisa fazer o look-ahead n p/ vezes e retroceder, em cada passo,
p 1 vezes. Em cada um dos n p/ passos, o algoritmo executa ( )( )p
p 1 2 2 clculos de distncia ponto-reta. Assim, o algoritmo O(n),
mas com um fator constante que cresce ao ritmo de O(p2 ).
Particularmente, quando n p= , teremos complexidade O(n2 ) para o
algoritmo. No melhor caso, todos os p 1 pontos intermedirios sero
eliminados na primeira passada, e portanto teremos p 1 clculos de
distncia para cada um dos n p/ passos, e portanto o algoritmo O(n).
Observe-se que temos um compromisso entre o tempo de
41. processamento, dependente de p, e o grau de compactao:
valores maiores de p possibilitaro uma compactao maior, mas
provocaro um aumento no custo computacional em relao ao caso
linear. Assim, a escolha do valor ideal para p dificultada, e
depender de uma anlise do processo de digitalizao com relao
quantidade de vrtices desnecessrios. 1.1.4.7 Douglas-Peucker
[DoPe73] Este o mais conhecido e utilizado algoritmo de simplificao
de pontos. Foi proposto em 1973 por Douglas e Peucker [DoPe73], e
reconhecidamente o melhor em termos de preservao das caractersticas
da poligonal original [Mari79][McMa87a], especialmente se utilizado
com tolerncias pequenas [ViWh90]. Curiosamente, o algoritmo foi
proposto quase que simultaneamente por Ramer [Rame72] e Duda e Hart
[DuHa73], embora visando aplicaes diferentes. O algoritmo
Douglas-Peucker permanece sen