[boost::geometry] Polygon vs. C-Array



  • Hi ich hab ein paar Fragen bezüglich der boost::geometry:

    zuerst ein paar C-Strukturen, die vorgegeben sind:

    struct sFMatrix2x1_t{
      double elem[2][1];
    };
    
    typedef sFMatrix2x1_t FVector2d_t;
    #define VEC_X(p) ((p).elem[0][0])
    #define VEC_Y(p) ((p).elem[1][0])
    
    struct PointData{
      FVector2d_t point;
      int a;
      int b;
    };
    
    struct MyObject{
      PointData corners[4];
      int a;
      int b;
    };
    

    Ich möchte die Überlappung zweier Objekte ermitteln.
    Das funktioniert auch:

    #include <boost/geometry/geometry.hpp>
    #include <boost/geometry/geometries/point_xy.hpp>
    #include <boost/geometry/geometries/polygon.hpp>
    #include <boost/geometry/geometries/register/point.hpp>
    
    BOOST_GEOMETRY_REGISTER_POINT_2D(FVector2d_t, double, cs::cartesian, elem[0][0], elem[1][0]);
    BOOST_GEOMETRY_REGISTER_POINT_2D(PointData,   double, cs::cartesian, point.elem[0][0], point.elem[1][0]);
    
    float getOverlapArea(MyObject* obj1, MyObject* obj2)
    {
      typedef bg::model::polygon<PointData, false, false > PolygonType;
    
      PolygonType poly;            
      bg::append(poly, obj1->corners);       // 1)
      PolygonType poly2;
      bg::append(poly2, obj2->corners);      // 2)
    
      std::deque<PolygonType> output;        // 3)
    
      bg::intersection(poly, poly2, output); // 4)
      if(output.size()>0)
      {
        return bg::area(*output.begin());
      }
      return 0;
    }
    
    int main(int argc, char* argv[])
    {
      MyObject object1 = { {
                            {4.9056168, -4.0912080},
                            {5.4485154, -1.6478939},
                            {0.82304186, -0.38343596},
                            {0.18002588, -2.7993813},
                           }
      };
    
      MyObject object2 = { {
                            {0, 0},
                            {0, -5},
                            {2, -5},
                            {2, 0},
                           }
      };
      float area = getOverlapArea(&object1, &object2);
      std::cout << "overlap area="<<area<<std::endl;
    
      return 0;
    }
    

    Folgende Fragen jedoch:
    mich stört die dynamische Allokation.
    kann man das Polygon irgendwie so definieren, dass direkt das Array bei 1) und 2) benutzt wird ohne erst die Daten in einen dynamischen Container umzukopieren?

    Ebenso bei 3) und 4). Hier wäre es mir lieber, wenn ich der Funktion ein lokales Array definierter Größe vom Stack geben könnte.

    Was mich noch wundert:
    intersect erzeugt ein ungültiges (im Sinne von PolygonType) Ausgabepolygon.
    Obwohl PolygonType als nicht geschlossenes Polygon definiert ist, ist das Ausgabepolygon trotzdem geschlossen.

    Danke und Gruß
    Vlad


Anmelden zum Antworten