Community
Hi,
I want to check if a point lies inside a polygon and i also want to check if that particular point lies on the polygon.
Thanks
Gulzar
Solved! Go to Solution.
I use the following algorithm. Try this.
public struct Point { public double x; public double y; public Point(double _x, double _y) { x = _x; y = _y; } } // wn_PnPoly(): winding number test for a point in a polygon // Input: P = a point, // V[] = vertex points of a polygon V[n+1] with V[n]=V[0] // Return: wn = the winding number (=0 only if P is outside V[]) public static bool IsInPolygon(Point[] V, Point P, int n) { int wn = 0; // the winding number counter // loop through all edges of the polygon for (int i = 0; i < n; i++) { // edge from V[i] to V[i+1] if (V[i].y <= P.y) { // start y <= P.y if (V[i + 1].y > P.y) // an upward crossing if (isLeft(V[i], V[i + 1], P) > 0) // P left of edge ++wn; // have a valid up intersect } else { // start y > P.y (no test needed) if (V[i + 1].y <= P.y) // a downward crossing if (isLeft(V[i], V[i + 1], P) < 0) // P right of edge --wn; // have a valid down intersect } } if (wn == 0) return false; else return true; } // isLeft(): tests if a point is Left|On|Right of an infinite line. // Input: three points P0, P1, and P2 // Return: >0 for P2 left of the line through P0 and P1 // =0 for P2 on the line // <0 for P2 right of the line // See: the January 2001 Algorithm "Area of 2D and 3D Triangles and Polygons" internal static double isLeft( Point P0, Point P1, Point P2 ) { return ( (P1.x - P0.x) * (P2.y - P0.y) - (P2.x - P0.x) * (P1.y - P0.y) ); }
Hi,
Thanks for the reply.
I tried using the above code but it gives same results for point on polygon and for point inside polygon.Is there any way to differentiate.
Thanks
Gulzar
Can't find what you're looking for? Ask the community or share your knowledge.