1.判断点在多边形内

对于简单多边形(边不自交)有两种方法可以判断,

第一种是看该点与多边形每条边构成的三角形面积和是否等于多边形的总面积.转角法

第二种是刘汝佳<<训练指南>>P271页介绍的射线法模板.

一个多边形就是二维平面上被一些列首尾相接、闭合的折线段围成的区域

在程序中一般用顶点数组表示,其中各个顶点按照逆时针顺序排列。

射线法,即判断穿越数。

从某个判定点出发,任意引一条射线。

如果和边界相交奇数次,说明点在多边形内;

如果相交偶数次,说明点在多边形外。

注意:如果射线在端点处和多边形相交,或者穿过一条完整的边,则需要重新引一条射线。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn=100+5;
const double eps=1e-10;
int dcmp(double x)
{if(fabs(x)<eps) return 0;return x<0?-1:1;
}
struct Point
{double x,y;Point(){}Point(double x,double y):x(x),y(y){}
}poly[maxn];
typedef Point Vector;
Vector operator-(Point A,Point B)
{return Vector(A.x-B.x,A.y-B.y);
}
double Dot(Vector A,Vector B)
{return A.x*B.x+A.y*B.y;
}
double Cross(Vector A,Vector B)
{return A.x*B.y-A.y*B.x;
}
bool InSegment(Point P,Point A,Point B)
{return dcmp(Cross(A-P,B-P))==0 && dcmp(Dot(A-P,B-P))<=0;
}
bool PointInPolygon(Point p,Point* poly,int n)
{int wn=0;for(int i=0;i<n;++i){if(InSegment(p,poly[i],poly[(i+1)%n])) return true;int k=dcmp(Cross(poly[(i+1)%n]-poly[i], p-poly[i]));int d1=dcmp(poly[i].y-p.y);int d2=dcmp(poly[(i+1)%n].y-p.y);if(k>0 && d1<=0 && d2>0) wn++;if(k<0 && d2<=0 && d1>0) wn--;}if(wn!=0) return true;return false;
}int main()
{int n,m;while(scanf("%d",&n)==1){for(int i=0;i<n;++i)scanf("%lf%lf",&poly[i].x,&poly[i].y);scanf("%d",&m);while(m--){Point p;scanf("%lf%lf",&p.x,&p.y);printf("%s\n",PointInPolygon(p,poly,n)?"Yes":"No");}}return 0;
}

2.凸包

凸包就是把给定点包围在内部的、面积最小的凸多边形。

什么是凸包问题? 
我们把这些点放在二维坐标系里面,那么每个点都能用 (x,y) 来表示。 
现给出点的数目,和各个点的坐标。求构成凸包的点?

凸包问题的五种解法

3.平面半相交

2018/8/22部分算法总结 二维几何常用算法相关推荐

  1. 《MATLAB智能算法30个案例》:第23章 基于蚁群算法的二维路径规划算法

    <MATLAB智能算法30个案例>:第23章 基于蚁群算法的二维路径规划算法 1. 前言 2. MATLAB 仿真示例 3. 小结 1. 前言 <MATLAB智能算法30个案例分析& ...

  2. 【运筹优化】结合天际线启发式的蚁群算法求解二维矩形装箱问题 + Java代码实现

    文章目录 一.天际线启发式 二.蚁群算法结合天际线启发式 2.1 构建序列 2.1.1 思路一 2.1.2 思路二 2.1.3 思路N 三.Java代码实现 3.1 项目结构 3.2 Ant 3.3 ...

  3. k近邻算法C++二维情况下的实现

    k近邻算法C++二维实现 这是一个k近邻算法的二维实现(即K=2的情况). #include <cstdio> #include <cstring> #include < ...

  4. python:实现9×9二维数组数独算法(附完整源码)

    python:实现9×9二维数组数独算法 from __future__ import annotationsMatrix = list[list[int]]# assigning initial v ...

  5. RRT路径规划算法在二维仿真环境中的应用 -- Python代码实现

    在上一节中,介绍了 RRT 算法的原理,这一节将一步步实现 RRT 路径规划算法在二维环境中的路径规划,来进一步加深对 RRT 算法的理解. 二维环境的搭建 我们将搭建下图所示的二维环境,绿色点为起点 ...

  6. Dijkstra 路径规划算法在二维仿真环境中的应用 -- Python代码实现

    在上一节中,介绍了 Dijkstra 算法的原理以及在图中的应用,这一节将一步步实现 Dijkstra 路径规划算法在二维环境中的路径规划,来进一步加深对 Dijkstra 算法的理解. 所需要用到的 ...

  7. 【halcon 线扫相机二维码矫正算法】

    halcon 线扫相机畸变二维码矫正算法 线扫相机拍照畸变 1.二维码定位与裁剪 图像矫正 运行结果 总结 线扫相机拍照畸变 线扫相机拍摄图片分辨率较高,但是由于相机本身或者或者拍照目标的运动,容易造 ...

  8. 【A_star二维路径规划】基于matlab A_star算法无人机二维路径规划(起终点障碍物可设置)【含Matlab源码 1321期】

    ⛄一.获取代码方式 获取代码方式1: 通过订阅紫极神光博客付费专栏,凭支付凭证,私信博主,可获得此代码. 获取代码方式2: 完整代码已上传我的资源:[A_star二维路径规划]基于matlab A_s ...

  9. 【运筹优化】蚁群算法求解二维矩形装箱问题(java代码实现)

    文章目录 1 前言 2 代码迁移 3 蚁群算法 3.1 蚂蚁类 Ant 3.2 蚁群算法类 ACO_Packing 4 运行结果 5 后话 [运筹优化]求解二维矩形装箱问题的算法合辑(Java代码实现 ...

最新文章

  1. centos6 rpm安装mysql_Centos6下rpm安装MySQL5.6
  2. C++用递归方式实现在对不更改随机数组的情况下查找最大值
  3. 《Python Cookbook 3rd》笔记(4.8):跳过可迭代对象的开始部分
  4. vue + vue-router + vue-resource 基于vue-cli脚手架 ---笔记
  5. 胡祖六回应“低价转让蚂蚁股权”一事:有误会 之后择时澄清
  6. netty应用场景_彻底搞懂 netty 线程模型
  7. 英语发音规则---A字母
  8. 打开计算机页面闪,电脑打开网页闪烁几大原因及解决
  9. 景深与焦距、物距、像元、光圈之间的关系
  10. 【化学信息学|机器学习】分子亲和力(Kd,Ki,IC50)
  11. (JAVA)基于Socket的TCP和UDP编程(第一章)
  12. 征信系统如何保障信息主体的合法权益?
  13. Mode Collapse 和 Mode Dropping的定义与不同
  14. 一个优秀的商业分析师是如何炼成的
  15. [置顶] LED办公楼宇照明节能方案及城市夜景照明节能方案
  16. 计算机二级考试怎么练题库,计算机二级考试单选题训练题库
  17. 各大搜索引擎网站收录提交入口
  18. Google 桌面 Linux 版 入门指南 Ubuntu 特刊
  19. java计算机毕业设计基于ssm的果蔬销售购物平台
  20. 基于JavaScript爬取法律文书案由信息

热门文章

  1. 卷积在深度学习中的作用(转自http://timdettmers.com/2015/03/26/convolution-deep-learning/)...
  2. mysql 查看碎片_MYSQL 碎片查询
  3. 数据库的基本操作习题
  4. GLSL 实现 FXAA 后处理效果
  5. MCAL-GTM之时钟管理CMU
  6. python pandas数据清洗:sample()函数
  7. 如何禁用笔记本触摸板
  8. windows10计算机放桌面,将win10计算器放在桌面上的操作方法
  9. android 播放视频文件格式,Android视频文件格式解析相关分析
  10. 【云原生之k8s】k8s管理工具kubectl详解