Abrufen der Koordinaten von Punkten aus einem Boost-Geometrie-Polygon

9

Ich habe eine einfache DLL, die Berechnungen mit Boost-Geometrie-Polygonen durchführt. (Meistens Kreuzungen und Unterschiede.) Da die DLL höchstwahrscheinlich aus C # -Code und aus Delphi aufgerufen wird und wer von wo sonst weiß, sollte ich das Ergebnis in Arrays konvertieren, die alles verarbeiten kann.

UPDATE: Ich hatte meinen Code vereinfacht und etwas korrigiert. Der neue Code sieht komplett anders aus, verwendet einen völlig anderen Ansatz ( for_each_point ) und kompiliert irgendwie immer noch nicht.

Mein neuer Code:

%Vor%

Die aktuellen Kompilierungsfehler sind:

  1. Fehler C2039: 'type': ist kein Mitglied von 'boost :: mpl :: eval_if_c' iterator.hpp 63
  2. Fehler C3203: 'type': unspezialisierte Klassenvorlage kann nicht als Vorlagenargument für den Vorlagenparameter 'Iterator' verwendet werden, erwartet wird ein reeller Typ difference_type.hpp 25
  3. Fehler C2955: 'boost :: type': Die Verwendung der Klassenvorlage erfordert die Template-Argumentliste difference_type.hpp 25
  4. Fehler C2955: 'boost :: iterator_difference': Die Verwendung der Klassenvorlage erfordert die Template-Argumentliste difference_type.hpp 26

Welche nicht so aussehen, als hätten sie etwas mit diesem Teil des Codes zu tun (mein Dateiname ist geometry.cpp), aber alles andere, was Boost Geometry verwendet, ist auskommentiert und ich bekomme immer noch diese Fehler, also ...

Hier ist mein schlechter Code, den ich vorher hatte (bearbeitet von sehe)

(Ich bin neu in C ++ und Boost, so dass ich vielleicht ein grundlegendes Konzept verpasst habe, während ich Code aus dem Internet zusammenstellte.) Ich nehme an, dass ich einfach nicht so einfach durch ein Polygon iterieren kann, und ich habe den nicht-trivialen Teil verpasst, oder dass ein Polygon nicht als Ring verwendet werden kann, oder Iterationen sind einfach nicht so, wie ich dachte, oder ich habe keine Idee, was sonst noch falsch sein kann. Was habe ich falsch gemacht?

    
ytg 11.10.2011, 06:20
quelle

2 Antworten

4

Ich habe ein paar Dinge gefunden, die behoben werden mussten:

  1. Ein Problem, das ich sehe, ist in Ihren Vorlagen. Achten Sie darauf, Leerzeichen zu setzen!
  2. boost range funktioniert bei Containern oder Bereichen, die Anfangs-, Endpaare enthalten
  3. Iteratoren repräsentieren so etwas wie einen Zeiger auf ein Objekt. Die Größe des Iterators zu bekommen, wird nicht das machen, was Sie wollen. Sie müssen entweder boost :: size eines ganzen Containers verwenden oder std :: distance (begin_iterator, end_iterator).

Hier ist eine Version, die kompiliert:

%Vor%     
Andrew Hundt 12.10.2011, 23:52
quelle
4

Ok, ich denke, ich habe das, wonach Sie suchen. Ich verstehe immer noch nicht ganz, warum du nach diesem Bereich von Punkten suchst, von denen ich anspreche, dass sie größer oder gleich 2 sind, aber ich habe herausgefunden, wie man ihn kompiliert, wenn man mindestens boost :: size () benutzt.

Als Erstes merke, dass der erste Parameter der Funktion

ist %Vor%

ist ein std :: -Vektor, der Instanzen des Typs model :: polygon enthält.

Dies bedeutet, dass wenn Sie Ihren Iterator dereferenzieren ... definiert als

%Vor%

Der rvalue ist ein Modell :: Polygon.

boost :: model :: polygon ist NICHT an und für sich Boost.Range kompatibel. boost :: model :: polygon ist ein Typ mit 5 Elementfunktionen ....

%Vor%

Dies bedeutet, dass Ihr * es (dh ein Modell :: Polygon) darauf beschränkt ist, nur diese Funktionen aufzurufen.

Es sieht so aus, als ob Sie entweder den äußeren Ring oder einen der inneren Ringe jedes Polygons im Vektor (nicht sicher, welcher, innerer oder äußerer) greifen und sehen, ob der Bereich von was auch immer in diesem Ring ist größer als oder gleich 2.

Um dies zu tun, müssen wir noch mehr mpl und typedef machen.

%Vor%

Um das Ganze zu vervollständigen und es "funktionierend" zu machen, habe ich beschlossen, anzunehmen, dass du den "äußeren" Ring für dein Bereichslimit konditional willst.

Hier ist für mich Code kompilieren, auf gcc 4.1.1 mit Boost 1.48. Ich überlasse es, ob die Logik für jemand anderen richtig ist.

%Vor%     
sbrett 13.10.2011 00:24
quelle

Tags und Links