<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[[boost::geometry] Polygon vs. C-Array]]></title><description><![CDATA[<p>Hi ich hab ein paar Fragen bezüglich der boost::geometry:</p>
<p>zuerst ein paar C-Strukturen, die vorgegeben sind:</p>
<pre><code>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;
};
</code></pre>
<p>Ich möchte die Überlappung zweier Objekte ermitteln.<br />
Das funktioniert auch:</p>
<pre><code>#include &lt;boost/geometry/geometry.hpp&gt;
#include &lt;boost/geometry/geometries/point_xy.hpp&gt;
#include &lt;boost/geometry/geometries/polygon.hpp&gt;
#include &lt;boost/geometry/geometries/register/point.hpp&gt;

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&lt;PointData, false, false &gt; PolygonType;

  PolygonType poly;            
  bg::append(poly, obj1-&gt;corners);       // 1)
  PolygonType poly2;
  bg::append(poly2, obj2-&gt;corners);      // 2)

  std::deque&lt;PolygonType&gt; output;        // 3)

  bg::intersection(poly, poly2, output); // 4)
  if(output.size()&gt;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(&amp;object1, &amp;object2);
  std::cout &lt;&lt; &quot;overlap area=&quot;&lt;&lt;area&lt;&lt;std::endl;

  return 0;
}
</code></pre>
<p>Folgende Fragen jedoch:<br />
mich stört die dynamische Allokation.<br />
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?</p>
<p>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.</p>
<p>Was mich noch wundert:<br />
intersect erzeugt ein ungültiges (im Sinne von PolygonType) Ausgabepolygon.<br />
Obwohl PolygonType als nicht geschlossenes Polygon definiert ist, ist das Ausgabepolygon trotzdem geschlossen.</p>
<p>Danke und Gruß<br />
Vlad</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/316135/boost-geometry-polygon-vs-c-array</link><generator>RSS for Node</generator><lastBuildDate>Thu, 30 Jul 2026 04:54:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/316135.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 23 Apr 2013 08:42:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [boost::geometry] Polygon vs. C-Array on Tue, 23 Apr 2013 08:44:59 GMT]]></title><description><![CDATA[<p>Hi ich hab ein paar Fragen bezüglich der boost::geometry:</p>
<p>zuerst ein paar C-Strukturen, die vorgegeben sind:</p>
<pre><code>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;
};
</code></pre>
<p>Ich möchte die Überlappung zweier Objekte ermitteln.<br />
Das funktioniert auch:</p>
<pre><code>#include &lt;boost/geometry/geometry.hpp&gt;
#include &lt;boost/geometry/geometries/point_xy.hpp&gt;
#include &lt;boost/geometry/geometries/polygon.hpp&gt;
#include &lt;boost/geometry/geometries/register/point.hpp&gt;

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&lt;PointData, false, false &gt; PolygonType;

  PolygonType poly;            
  bg::append(poly, obj1-&gt;corners);       // 1)
  PolygonType poly2;
  bg::append(poly2, obj2-&gt;corners);      // 2)

  std::deque&lt;PolygonType&gt; output;        // 3)

  bg::intersection(poly, poly2, output); // 4)
  if(output.size()&gt;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(&amp;object1, &amp;object2);
  std::cout &lt;&lt; &quot;overlap area=&quot;&lt;&lt;area&lt;&lt;std::endl;

  return 0;
}
</code></pre>
<p>Folgende Fragen jedoch:<br />
mich stört die dynamische Allokation.<br />
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?</p>
<p>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.</p>
<p>Was mich noch wundert:<br />
intersect erzeugt ein ungültiges (im Sinne von PolygonType) Ausgabepolygon.<br />
Obwohl PolygonType als nicht geschlossenes Polygon definiert ist, ist das Ausgabepolygon trotzdem geschlossen.</p>
<p>Danke und Gruß<br />
Vlad</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2317647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2317647</guid><dc:creator><![CDATA[vlad_tepesch]]></dc:creator><pubDate>Tue, 23 Apr 2013 08:44:59 GMT</pubDate></item></channel></rss>