#include #include #include #include #include #include #include #include #include //typedef boost::geometry::model::point Point; //typedef boost::geometry::model::segment Segment; namespace bg = boost::geometry; struct Pointt { float x; float y; }; struct Line { Pointt p1; Pointt p2; float m; float b; }; float getM(Line line) { float a = line.p2.y-line.p1.y; float b = line.p2.x-line.p1.x; float m = a/b; return m; } float getB(Line line) { return -line.m*line.p1.x + line.p1.y; } bool pointOnLine(Pointt point, Line line) { float y0; y0 = line.m * point.x + line.b; if (point.y == y0) return true; else return false; } bool pointInLineRange(Pointt point, Line line) { if ((point.x >= line.p1.x && point.x <= line.p2.x) && (point.y >= line.p1.y && point.y <= line.p2.y)) return true; else return false; } bool isIntersecting(Line line1, Line line2) { Pointt intersectionPoint; float a; float b; a = line2.b - line1.b; b = line1.m - line2.m; intersectionPoint.x = a/b; intersectionPoint.y = line1.m * intersectionPoint.x + line1.b; std::cout<<"intersection point:"< point_t; typedef bg::model::segment segment_t; typedef bg::model::polygon polygon_t; polygon_t poly1{ {{-0.5, 1.0}, {1.0, 3.0}, {5.0, 6.0}, {6.0, 3.0}, {4.0, 0.0}, {-0.5, 1.0}}, {} }; polygon_t poly2{ {{0.0, 0.0}, {0.0, 4.0}}, {} }; std::vector output; boost::geometry::intersection(poly1, poly2, output); if (output.size() > 0) { std::cout<<"Number of Intersection points:"<(output[i]); y = bg::get<1>(output[i]); std::cout<<"x:"< all_points; for (int v = 0; v < boost::geometry::exterior_ring(poly2).size(); v++) { //double x = bg::get<0>(*v); //double y = bg::get<1>(*v); point_t p = boost::geometry::exterior_ring(poly2)[v]; //double x = bg::get<0>(p); //double y = bg::get<1>(p); all_points.push_back(p); //std::cout<<"x:"<(*v); //double y = bg::get<1>(*v); point_t p = boost::geometry::exterior_ring(poly1)[v]; //double x = bg::get<0>(p); //double y = bg::get<1>(p); all_points.push_back(p); //std::cout<<"x:"<(p1); double y1 = bg::get<1>(p1); for (int v2 = 0; v2 < all_points.size(); v2++) { point_t p2 = all_points[v2]; double x2 = bg::get<0>(p2); double y2 = bg::get<1>(p2); polygon_t temp1{ {{x1, y1}, {x2, y2}}, {} }; std::vector tempoutput; boost::geometry::intersection(poly1, temp1, tempoutput); if (tempoutput.size() == 0) mat[v1][v2] = bg::distance(p1, p2); else if(tempoutput.size() == 1) { double x0 = bg::get<0>(tempoutput[0]); double y0 = bg::get<1>(tempoutput[0]); mat[v1][v2] = bg::distance(p1, p2); if ((x0 == x1 && y0 == y1) || (x0 == x2 && y0 == y2)) { mat[v1][v2] = bg::distance(p1, p2); double a, b, slope, intercept, tempx1, tempx2, tempy1, tempy2; a = y2 - y1; b = x2 - x1; slope = a/b; intercept = -slope*x1 + y1; tempx1 = -99; tempx2 = 99; tempy1 = slope*tempx1 + intercept; tempy2 = slope*tempx2 + intercept; polygon_t temp2{ {{tempx1, tempy1}, {tempx2, tempy2}}, {} }; std::vector tempoutput2; boost::geometry::intersection(poly1, temp2, tempoutput2); } else mat[v1][v2] = -2; } else if (tempoutput.size() == 2) { //for (int k = 0; k < tempoutput2.size(); k++) //{ double x3 = bg::get<0>(tempoutput[0]); double y3 = bg::get<1>(tempoutput[0]); if ((x3 == x1 && y3 == y1) || (x3 == x2 && y3 == y2)) mat[v1][v2] = bg::distance(p1, p2); else mat[v1][v2] = -5; std::cout<