判断点是否在图形(矩形、椭圆、多边形)内的算法(一)
https://blog.csdn.net/lweiyue/article/details/121898729
还是叫明
于 2021-12-13 10:26:57 发布
3081
收藏 8
分类专栏: 算法 文章标签: 算法 几何学 多边形 椭圆
版权
算法
专栏收录该内容
23 篇文章4 订阅
订阅专栏
我们在下面的介绍中,只讨论三种图形,分别是矩形(包括正方形)、椭圆(包括圆)和多边形。对于矩形和椭圆,比较常见的描述方法是(x,y,w,h),另外再加一个旋转角度a(绕中心旋转)。而对于多边形,一般的描述方法是一个二维点的数组。事实上矩形也是多边形(四边形),因为它的描述方法不一样,所以我们分开讨论。
一、无旋转矩形
这是最简单的一种情况,判断方法也简单。只要判断点的横坐标是否在[x,x+w]、纵坐标是否是[y,y+h]内即可。
二、旋转矩形
对于旋转矩形,比较常规的做法是:
1、求出未旋转状态下的四个顶点。
2、算出四个顶点绕中心旋转后的坐标。
3、用判断多边形的方法(后面才介绍呢),算出点是否在这个四边形内。
很容易看出,这个方法要做4次旋转计算,以及1次多边形边界计算。事实上,我们有更好的方法。
其实可以转换一下思维,把要判断的点,绕矩形中心,以相反方向旋转,再跟未旋转的矩形相比较即可。这种方法只需要做1次旋转计算,而且是否在未旋转矩形内的判断是很简单的。
三、旋转椭圆
我们知道,最简单的椭圆方程是:
它是一个以原点为中心,以2a为长轴,以2b为短轴的椭圆。对于这个椭圆,如果代入一个点P(x,y),使得C>1,那么P在椭圆外,反之,如果C<1,那么P在椭圆内。
所以,我们只要求出在(x,y,w,h,a)这种描述下的椭圆方程即可。
我们令:
ca = w / 2;
cb = h / 2;
dx = x + ca;
dy = y + cb;
sin = sin(a);
cos = cos(a);
rx = px - dx;
ry = py - dy;
那么椭圆方程是:
四、多边形
判断一个点是否在多边形内的核心思想是,由点向任意方向引出一条射线,如果点跟多边形的交点为奇数,则点在多边形内,如果为偶数,则点在多边形外。
下面的代码可完成这一功能:
bool InPolygon(Point point, Point[] polygon)
{
bool _in = false;
for (int i = 0, j = polygon.Length - 1; i < polygon.Length; j = i++)
{
if (((polygon[i].Y > point.Y) != (polygon[j].Y > point.Y)) &&
(point.X < (polygon[j].X - polygon[i].X) * (point.Y - polygon[i].Y) / (polygon[j].Y - polygon[i].Y) + polygon[i].X))
_in = !_in;
}
return _in;
}
————————————————
版权声明:本文为CSDN博主「还是叫明」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/lweiyue/article/details/121898729