Skip to content

difference gives incorrect result for polygon and multi_polygon #1291

Closed
@Age-123

Description

@Age-123

Program

#include <boost/geometry.hpp>
#include <boost/geometry/geometries/point_xy.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <boost/multiprecision/cpp_dec_float.hpp>
namespace bg = boost::geometry;
namespace bm = boost::multiprecision;
typedef bm::cpp_dec_float_100 float_type;
typedef bg::model::d2::point_xy<float_type> point_type;
typedef bg::model::polygon<point_type, false, true> polygon_type;


typedef bg::model::multi_polygon<polygon_type> multi_polygon_type;

int main() {
  polygon_type polygon_layer;
  bg::read_wkt("POLYGON((0 0, 2 0,2 2, 0 2, 0 0))", polygon_layer);
  boost::geometry::correct(polygon_layer);
  multi_polygon_type metal_layer;
  polygon_type metal_polygon1;
  bg::read_wkt( "POLYGON((0 0, 1 0, 1 1, 0 1, 0 0))",metal_polygon1);
  boost::geometry::correct(metal_polygon1);
  metal_layer.push_back(metal_polygon1);
  polygon_type metal_polygon2;
  bg::read_wkt("POLYGON((0 1, 1 1,1 2, 0 2, 0 1))",metal_polygon2);
  boost::geometry::correct(metal_polygon2);
  metal_layer.push_back(metal_polygon2);
  multi_polygon_type result;
  bg::difference(polygon_layer, metal_layer, result);
  std::cout << "Difference Result:" << std::endl;
  for (const auto& poly : result) {
    std::cout << std::setprecision(10) << bg::wkt(poly) << std::endl;
  }
  return 0;
}

The answer is POLYGON((0 1,1 1,1 0,2 0,2 2,1 2,0 2,0 1))
but I think the answer should be POLYGON((1 0,2 0,2 2,1 2,1,0))
It seems like difference only used to calculate polygon_layer and metal_polygon1, the metal_polygon2 was ignored
I try to use correct function as you can see in the program, but it is useless
Look forward to your reply,thanks!

Metadata

Metadata

Assignees

No one assigned

    Labels

    not a bugNot a bug or a bug fixed in the past

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions