4. Hvem kan håndheve forbudet?
4.3. Den militære politimyndigheten
Nesta seção são apresentadas as té ni as utilizadaspara a implementação dainter-
fa egrá a.Oobjetivodainterfa egrá anestetrabalhoéaexibiçãodalo alização
doveí ulo durante o trajeto dentro doCampus daUFMG. Para isso, um mapa do
Campus UFMGfoiobtidojuntoaoDepartamentode PlanejamentoFísi oe Obras.
Ainterfa egrá afoi onstruídanoambienteVisualC++utilizandoaAPIOpenGL
eté ni as de geometria omputa ionalimplementadas nabibliote aCGAL. Os de-
talhesda implementaçãoserão apresentados a seguir.
5.2.1 Ferramentas Utilizadas
Emrobóti amóvelé omumquesedesejeutilizarevisualizarinformaçõesdemapas
da região onde o rob se lo omove. Porém, a visualização da lo alização do rob
nomapa setornadifí ilsea regiãoexibida forarepresentação de umagrandeárea.
utilizadaspara a implementação de um algoritmoque armazena as informações do
mapaemuma estrutura dedados esele ionaossegmentosque estãodentrode uma
área emtorno dalo alizaçãodo veí ulo.
O mapa utilizado neste trabalho onsiste em uma planta baixa das ruas e
prédiosdoCampusdaUFMGreferen iadoem oordenadasUTM.Oarmazenamento
do mapa no omputador foi feito por meio dos segmentos de reta presentes nesse
mapa,queformamasruaseprédiosdoCampus. Omapafoioriginalmenteobtidono
formato.dwg, extensão de um arquivo produzidopeloprograma AutoCad. Nesse
programaépossíveldesenharsegmentos, ír ulos,ar os,retângulos,ouseja,diversas
formas geométri as. Para a onfe ção da interfa e, um requisito era que todo o
mapa fosse representado apenas por segmentos. Assim, foi ne essário en ontrar
uma ferramentaque zesse essa onversão.
A onversão do arquivo .dwg em segmentos foi feita utilizando o software
FEMM 4.0, que permite importar arquivos do tipo .dxf (outra extensão padrão
do AutoCad) e onverter as formas em segmentos. Esse software é geralmente
utilizadoparase onstruirmalhasdeelementosnitoseumaetapaintermediáriada
onstruçãodessas malhaséa riaçãode um arquivo.poly,que ontém ades rição
de todos os segmentos que ompõem o desenho. A vantagem desse método é que
o formato de dados do arquivo .poly 1
é de simples ompreensão e extração da
informação. Além disso, o software FEMM é apaz de onverter todas as formas
geométri asdoarquivoDXFemsegmentosdereta(os ír ulosear os,porexemplos,
são de ompostos empequenos segmentos). A desvantagem dessa ferramentaé que
elanão suportaarquivosDXFmuito grandes, om muitainformação, omoéo aso
dos mapas, e, porisso, foi ne essário dividiro mapa em vários arquivos e reuní-los
apenas naetapa daleitura dos arquivos.
Apósa deniçãodo formatodainformação,foi ne essáriodeterminar osseg-
mentos queestão dentro ouinter eptam uma sub-janela aoredor da lo alizaçãodo
veí ulonomapa(Figura5.2). Umaalternativaparaaseleçãodessessegmentosseria
per orrertodosossegmentosque ompõemomapaebus ar,dentreeles,aquelesque
obede erem à ondição. Porém, esse método seria ine iente, pois gastaria muito
tempoparaser exe utado. Dessaforma,foine essário utilizarumaestruturade da-
dosquepudessearmazenarossegmentosdeformaafa ilitarabus a. Existemalguns
métodose ientes paralidar omojanelamentodesegmentos[de Berg etal.,2000℄.
Esses métodos são apresentados noApêndi e C, onde pode-se en ontrar, também,
detalhes sobre o algoritmosele ionado para este trabalho - a Árvore de Segmentos
(Segment Tree).
Figura5.2: Exemplodabus ade segmentos queestão ontidosouinter eptamuma
janela.
5.2.2 Construção da Interfa e de Exibição do Mapa
Conformemen ionadonaseçãoanterior,oalgoritmodaSegmentTreefoisele ionado
para o armazenamento e bus a dos segmentos do mapa. Com esse algoritmo é
possível onstruiruma árvorebinária om oslimitesdos segmentosdomapa eobter
umabus a dos segmentosque estão ontidos emuma janelaretangular a um baixo
usto omputa ional (ver Apêndi e C).
Asfunçõesne essáriaspara setrabalhar omuma Segment Tree estão imple-
mentadas emuma lasse nabibliote aCGAL(Computational Geometry Algorithms
Library), uma bibliote a de lasses para uso das té ni as de geometria ompu-
ta ional em C++. A lasse Segment_tree_map_traits_2 2
possibilita armazenar
os segmentos que são forne idos pelo mapa em intervalos e os intervalos em uma
árvore de segmentos. A árvore é onstruída através do omando Segment_tree
_2.make_tree(InputList.begin(),InputList.end()),ondeInputListéumalistade in-
tervalos (ossegmentos domapa).
A implementação da CGAL para a Segment Tree apresenta algumas restri-
ções. Para quesepossa inserirumsegmentonaárvore,eledeveser res enteem
x
e emy
. Emummapa nãoépossíveldeterminaraposiçãoeorientaçãodos segmentos -issodepende,obviamente, doterrenomapeado. Dessaforma,algumasadaptaçõesno ódigo foram ne essárias. Considerando que (
x
1
,y
1
) e (x
2
,y
2
) são as oordena- das das extremidades(endpoints)de um segmento,existem três situaçõesemque osegmentonão seria a eito pela lasse:
• x
1
>x
2
ey
1
>y
2
;• x
1
<x
2
ey
1
>y
2
;• x
1
>x
2
ey
1
<y
2
.A primeira situação é simples de ser resolvida, pois tanto a oordenada
x
quanto ay
de res em, então, basta inverter os pontosx
1
omx
2
ey
1
omy
2
para queo intervaloseja res ente. A segunda e ater eira situações são um pou o maisompli adas,poisenquanto emum dos eixosa oordenada res e,nooutro eixoela
de res e.
Para solu ionar esse problema, os segmentos identi ados em uma dessas
duassituaçõesforamarmazenados emuma listaseparadade segmentosde entrada,
tendosuas oordenadasemxespelhadasemtornode
x = 0
. Essalistade segmentos invertidos foi armazenada emuma árvore separada.A operação de bus a dos segmentos que estão dentro ou in-
ter eptam uma determinada janela é feita utilizando o omando Seg-
ment_tree_2.window_query(a,std::ba k_inserter(OutputList)), onde a re-
presenta o intervalo que ontém a janela de bus a e OutputList é a lista dos
segmentosque estão dentrodajanela ouinter eptam seus limites.
Para ossegmentosque foramespelhados,a janelade bus atambémpre isou
ontidos na janela. A Figura 5.3 ilustra a utilização do espelho do segmento e da
janelapara torná-loválido para a lasse.
Figura5.3: Segmentos originaiseespelhados -aoperação de espelhamentopossibi-
litaouso daCGAL.
Outro problema o orre quando há segmentos horizontais ou verti ais. Para
fazer om queesses segmentossejam válidos,uma pequena perturbação emum dos
pontos da oordenada inválida foi introduzida, de forma que eles assem ligeira-
mente res entes, eliminando o problema.
A segunda etapa da implementação onsistiuda es olha daforma mais ade-
quada de se onverter as informações do mapa em segmentos que pudessem ser
trabalhados no programa desenvolvido. Como des rito na seção anterior, a meto-
dologia adotada foi a onversão do arquivo DXF em arquivo .poly, por meio do
programa FEMM 4.0.
Oprogramadesenvolvidoéresponsávelporleroarquivodeentrada, onstruir
aárvore de segmentos, bus ar os segmentos dentrode uma janelade tamanhopré-
denidoe om entronopontoemqueselo alizaoveí uloeexibiressasinformações
gra amente emuma janela. A árvore de segmentos é onstruída apenas uma vez,
no iní io da exe ução do programa. A bus a é realizada sempre que o programa
responsável pela exibição da interfa e re ebe um valor de lo alizaçãodo programa