2015-07-15 12 views
10

Dies ist eine Frage über Boost Polygon (nicht über Boost Geometry)Was ist der Nutzen von Boost Polygon?

Kürzlich habe ich versucht, mit einigen geometrischen Polygonkonstruktionen zu spielen. Da Boost Geometry (eine andere Bibliothek, die auch mit Polygonen befasst) nicht umständlich in Boost 1.58 ich arbeite, obwohl ich einen Versuch geben würde, Boost Polygon.

Nach dem Versuch, die Bibliothek zu verstehen und nicht die erwarteten Ergebnisse zu erhalten, entdeckte ich, dass die Bibliothek nur für ganzzahlige Koordinaten funktioniert. Zuerst dachte ich, dass dies eine Einschränkung für die Eingabe ist, aber tatsächlich sind alle internen Operationen und Ausgaben Ganzzahlen, dies macht alle Ausgaben ziemlich schrullig, zum Beispiel sind die Schnittpunkte für Polygone leicht deformiert (weil die Koordinaten von Eckpunkten sein müssen) ganze Zahlen).

Ein Zitat von der Hauptseite (Hervorhebung von mir):

Der Koordinatendatentyp ist ein Template-Parameter aller Datentypen und Algorithmen, die von der Bibliothek zur Verfügung gestellt und wird erwartet, integral zu sein. Gleitkommadaten Koordinatentypen nicht durch die Algorithmen in der Bibliothek auf die Tatsache zurückzuführen, implementiert unterstützt, dass die (sic) Gleitkomma- Robustheit zu erzielen einen anderen Satz von Algorithmen beinhaltet und allgemein plattformspezifische Annahmen über Punktdarstellungen Floating .

Zuerst obwohl ich, dass es ein Problem zwischen dem genauen und ungenauen Darstellung war, damit ich es mit Rational (Boost Rational) Typen zu machen versuchte (dachte ich einen Wrapper rational Klasse, um es zu machen zu kompilieren), aber die eigentlich Ganzzahlige Koordinaten sind eine strikte Anforderung (Es gibt Teile im Code, die tatsächlich einen addieren und subtrahieren, um Zwischenergebnisse zu konstruieren).

Zurück zu ganzen Zahlen, musste ich die Koordinaten sehr groß machen (ganzzahlig), um dieses Diskretionsproblem verschwinden zu lassen. Mit anderen Worten, ich muss alles hin und her normalisieren. Nun, am Ende ist es nicht sehr nützlich oder praktisch, wie ich ursprünglich dachte.

Fehle ich etwas wichtiges über die Verwendung dieser Bibliothek?

Ist diese Bibliothek für "pixelig" Probleme gedacht? Was ist das Dienstprogramm, wenn die Koordinaten auf ganze Zahlen beschränkt sind?

Ist die Idee, die Koordinaten zu sehr großen Zahlen zu skalieren und dann später die Ergebnisse für geometrische Anwendungen Renormalisierung?

Ich verstehe, dass Algorithmische Geometrie mit Fließkommawerten sehr schmerzhaft ist, aber warum versucht diese Bibliothek nicht einmal, mit exakten Rationalen kompatibel zu sein?

Gibt es echte Anwendungsbeispiele? (Das Handbuch ist ziemlich schlecht bei der Angabe von Beispielen) Wird tatsächlich diese Bibliothek verwendet?

Bonusfrage: Ist das eine verlassene Bibliothek?


Dies ist ein Beispiel dafür, wie die Bibliothek aus der ganzen Zahl verhält Koordinaten:

Hier ist ein Beispiel dafür, was mit integrierten Polygonen geschieht, wenn ich kleine Zahlen verwenden, um die Koordinaten zu repräsentieren die Ergebnisse sind nicht einmal geometrisch konsistent. (Die beiden Polygone sind polygon(-2,0)(2,-2)(6,4)(0,2) und polygon(-5,0)(-1,-2)(3,4)(-3,2))

smallints

(beachten Sie, wie Skew alles herauskommt.)

Aber wenn ich skaliert die Polygone große ganze Zahl haben koordiniert die Ergebnisse genauer zu erhalten (der zwei Polygone sind polygon(-200,0)(200,-200)(600,400)(0,200) und polygon(-500,0)(-100,-200)(300,400)(-300,200), skalierte Versionen der beiden oben).

largeints


EDIT: Ich habe ein bisschen mehr von Computer-Geometrie gelernt, anscheinend ist die Robustheit der Computer-Geometrie ein sehr schwieriges Problem. Eine der Strategien besteht darin, Ganzzahlarithmetik zu verwenden. Es sieht so aus, als ob Boost.Polygon diesen Ansatz verfolgt. Probleme im fortlaufenden Raum sollten angemessen skaliert werden.

+0

ich mit einer richtigen Antwort auf die numerische Genauigkeit conundrum nicht wirklich wissen. Vielleicht füge ich es später meiner Antwort hinzu. – sehe

Antwort

3

Es ist nicht aufgegeben.

Ja, es wird von (vielen) Leuten benutzt.

Eine Sache, die es scheint, dass eine solide Benutzerbasis zu haben scheint, ist z.B. Voronoi-Diagramme und zugehörige Algorithmen. Sie können eine große Anzahl von Fragen dazu auch auf SO finden, so dass Sie sehen könnten, wofür sie es verwenden.

Bonus Antwort

können Sie auch die Bibliotheken kombinieren, indem

#include <boost/geometry/geometries/adapted/boost_polygon.hpp> 
+0

Gestern habe ich das Tag 'boost-polygon' erstellt, damit wir diese Fragen in SO identifizieren können. Bitte verwenden Sie das Tag, wenn Sie andere Fragen finden (ich fand nur 4 oder 5). Ich bin verwirrt, was ist die Verwendung von Voronoi-Diagrammen (oder für viele andere Eigenschaften) für ganzzahlige Koordinaten. Ich habe den Eindruck, dass die Idee darin besteht, alle geometrischen Objekte auf MAX_INT zu skalieren, mit Boost.Polygon zu arbeiten und zur ursprünglichen Skala zurückzukehren. – alfC

+0

Wie ich schon sagte. Ich kann das nicht bestätigen/leugnen. Die Leute benutzen es, vielleicht ist das ein guter Ort, um zu suchen. Ich bin mir sicher, dass ich Anwendungen sah, die nicht zu spielen schienen. Ich würde bei dieser Annahme nicht hängen bleiben (ich habe diese Art der Skalierung vorher noch nicht mit Boost Polygon gesehen) – sehe

+2

Danke, ich habe ein Beispiel für die Polygonoperationen hinzugefügt und wie sich das merkwürdig verhalten (anscheinend vom Design her). – alfC