这个问题已经有了答案:
Point in Polygon aka hit test
C# Point in polygon
给定在笛卡尔坐标系中用N个线方程组成的随机多边形,是否有任何标准公式用于检查点(x,y)的隶属度?
简单的解决方案是获取所有线公式并检查点X是否在该线下方,在该线上方和另一条线的右侧,等等。但这可能是乏味的。
我应该注意,多边形可以是任何形状,任意数量的边,可以是凹面或凸面。
为方便起见,我已经添加了这些实用程序功能:
float slope(CGPoint p1, CGPoint p2)
{
return (p2.y - p1.y) / (p2.x - p1.x);
}
CGPoint pointOnLineWithY(CGPoint p, float m, float y)
{
float x = (y - p.y)/m + p.x;
return CGPointMake(x,y);
}
CGPoint pointOnLineWithX(CGPoint p, float m, float x)
{
float y = m*(x - p.x) + p.y;
return CGPointMake(x, y);
}
答案 0 :(得分:21)
如果有顶点,则可以计算测试点与构成多边形的每对点之间的角度之和。 如果它是2 * pi,那么它是一个内部点。如果它是0,则它是一个外部点。
一些代码:
typedef struct {
int h,v;
} Point;
int InsidePolygon(Point *polygon,int n,Point p)
{
int i;
double angle=0;
Point p1,p2;
for (i=0;i<n;i++) {
p1.h = polygon[i].h - p.h;
p1.v = polygon[i].v - p.v;
p2.h = polygon[(i+1)%n].h - p.h;
p2.v = polygon[(i+1)%n].v - p.v;
angle += Angle2D(p1.h,p1.v,p2.h,p2.v);
}
if (ABS(angle) < PI)
return(FALSE);
else
return(TRUE);
}
/*
Return the angle between two vectors on a plane
The angle is from vector 1 to vector 2, positive anticlockwise
The result is between -pi -> pi
*/
double Angle2D(double x1, double y1, double x2, double y2)
{
double dtheta,theta1,theta2;
theta1 = atan2(y1,x1);
theta2 = atan2(y2,x2);
dtheta = theta2 - theta1;
while (dtheta > PI)
dtheta -= TWOPI;
while (dtheta < -PI)
dtheta += TWOPI;
return(dtheta);
}
来源:http://paulbourke.net/geometry/insidepoly/
您可以查看其他地方: http://alienryderflex.com/polygon/
http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
http://sidvind.com/wiki/Point-in-polygon:_Jordan_Curve_Theorem