20221017 判断点是否在图形(矩形、椭圆、多边形)内的算法(一)

判断点是否在图形(矩形、椭圆、多边形)内的算法(一)
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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值