Auf der Suche nach einer Geometriemanipulationsbibliothek

Wir haben ein älteres Programm, das einige Polygone ausschneidet - Vereinigungen, Differenzen, Schnittmengen, exklusive oder Polygone und Multipolygone.

Es verwendet die GPC - General Polygon Clipper Library der University of Manchester .

Wir sind derzeit an einer Neufassung beteiligt. Ich hatte gedacht, dass die Standardbibliotheken von .NET 4.5 Funktionen zum Bearbeiten von Geometrien enthalten könnten, aber ich konnte sie nicht finden.

Wir erwägen Alternativen zu GOC aus zwei Gründen:

  1. GPOC ist von einer binären DLL, gpc.dll, abhängig, die auf dem Zielcomputer installiert werden muss, und wir bevorzugen etwas, das in einer .NET-Assembly verpackt wurde.
  2. Es gibt eine zusätzliche Funktionalität, die wir benötigen, die GPC nicht bietet - wir müssen ein Polygon um einen festen Betrag erweitern.

Um Nr. 2 zu erweitern, was wir wollen, ist ein Polygon, dessen Grenzen nur ein bisschen über dem Original liegen. Angenommen, ich habe eine Reihe alter Polygone und zeichne ein neues Polygon. Ich möchte das neue Polygon gegen die Vereinigung der alten Polygone schneiden, dann möchte ich es nur ein wenig erweitern, so dass es die vorhandenen Polygone nur ein wenig überlappt.

In unserem Problembereich ist eine kleine Überlappung akzeptabel, aber eine Lücke - egal wie klein - nicht. Und angesichts der Art und Weise, wie Fließkommavergleiche funktionieren, ist eine kleine Überlappung die einzige Möglichkeit, um sicherzustellen, dass es keine Lücke gibt.

In der Legacy-App haben wir zwei Ansätze ausprobiert, um diese Erweiterung zu erstellen:

  1. Schreiben Sie Code, der jeden Punkt abläuft, die Richtung nach innen bestimmt und den Punkt um den gewünschten Betrag nach außen verschiebt. Dies stellte sich als sehr komplizierter Code heraus, um ihn richtig hinzubekommen.
  2. Erstellen Sie neue Polygone, die Duplikate des Originals sind, verschieben Sie den gewünschten Betrag nach Norden, Süden, Osten und Westen, und erstellen Sie dann das Finale als Vereinigung aller Duplikate. Dadurch werden Polygone mit sehr kleinen Spitzen an jedem der ursprünglichen Scheitelpunkte erstellt, wodurch die Anzahl der zu speichernden Punkte erheblich erhöht wird. Da wir Nr. 1 nicht zuverlässig zum Laufen bringen konnten, machen wir gerade Nr. 2.

Mir fallen da zwei alternative Ansätze ein:

  1. Bei einigen Paketen können Sie einer Form einen Puffer hinzufügen. Das wäre genau das, was wir brauchen.
  2. Wenn das nicht funktioniert, könnten wir, wenn das Paket die Skalierung von Polygonen zulässt, einfach die äußeren Polygone um einen berechneten Betrag erweitern und die inneren Löcher um denselben Betrag verkleinern.

Wir suchen also nach Geometriebibliotheken, die Clipping und entweder Skalierung oder Pufferung unterstützen und die als .NET-Assemblys ohne externe DLLs implementiert sind.

Hat jemand irgendwelche Hinweise?

Hallo, ich arbeite seit einem Jahr an einem Clipper und es hört sich so an, als hätten Sie sehr schmerzhafte Eingabedaten, die ich gerne auf meine Implementierung zum Testen werfen würde. Wäre es möglich, dass Sie einige Beispieldaten zum Spielen freigeben?

Antworten (2)

Sie sollten sich NetTopologySuite ansehen. Wir haben es für 2D-Geometrieoperationen verwendet. Es ist reines C# und hat viele Funktionen, die zu groß sind, um sie hier aufzulisten. Möglicherweise haben Sie ein wenig Probleme, Dokumentation zu finden, aber sobald Sie anfangen, macht alles Sinn.

Clipping, Buffering, boolesche Operationen und Triangulationsalgorithmen (delaunay, voronoi etc.) sind elementare Sachen in NTS.

Können Sie mir zeigen, wo es Expansion und Schrumpfung unterstützt?
Abgesehen von einfachen affinen Transformationen (Skalieren, Übersetzen, Scheren, Drehen usw.) sind hier zum Beispiel die Puffermethoden: nettopologysuite.github.io/html/…

Werfen Sie einen Blick in meine Clipper- Bibliothek.

Open-Source-Freeware-Bibliothek, codiert in C# (und C++ und Delphi) mit sehr großzügiger Boost-Lizenz (die die Verwendung in kommerziellen Apps ohne Gebühr erlaubt). Kann direkt in Ihre Anwendungen kompiliert werden, sodass keine externen DLLs benötigt werden.

Offsetting (Erweitern & Schrumpfen) wird vollständig unterstützt.