of 109 /109
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;

Algoritmos geometricos

Embed Size (px)

DESCRIPTION

 

Text of Algoritmos geometricos

  • 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