2

I'm trying to detect every coordinates possible for my polygon. (it's not everytime a triangle, it's for that).But when i'm trying to check every x & y possible, my program is not working at all.

I'm using https://www.boost.org/doc/libs/1_62_0/libs/geometry/doc/html/geometry/reference/algorithms/within/within_2.html

Here is my program

int main()
    {
    
        int x = 0;
        int y = 0;
        typedef boost::geometry::model::d2::point_xy<double> point_type;
        boost::geometry::model::polygon<point_type> poly2;
        boost::geometry::read_wkt("POLYGON((375 200,700 900,1100 190))", poly2);
        for (x = 0; x < 1200; x++)
        {
            if (x > 1150)
            {
                x = 0;
                y++;
            }
            else if (y > 1000)
                exit(0);
            else
            {
                point_type p(x, y);
                bool check_covered = boost::geometry::within(p, poly2);
                if (check_covered)
                {
                  std::cout << "in" << std::endl;
                }
            }
        }
        return 0;
    }

But i don't have output. Basically, they're never entering in my "if (check_covered)"

I don't understand why. When i'm using a draw to check if the polygon is working, i have my triangle enter image description here

1 Answer 1

2

Geometry of polygon is not valid.

Model polygon reference

Template parameter(s)
bool Closed
Default true

You can check if a geometry is valid by boost::geometry::is_valid, for your polygon it returns false.

You may add the last point:

"POLYGON((375 200,700 900,1100 190,375 200))"

or call boost::geometry::correct(poly2) (it will add a missing point) before checking by within.

Here's a live demo, also making the point iteration a bit more effective:

Live On Coliru

#include <boost/geometry.hpp>
#include <boost/geometry/geometries/polygon.hpp>
#include <iostream>

namespace bg  = boost::geometry;
namespace bgm = bg::model;
using Point   = bgm::d2::point_xy<double>;

int main()
{
    bgm::polygon<Point> poly;
    bgm::box<Point>     box;
    bg::read_wkt("POLYGON((375 200,700 900,1100 190,375 200))", poly);

    bg::envelope(poly, box);

    for (int x = box.min_corner().x(); x < box.max_corner().x(); ++x)
        for (int y = box.min_corner().y(); y < box.max_corner().y(); ++y)
            if (Point p(x,y); bg::within(p, poly)) {
                std::cout << "in: " << bg::wkt(p) << std::endl;
            }
}

Prints

in: POINT(376 200)
in: POINT(376 201)
in: POINT(376 202)
in: POINT(377 200)
in: POINT(377 201)
in: POINT(377 202)
in: POINT(377 203)
in: POINT(377 204)
...

etc.

Sign up to request clarification or add additional context in comments.

1 Comment

+1, added a live demo On Coliru

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.