Laden...

Mehrere Rechtecke verbinden -> davon der Umriß

Erstellt von tgrisu vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.001 Views
T
tgrisu Themenstarter:in
5 Beiträge seit 2010
vor 13 Jahren
Mehrere Rechtecke verbinden -> davon der Umriß

Hallo,

ich suche einen Ansatz für folgendes Problem:
Ich habe mehrere Rechtecke unterschiedlicher Größe. Die Rechtecke, welche sich berühren sollen eine neue Form ergeben von der ich nur den Umriß zeichnen möchte.
Die neue Form ist nicht zwangsläufig ein Rechteck.
Die neue Fläche muß hierbei transparent bleiben, da die neue Form als Overlay auf eine Karte gelegt werden soll.
Ich habe schon mit GraphicsPath experimentiert, bin aber nicht wirklich zu einer Lösung gekommen. Wer kann mir einen Tipp geben?

Das Leben ist eines der härtesten 👶

1.361 Beiträge seit 2007
vor 13 Jahren

Hi tgrisu,

schau dir mal die Klasse System.Drawing.Region an.
Dort gibts genau was du suchst.1.neue Region erzeugen 1.für jedes Rechteck Region.Union(...) aufrufen 1.die komplette Region mittels Graphics.FillRegion zeichnen

beste Grüße
zommi

//Edit:
Mhh... mit der Region kannst du aber wahrscheinlich nur die Fläche füllen und nicht den Umriss zeichnen.

Vielleicht musst du alles per Hand machen... ein Ansatz wäre

contour of iso-oriented rectangles

.
Mal danach googlen. Gibts zich unterschiedliche Algorithmen dafür.

Wobei deine Rechtecke sogar nach Quadraten aussehen. (Quadtree?) Und sich alle nur berühren und nicht überlappen. Also müsste das verjoinen zu einem Polygon eigentlich auch ganz gut per Hand gehen.

T
tgrisu Themenstarter:in
5 Beiträge seit 2010
vor 13 Jahren

Hallo zommi,

danke für die schnelle Antwort.
Die Rechtecke sind Geokoordinaten, welche in Bildschirmkoordinaten umgerechnet werden. Die Wahrscheinlichkeit, daß dabei ein Quadrat herauskommt ist leider sehr unwahrscheinlich (hab ich etwas unglücklich gezeichnet).
Ich werde die Umrechnung von Geo nach Bildschirm eher so gestalten müssen, dass sie sich etwas überschneiden (falls sie nebeneinanderliegen, was auch nicht immer gewährleistet ist).
Ich werde mir Deine Ideen aber gerne genauer anschauen.

Viele Grüße,
tgrisu

Das Leben ist eines der härtesten 👶

1.002 Beiträge seit 2007
vor 13 Jahren

Hallo tgrisu,

ich würde die von zommi vorgeschlagene Methode auf eine separate Bitmap zeichnen lassen und dann eine (selbstgeschriebene) Kantenerkennung darüberlaufen lassen, um den äußeren Rand des gefüllten Polygons zu ermitteln.

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

T
tgrisu Themenstarter:in
5 Beiträge seit 2010
vor 13 Jahren

Hallo m0rius,

das war auch eines meiner vielen Ansätze. Das Problem dabei: Wenn die (Land)Karte, auf der der Umriß gezeichnet wird wechselt oder der Zoomfaktor sich ändert etc. muß ich jedesmal alles neu berechnen, weil sich auch das Verhältnis der Formen ändert. Mit Transformation komme ich da nicht immer weit. Auch werden einzelne Rechtecke schnell mal hinzugefügt oder entfernt.
Das schlimmste: Die Software läuft auf einer langsamen Hardware.
Danke dennoch für diesen Ansatz.

Viele Grüße
tgrisu

Das Leben ist eines der härtesten 👶

T
1 Beiträge seit 2010
vor 13 Jahren

Hi Everybody,

perhaps I can provide a little workaround, which works really fine for my (quite similar) problem. Here is what you do:

Step 1:
Cobine all polygons, pathes, Rectangles or whatever to one big Region using Region.Union(SecondRegion).

Step 2:
Create a second Region and do the same.

I did both within a foreach slope!

Step 3:

Start to shift one of the two regions around using the Region.Translate() Member and always let this Follow by a Union with the second Region which stays static. (Doing so you will create a bigger Version of the original Region.

Move as follows upi, lefti, right2i, left2i, down2i, right2i, (up and left)*i
the Width of the Outline will be set with the factor i.

Step 4:
Now you just have to cut the small Region version from the second bid one using, SecondRegion.Xor(Region)

Step 5:
And finally you just have to draw the Outline using: e.Graphics.FillRegion(MyBrush, SecondRegion

Here you are, I hope this will help as a workaround.

Have fun

Tagacat!

PS: This works with every shape Regions as well as with multiple separate Regions PatchworkRegions)

Übersetzung:

Hallo alle zusammen,

vielleicht kann ich hiermit einen kleinen WorAround beschreiben, der für mein, recht ähnlich geartetes, Problem sehr gut funktioniert. Ihr müsst einfach folgendes machen:

Schritt 1:
Vereint einfach aller Polygone, Rechtecke, Pathes oder was auch immer zu einer großen Region. Nutz hierfür Region.Union(ZweiteRegion)

Schritt 2:
Kreiere eine Zweite Region analog zu Schritt 1.

Ich habe für beides einfach eine ForEach-Schleife verwendet!

Schritt 3:
Beginne nun eine der beiden (noch übereinanderliegenden Regionen mit der Methode Region.Translate() umher zu verschieben. Nach jeder Verschienbeaktion die verschobene Region mit der Basisregion vereinen. (Auf diese Weise kreiert man in 5 Verschiebeschritten eine größere Version der ursprüglichen Region).

Verschiebe: hochi, linksi, runteri, rechts2i, (hoch und links)*i. Die Breite der Umrisslinie kann somit durch den Faktor i in Pixeln gesetzt werden.

Schritt 4:
Abschließend muss nun nur noch die kleine Region aus der großen Region herausgeschnitten werden, indem man die Methode ZweiteRegion.Xor(Region) nutzt.

Step 5:
jetzt kann der Umriss gezeichnet werden, indem man e.Graphics.FillRegion(MyBrush, ZweiteRegion) verwendet.

Ich hoffe dieser Workaround war hilfreich.

Viel Spaß,

Tagacat

PS: DieseMethode funktioniert mit Regionen jeder Form ebenso auch mit vielen seperaten PatchworkRegionen. 😉

Hinweis von gfoidl vor 13 Jahren

Thanks for your answer. Due the fact that this forum is focused on German language please write German answers 😉

Thanks in advance.

The question isn´t: who am I, but how many!