33. FEJEZET - EGYSZERŰ ALGORITMUSOK II - POLIGONOK (GIS,térinformatika,térkép,geodézia)


   
 
 

33. FEJEZET - EGYSZERŰ ALGORITMUSOK II - POLIGONOK

 
Tartalom
<<< Előző fejezet               Következő fejezet >>>
 

 

33. Fejezet - EGYSZERŰ ALGORITMUSOK II - POLIGONOK

Magyar változat: Sárközy Ferenc, Budapesti Műszaki Egyetem

 

A. BEVEZETÉS

B. POLIGON TERÜLET

Célkitűzés

Módszer

Problémák

Több poligon területének egyidejű számítása

C. PONT A POLIGONBAN ALGORITMUS

Célkitűzés

Általánosítás

Stratégia

Minta program

Különleges esetek

Bizonytalan határok

Sok pont sok poligonban

D. A CENTROID HELYZETE

Módszer

E. VÁZ

Alkalmazások

IRODALOM

ELLENŐRZŐ KÉRDÉSEK

 

 

 

MEGJEGYZÉSEK

 

 

33. Fejezet - EGYSZERŰ ALGORITMUSOK II - POLIGONOK

Magyar változat: Sárközy Ferenc, Budapesti Műszaki Egyetem

 

A. BEVEZETÉS

- az előző fejezet két vonal metszéspontjának meghatározására szolgáló egyszerű algoritmust ismertetett

- a jelen fejezet egy második egyszerű algoritmust és néhány kiterjesztést tekint át

 

B. POLIGON TERÜLET

Célkitűzés

- keresd meg egy töréspontjaival adott poligon (zárt sokszögvonal) területét

Módszer

- közismert módszer annak az algoritmusnak a használata, amely megadja azon szomszédos trapézok területösszegét, melyeket az alábbi vonalak határolnak:

- egy vonalszakasz

- az x tengelyig lehúzott függőleges vonalak

- az x tengely

33.1. ábra - Trapéz területszámítás

1. Bocsáss le az x tengelyig tartó függőlegeseket két szomszédos töréspontból

- számítsd ki a trapéz területét, amely a meghatározás szerint

A = (x2-x1) * (y2+y1) / 2

- azaz a terület az x-ek különbségének szorzata az y-ok átlagával

2. Folytatva a poligon minden oldalára, határozd meg valamennyi oldal által határolt trapéz területét

3. Összegezd az összes trapéz területét, hogy megkaphasd a poligon által határolt területet:

- megjegyzés: zárt sokszögről lévén szó (xn+1,yn+1) = (x1,y1)

A = S [(xi+1-xi) * (yi+1+yi) / 2 ]

- ha xi+1 < xi , akkor a részösszeg negatív

- ennek köszönhetően az alsó trapézok kivonódnak a területösszegből és végeredményben A magának a poligonnak a területét szolgáltatja

Problémák

- az algoritmus jól működik akkor is, ha a poligonnak be-, vagy kitüremkedései vannak

- nem működik viszont, ha a poligonoldalak metszik egymást (pl. 8-as alakú)

 

- ha a poligon az óramutató járásával ellentétes értelemben van digitalizálva, úgy a terület negatívnak adódik

- problémát okoz, ha a poligon y értékei negatívok

- nem lehet a pontokat "le"vetíteni az x tengelyre

- megoldások:

- adj hozzá egy megfelelően nagy számot minden y-hoz

- a legalacsonyabb y alatti x-szel párhuzamos tengelyre történjen a levetítés

- olyan vetületi rendszerekben is, melyek sokszámjegyű koordináta értékeket szolgáltatnak a számítógép kerekítési hibáinak eredményeként, a pontosság csökken

- kis poligonoknál kis koordináta értékekkel érdemes dolgozni

- megoldás

- ideiglenesen el kell tolni a koordináta-rendszer kezdőpontját olymódon, hogy közel kerüljön a töréspontokhoz

- ez csökkenti a koordináta értékeket

Több poligon területének egyidejű kiszámítása

- ha a poligon oldalak egyidejűleg egy jobboldali J és egy baloldali B poligont is határolnak

- elvégezhetők valamennyi oldal számára a trapézszámítások

- minden poligonra vonatkozóan megnyitásra kerül egy folyamatos összegző

- a B poligonok számára a részösszeg negatív

- a J poligonok számára a részösszeg pozitív

- valamennyi oldal feldolgozása után megkapjuk valamennyi poligon területét

- a "külvilág" területe egyenlő lesz a poligonok összterületével, negatív előjellel véve

 

C. PONT A POLIGONBAN ALGORITMUS

Célkitűzés

- azt kell meghatározni, hogy egy adott pont egy adott poligonon belül vagy kívül helyezkedik-e el

Általánosítás

- keresd meg, hogy egy poligoncsoportból melyik tartalmazza egy pontcsoport valamennyi egyedét

- példák

- a megyehatárokat tartalmazó file ismerétében határozd meg, hogy melyik megyében található, a fogyasztók listáján koordinátáikkal megadottak mindegyike

- azonosítsd az attribútumait annak a földhasználati poligonnak, amelyben egy adott ház található

- jelölések

- a pont (u,v)-ben található

- a poligonnak n csúcspontja van: (xi,yi), i=1,...,n, és zárt, mivel (xn+1,yn+1) = (x1,y1)

Stratégia

1. Rajzolj egy függőleges egyenest a ponttól fölfelé a végtelenbe

2. Számold meg, hogy hányszor metszi az egyenes a poligon határát

- ha a szám páratlan, akkor a pont belül van

- ha a szám páros, akkor a pont kívül van

 

Mintaprogram - Egyszerű "pont a poligonban" program

ni = +1

for i=1 to n

if xi+1 <> xi then (A)

if (xi+1-u) * (u-xi) >= 0 then (B)

if xi+1 <> u or xi <= u then (C)

if xi <> u or xi+1 >= u then (D)

b = (yi+1-yi) / (xi+1-xi)

a = yi-b * xi

vi = a+b*u

if vi > v then

ni = ni*(-1)

end if

end if

end if

end if

end if

next i

 

- b az (xi,yi) kezdőponttól az (xi+1,yi+1) végpontba tartó egyenes meredeksége

- behelyettesítve x=u -t az y=a+b*x egyenletbe, megkapjuk a kérdéses egyenes és a ponton átmenő (x=u) függőleges metszéspontjának y koordinátáját

- ezután, ha vi > v , akkor a metszésnek a pont fölött kell lennie és a vizsgálat folytatódhat

- az ni változó váltogatva veszi fel a +1 és -1 értékeket

- ha a program metszéspontot talál, akkor vált

- a végén ni=-1, ha a pont belül van és ni=+1, ha kívül

Különleges esetek

- az A-tól D-ig terjedő programsorok a különleges eseteket kezelik a következők szerint

A. ha az (xi,yi) -ből (xi+1,yi+1)-be tartó egyenes függőleges, akkor nem lehet metszés

B. metszést mutat, ha az i. pont az u -n átmenő függőleges egyik oldalán van, míg az (i+1). pont a másikon

C. D. ha akár (xi,yi), akár (xi+1, yi+1) pontosan rajta van a ponton átmenő függőlegesen, azaz a keresett pont pontosan egy töréspont alatt van, a számlálás hibázhat:

- a probléma megoldása a következő:

- ha (xi,yi) pontosan a függőlegesen fekszik, csak akkor számolunk metszéspontot, ha (xi+1,yi+1) jobbra fekszik, vagy

- ha (xi+1,yi+1) fekszik pontosan a függőlegesen, csak akkor számolunk metszéspontot, ha (xi,yi) tőle balra fekszik

Poligon izolált szigetekkel

- jól működik

A poligonban van egy lyuk, s benne egy sziget

- jól működik

Konkáv poligonok

- jól működik

Mi van akkor, ha a pont a poligon határára esik?

- egyes "pont a poligonban" algoritmusok explicit módon tárgyalják ezt az esetet, az ismertetett algoritmus azonban nem vizsgálja külön ezt a helyzetet, ezért

- ilyen esetekben néha belül, máskor kívül fekvőnek találja a pontot

Bizonytalan határok

- Blakemore (l. Blakemore, 1984) általánosítja a pont a poligonban algoritmust ún. fuzzy-határok esetére:

- a határ elhelyezkedése bizonytalan

- azt feltételezzük, hogy a határ köré rajzolt e szélességű sáv tartalmazza a határ ismeretlen valódi helyzetét

- ezután a pontok négy kategóriába oszthatók: "biztosan kívül fekvő", "valószínűleg kívül fekvő", "valószínűleg belül fekvő", "biztosan belül fekvő"

Sok pont sok poligonban

- a poligonokat valószínűleg ívek szerint tárolják

- vizsgáld meg valamennyi ívet azokkal a függőlegesekkel való metszés szempontjából, melyeket minden pontból fölfelé húzunk

33.2. ábra - Sok pont sok poligonban

- ha egy, az A és B poligonokhoz egyaránt tartozó ívet metsz a függőleges, akkor a metszés tényét mind az A, mind a B poligonhoz fel kell jegyezni, függetlenül attól, hogy az ív melyik oldalán fekszik

- ez minden pont/poligon kombináció számára egy számlálót igényel

- nem igazán hatékony

- egy jobb algoritmust ismertetünk az alábbiakban

- amikor egy ívet metsz egy függőleges, tárolni kell a metszéspont y koordinátáját, valamint az ív alatti poligon nevét (ha az ív irányítottsága Nyugatról Kelet felé mutat, a jobboldali poligonét, ellenkező irányítottság esetén a baloldaliét)

- minden pont számára nyilván kell tartani:

(a) a legalsó megtalált metszéspontot, és

(b) az ez alatt a metszéspont alatti poligon nevét

- miután minden ív vizsgálata megtörtént, megállapítható a legalsó metszéspont, az alatta lévő poligon a pontot tartalmazó poligon

- minden pont vonatkozásában csak két dolgot kell tárolni

- ha nem végzünk el bizonyos előzetes rendezéseket, továbbra is minden pontról minden ívet meg kell vizsgálni

 

D. A CENTROID HELYZETE

33.3. ábra - Példák centroid helyzetekre

- a centroid potenciális haszna abban van, hogy mint középpont képviseli a poligont

- a centroidot úgy határozhatjuk meg, hogy az az a pont, amelyben tetszőlegesen felfüggesztve a poligon egyenletes vastagságú furnér lemezből kivágott makettjét, ez utóbbi nyugalomban marad

- sajnos a centroid nem mindig a poligonon belül helyezkedik el, ez korlátozza középpont jellegű használhatóságát

- bizonyos programok a centroidot a töréspontok koordinátáinak átlagából számolják, az így kapott érték azonban nem azonos a fentiekben meghatározott centroiddal (a meghatározás szerint ugyanis a centroid a síkidom súlypontja, míg a koordináta-átlagok a ponthalmaz súlypontját szolgáltatják s a kettő nem ugyanaz)

Módszer

- a jobb algoritmus, a területszámításhoz hasonlóan, a koordináta-tengelyekre bocsájtott függőlegesekkel trapézokat hoz létre

- mivel minden trapéz egy háromszögből és egy téglalapból áll, ezek centroidjainak súlyozott átlagából a poligon centroidja meghatározható

- Centroid képlet

X = S [(yi - yi+1) (xi2 + xixi+1 + xi+12)/6A]

Y = S [(xi+1 - xi) (yi2 + yiyi+1 + yi+12)/6A]

- megjegyzés: mint a területszámító algoritmusnál a pontokat, itt is az óramutató járásának megfelelően kell számozni, és nem lehetnek negatív y értékek

 

E. VÁZ

- olyan vonalhálózat, melyet a poligonon belül azzal a feltétellel lehet megszerkeszteni, hogy minden pontja azonos távolságra van a két legközelebbi oldaltól,

- a váz elágazási helyein a csomópontokban, három oldaltól mért távolság egyenlő

- a váz marad meg a poligon "összehúzódása" után

- minden oldala konstans sebességgel mozog befelé

- úgy tekinthető, mint az övezet kialakítás ellentett művelete

33.4. ábra - Poligon váz

- a poligon konvex csúcsain a szögfelezők befelé mozgó vonalakat alkotnak

- minden konkáv csúcsnál a redukált poligont körív alkotja, a körív középpontja a csúcspontban van

- a folyamat továbbfejlődésével a szögfelezők és a körívek egybeolvadnak és fa jellegű szerkezetet alkotnak

- amint a poligon kisebbedik, széteshet egy vagy több szigetre

- végül a poligon ponttá redukálódik

- ez a pont:

- legtávolabb fekszik az eredeti határtól

- középpontja annak a legnagyobb körnek, amely belülről érinti az eredeti poligont

Alkalmazások

- megfelelő helyet nyújt a poligon címke elhelyezésére

- a címke rajzolható:

- a poligon váz-tengelye mentén

- pontra redukálás után a pontban

- utca-tömb fölbontása poligonokra, minden front számára egy poligon címke elhelyezése céljából

 

IRODALOM

Blakmore, M., 1984, "Generalization and error in spatial databases," Cartographica 21:131-9

Shamos, M.I., és F.P. Preparata, 1985. "Computational Geometry", Springer-Verlag, Berlin. A geometriai

algoritmusok szabványos, de komplex tárgyalása

 

ELLENŐRZŐ KÉRDÉSEK

1. Vitasd meg, milyen eredményekre vezet a poligon területet meghatározó és a pont a poligonban algoritmus használata, ha a poligon nem megfelelő szerkezetű (pl. nyitott, nyolcas alakú).

2. Módosítsd a pont a poligonban algoritmust olymódon, hogy szabatosan meghatározza a pont belső és külső elhelyezkedése mellett azt is, ha a pont a határvonalon van.

3. Vezess le képleteket a poligon területére és a centroid helyzetére az alapelvekből kiindulva.

4. Módosítsd a poligon területét meghatározó algoritmust olyképpen, hogy jelezze a negatív y koordinátákat és fel tudja azokat használni a területszámításhoz.

 
Tartalom
<<< Előző fejezet               Következő fejezet >>>
 



 
 


©GIS Figyelő