Monday, February 23, 2009

How to determine a point inside a polygon?

Assume that you have a polygon in you OpenGL

class scrPt
{
public: GLint x, y;
};

scrPt vert1, vert2, vert3,vert4,vert5,vert6,vert7;

vert1.x = 250;
vert1.y = 250;

vert2.x = 225;
vert2.y = 200;

vert3.x = 200;
vert3.y = 250;

vert4.x = 175;
vert4.y = 200;

vert5.x = 175;
vert5.y = 250;

vert6.x = 150;
vert6.y = 250;

vert7.x = 200;
vert7.y = 300;

//seed.x = 200;
//seed.y = 250;

glBegin (GL_POLYGON);
glVertex2i (vert1.x, vert1.y);
glVertex2i (vert2.x, vert2.y);
glVertex2i (vert3.x, vert3.y);
glVertex2i (vert4.x, vert4.y);
glVertex2i (vert5.x, vert5.y);
glVertex2i (vert6.x, vert6.y);
glVertex2i (vert7.x, vert7.y);
glEnd ( );

// this is the function to past you test point (x,y)
//if the point is inside, it return TRUE

//--------------------start-------------------------

bool insidePolygon(int x,int y)
{
int polySides = 7;// 7 corners
int i;
int j=polySides-1;
bool flag = false;

int polyX[]={vert1.x,vert2.x,vert3.x,vert4.x,vert5.x,vert6.x,vert7.x};
int polyY[]={vert1.y,vert2.y,vert3.y,vert4.y,vert5.y,vert6.y,vert7.y};

//origial idea from this excellent page
//http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html

for (i = 0; i < polySides; i++)
{
if ( ((polyY[i]>y) != (polyY[j]>y))
&& (x < (polyX[j]-polyX[i]) * (y-polyY[i]) / (polyY[j]-polyY[i]) + polyX[i]) )
{
flag=!flag;
}
j=i;
}

return flag;
}
//--------------------end-------------------------

No comments:

iphone 3gs review