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.
Solved by dynamicscope. 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