# Polygone und deren Löcher



## TSlaughter (7. Jan 2004)

Moin!

Ich weiß nich ganz ob das hier ins Thema rein gehört aber ich versuche es ma!
Ich suche in Java eine Möglichkeit um festzustellen wie rum sich ein Polygon dreht und wie ich ein Polygon mit
Loch zeichnen kann.
Es soll quasi im Idealfall ein Donut rauskommen (Ring mit Loch)
Das ganze soll allerdings 2 Dimensional bleiben.

  ___
 / _    \
| /  \   |
||    |  |  also irgenwie so
| \_/  /
 \___/

gibt es dafür irgenwo im Netz ein gutes anschauliches Tut?


TSlaughter


----------



## mariopetr (7. Jan 2004)

was verstehst du unter "wie rum es sich dreht"? ansonsten (das mit dem loch) kann man ueber java.awt.Shape und java.awt.geom.PathIterator handlen (wenn es schnell gehen muss mit java.awt.Polygon, dann hat man aber irgendwo einen strich zuviel)


----------



## TSlaughter (7. Jan 2004)

Danke für die schnelle Antwort!

Anfangen tut alles in einem Shapefile, welches ich auslese.
In diesem Shapefile sind Multipartpolygone enthalten(Polygone mit mehreren Ringen wobei einige Ringe Löcher darstellen). So nun hab ich alle Punkte der Ringe, und deren Anzahl und alles was man sonst noch brauch.

Das Problem ist , dass das Loch ein separater Ring ist und somit nicht so ohne weiteres direkt als Loch erkennbar ist. Lediglich die Drehrichtung lässt darauf schließen ob der Ring ein Loch oder ein weiterer Ring außerhalb der anderen Ringe ist. Die Drehrichtung ist lediglich die Richtung in der das Polygon gezeichnet wird (Uhrzeigersinn). Ob linksrum oder rechtsrum (da ja im Idealfall ein Kreis ähnliches gebilde). 

Deine Idee mit PathIterator und Shape ist glaub ich ein guter Weg nur weiß ich nich wirklich wie ich das machen soll

TSlaughter


----------



## mariopetr (7. Jan 2004)

also das mit dem drehen ist so eine sache. am einfachsten waere es wohl, den winkel zwischen 2 geraden zu bestimmen und dann je nachdem ob er positiv oder negativ ist die drehrichtung festzulegen.nach deiner beschreibung sollte es aber reichen festzustellen ob ein polygon komplett in einem anderen liegt oder nicht (laesst sich ueber shape machen). was das zeichnen betrifft, vieleicht geht auch


```
Polygon outerRing;
Polygon innerRing;

public void paint(Graphics graphics)
{
	Area area=new Area(outerRing);
	area.substract(new Area(innerRing));
	graphics.draw(area);
}
```


----------



## TSlaughter (7. Jan 2004)

Ja das  kommt der Sache schon sehr nahe .

Danke!

Nur das Problem mit dem Uhrzeigersinn.

Mit dem analysieren von einigen Seiten ist das so eine Sache.

 Die können ja in beliebiege Richtungen gehen aber dennoch einen anderen Drehsinn haben??

Man müsste alle Seiten und alle Winkel oder was auch immer berechnen?????????


----------



## mariopetr (7. Jan 2004)

dann brechne doch alle winkel 
wenn >0 dann richtung 1
wenn <0 dann richtung 2
wenn == 0 dann irgend was falsch

was spricht eigentlich dagegen erstmal alle polygone einzulesen und dann die herausfiltern die komplett in einem anderen liegen?


----------



## TSlaughter (7. Jan 2004)

Keine Ahnung mit den Winkeln is auch egal ich hab ne Lösung.

Alle Ringe eines Multipartpolygons habe ich in einer Area mit exclusiveOr zusammengenommen und schon funktioniert es wunderbar,  es muss allerdings gewährleistet sein das der erste Ring kein Loch ist  .
Aufbauend auf deiner lösung:


```
Polygon outerRing; 
Polygon innerRing; 

public void paint(Graphics graphics) 
{ 
   Area area=new Area(outerRing); 
   area.substract(new Area(innerRing));  <-----------     area.exclusiveOr(new Area...)
   graphics.draw(area);  <---------------------- graphics.fill(area)
}
```

nur halt die änderung rein und es funzt wunderbar man muss allerdings Graphics 2D verwenden zumindestens bei mir.

Das Polygon hat ein Loch wo man durchkucken kann und alle Ringe die kein Loch sind werden ebenfalls angezeigt.
Geil.

*EDIT: CODE FORMATIERT!*


----------

