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

我们在下面的介绍中,只讨论三种图形,分别是矩形(包括正方形)、椭圆(包括圆)和多边形。对于矩形和椭圆,比较常见的描述方法是(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;
}

  • 8
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值