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

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

  1. 如何判断一个点在矩形或多边形内

    先说一下,两个方法均是js实现,均是转载自其他大佬的文章,地址贴在下面 我最近接了个单子,里面有很多大棚,要求鼠标进入大棚范围高亮,我试过网上很多方法.大多不准确,或者说不适合有很多矩形.多边形的这种 ...

  2. 判断点在多边形内的算法(Winding Number详解)

    在计算几何中,判定点是否在多边形内,是个非常有趣的问题.通常有两种方法: 1.Crossing Number(交叉数) 它计算从点P开始的射线穿过多边形边界的次数.当"交叉数"是偶 ...

  3. 判断一个坐标点是否在不规则多边形内部的算法

    参考:https://wrf.ecse.rpi.edu//Research/Short_Notes/pnpoly.html 在GIS(地理信息管理系统)中,判断一个坐标是否在多边形内部是个经常要遇到的 ...

  4. 如何判断一个点是否在多边形内?(转)

    转自:https://blog.csdn.net/u011722133/article/details/52813374 在GIS(地理信息管理系统)中,判断一个坐标是否在多边形内部是个经常要遇到的问 ...

  5. 点是否在多边形内的射线判别法及其特殊处理C程序

    点是否在多边形内,是一个很经典的问题,方法也很成熟,但是去github或网上找的资料感觉有些乱,我在他们基础上做了整理,点是否在多边形内的判别方法有多种,其算法具体原理在此不赘述,有比较好的博客,我一 ...

  6. Android利用canvas画各种图形(点、直线、弧、圆、椭圆、文字、矩形、多边形、曲线、圆角矩形)

    1.首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, ...

  7. java 坐标系运算 判断一个地理坐标是否在电子围栏 圆、矩形、多边形区域内

    测试没问题,我用的是原始坐标:要注意的是坐标转换问题,要看当前是属于什么坐标系 经纬度与GCS(Geographic Coordinate System, 地理坐标系统) 平面坐标与PCS(Proje ...

  8. Android利用canvas画各种图形(点、直线、弧、圆、扁圆、文字、矩形、多边形、曲线、圆角矩形)

    1.首先说一下canvas类: Class Overview The Canvas class holds the "draw" calls. To draw something, ...

  9. 多边形碰撞检测(判断点在多边形内)

    点与规则的矩形或者等边.等腰三角形等的碰撞检测很简单,本文主要是介绍"点与多边不规则图形的碰撞检测". 如图,这个多边形已经相当复杂,包含凸和凹,该如何解决呢? 结论:使用交点数判 ...

最新文章

  1. python读取word
  2. UESTC 1811 Hero Saving Princess
  3. vscode更改插件路径_用好这7个 VS Code 插件,效率蹭蹭涨!
  4. fd_set struct
  5. meta标签的用处详解
  6. 力扣191.位1的个数
  7. 股票的科创板,新三板,创业板到底哪个能让你赚钱
  8. 加拿大程序员趣闻系列 1/N
  9. 项目组【网站】的项目
  10. HTTP缓存ETAG和Last-Modified
  11. 返回顶部代码 缓慢的返回顶部
  12. AD画板,如何提高工作效率?
  13. 0ops CTF/0CTF writeup
  14. Hard samples mining
  15. Google Earth Engine——美国人口数据可视化分析
  16. 第二证券|A股集体收涨,汽车产业链爆发!房地产延续强势
  17. 推荐10款社群运营必备工具
  18. 分区空间分配:window10怎样把C盘空间分一点给D盘?
  19. excel表格转vcf图文教程详解
  20. 差示光谱法的测定原理_材料基础知识学习,钢中碳含量的7种测定方法,你知道吗?...

热门文章

  1. Ubuntu 16.04启动时进入welcome to emergency mode!
  2. python切换路径到当前目录
  3. 【转】Mac突然连不上WiFi解决步骤
  4. HNUST--2187 最小生成树(邻接矩阵或邻接表)
  5. html5+css3响应式布局应该考虑到的屏幕的尺寸
  6. 新品周刊 | 内马尔携手极度干燥推出内衣系列;安踏儿童与中国航天推出热返科技羽绒服...
  7. 怎么在Windows电脑更新 DirectX ?
  8. 《中国电机工程学报》投稿分享
  9. 《软件方法》第四章 自测题
  10. C语言学习———函数