Search code examples
c++computational-geometrycgal

Compute intersection area of two polygons with cgal


Given the vertices of two convex polygons, what is the simplest way of computing the area of their intersection using cgal?


Solution

  • Because you are working with convex polygons, there is no need to worry about holes. So the simplest code that I can think of is basically construct the polygons, call intersection, loop over intersection and total up the area::

    #include <iostream>
    #include <CGAL/Simple_cartesian.h>
    #include <CGAL/Polygon_2.h>
    #include <CGAL/Polygon_with_holes_2.h>
    #include <CGAL/Boolean_set_operations_2.h>
    #include <CGAL/Polygon_2_algorithms.h>
    
    
    typedef CGAL::Simple_cartesian<double> K;
    typedef K::Point_2 Point;
    typedef CGAL::Polygon_2<K> Polygon_2;
    typedef CGAL::Polygon_with_holes_2<K> Polygon_with_holes_2;
    using std::cout; using std::endl;
    
    
    int main(){
      Point points[] = { Point(0,0), Point(1,0), Point(1,1), Point(0,1)};
      Point points2[] = { Point(0.5,0.5), Point(1.5,0.5), Point(1.5,1.5), Point(0.5,1.5)};
      Polygon_2 poly1(points, points+4);
      Polygon_2 poly2(points2, points2+4);
      //CGAL::General_polygon_with_holes_2<K> poly3;
      std::list<Polygon_with_holes_2> polyI;
    
      CGAL::intersection(poly1, poly2, std::back_inserter(polyI));
    
      double totalArea = 0;
      typedef std::list<Polygon_with_holes_2>::iterator LIT;
      for(LIT lit = polyI.begin(); lit!=polyI.end(); lit++){
        totalArea+=lit->outer_boundary().area();
      }
      cout << "TotalArea::" << totalArea;
    
    }