Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Mehrere Rechtecke verbinden -> davon der Umriß
tgrisu
myCSharp.de - Member



Dabei seit:
Beiträge: 5
Herkunft: Allgäu

Themenstarter:

Mehrere Rechtecke verbinden -> davon der Umriß

beantworten | zitieren | melden

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?
Attachments
Das Leben ist eines der härtesten :baby:
private Nachricht | Beiträge des Benutzers
zommi
myCSharp.de - Member

Avatar #avatar-2617.png


Dabei seit:
Beiträge: 1380
Herkunft: Berlin

beantworten | zitieren | melden

Hi tgrisu,

schau dir mal die Klasse System.Drawing.Region an.
Dort gibts genau was du suchst.
  1. neue Region erzeugen
  2. für jedes Rechteck Region.Union(...) aufrufen
  3. 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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von zommi am .
private Nachricht | Beiträge des Benutzers
tgrisu
myCSharp.de - Member



Dabei seit:
Beiträge: 5
Herkunft: Allgäu

Themenstarter:

beantworten | zitieren | melden

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 :baby:
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1043

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
tgrisu
myCSharp.de - Member



Dabei seit:
Beiträge: 5
Herkunft: Allgäu

Themenstarter:

beantworten | zitieren | melden

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 :baby:
private Nachricht | Beiträge des Benutzers
Tagacat
myCSharp.de - Member



Dabei seit:
Beiträge: 1

beantworten | zitieren | melden

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 up*i, left*i, right*2i, left*2i, down*2i, right*2i, (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: hoch*i, links*i, runter*i, rechts*2i, (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. ;-)
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Tagacat am .
The question isn´t: who am I, but how many!

Moderationshinweis von gfoidl (27.09.2010 - 14:55:49):

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

Thanks in advance.

private Nachricht | Beiträge des Benutzers