简体   繁体   中英

Point inside or in boundary of polygon

I'm using the algorithm in http://www.ecse.rpi.edu/~wrf/Research/Short_Notes/pnpoly.html , but when the input point is in boundary, that algorithm gives wrong for me. Can anyone help me with point in boundary case? Any help is appreciated.

This is the main function

#include <iostream>
#include <Polygon.h>
using namespace std;

int main()
{
    vector<Point> v;
    //v.push_back(make_pair(3.0,3.0));
    v.push_back(make_pair(1.0,1.0));
    v.push_back(make_pair(1.0,5.0));
    v.push_back(make_pair(5.0,5.0));
    v.push_back(make_pair(5.0,1.0));
    Polygon *p = new Polygon(v);
    cout << "A: " << p->IsInside(make_pair(1.0,3.0)) << endl;
    cout << "B: " << p->IsInside(make_pair(3.0,1.0)) << endl;
    cout << "C: " << p->IsInside(make_pair(5.0,3.0)) << endl;
    cout << "D: " << p->IsInside(make_pair(3.0,5.0)) << endl;
    delete p;
    return 0;
}

This is the checking function

bool Polygon::IsInside(Point p)
{
    /*determine whether a point is inside a polygon or not
     *  polygon's vertices need to be sorted counterclockwise
     *  source :
     *      http://www.ecse.rpi.edu/~wrf/Research/Short_Notes/pnpoly.html
    */
    bool ans = false;
    for(size_t c=0,d=this->vertices.size()-1; c<this->vertices.size(); d=c++)
    {
        if( ((this->vertices[c].y > p.y) != (this->vertices[d].y > p.y)) &&
            (p.x < (this->vertices[d].x - this->vertices[c].x) * (p.y - this->vertices[c].y) /
                (this->vertices[d].y - this->vertices[c].y) + this->vertices[c].x) )
           ans = !ans;
    }
    return ans;
}

From the website documentation: "PNPOLY partitions the plane into points inside the polygon and points outside the polygon. Points that are on the boundary are classified as either inside or outside. ..." Please read the documentation available on the site again.It answers your question. In the end, you will probably have to to live with the ambiguity of floating point calculations.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM