点是否在多边形内,是一个很经典的问题,方法也很成熟,但是去github或网上找的资料感觉有些乱,我在他们基础上做了整理,点是否在多边形内的判别方法有多种,其算法具体原理在此不赘述,有比较好的博客,我一并放置在此。我要做的是使用射线法来判断点是否在多边形内部并使用C语言实施了其判定过程。

射线判别法原理如下:

从目标点出发引一条射线,看这条射线和多边形所有边的交点数目。如果有奇数个交点,则说明在内部,如果有偶数个交点,则说明在外部。

射线判别法对点在多边形边上的判断时不可靠的,这个需要附加一个点在直线上的判断来完善。点在线段上的判断也是有方法的,原理在此也不赘述。

比较好的参考博客如下:

1、https://wrf.ecse.rpi.edu//Research/Short_Notes/pnpoly.html

      PNPOLY - Point Inclusion in Polygon Test  W. Randolph Franklin (WRF)

      这篇博客应该是好多使用下面这段代码:

int pnpoly(int nvert, float *vertx, float *verty, float testx, float testy)
{int i, j, c = 0;for (i = 0, j = nvert-1; i < nvert; j = i++) {if ( ((verty[i]>testy) != (verty[j]>testy)) &&(testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )c = !c;}return c;
}

最原始的出处吧,这段代码结构很精简,初看时有些懵,仔细一分析,对有这种精巧构思的人由衷的佩服,我在使用射线法判断时也是仿照于此改写了下。

2、https://github.com/BlackMATov/pnpoly.h

这是一个人对1的一个C程序的完善和补充。

其他的感觉写的有些乱,在此不说了,想看的去github上就可以

3、https://www.cnblogs.com/anningwang/p/7581545.html

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

这个博客其实只说了射线法,有图有文字,而且也应用了1中的代码,讲解的清晰。

4、https://blog.csdn.net/u011722133/article/details/52813374

这篇文章总结了一下点是否在多边形内的多种判别方法。

5、https://blog.csdn.net/liangzhaoyang1/article/details/51088475?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

这篇博客用C++实现了点是否在直线段上判别

在参考上述等人基础上我实现的点是否在多边形内的射线判别法及其特殊处理C程序如下:

//httPnts://wrf.ecse.rP1.edu//Research/Short_Notes/pnpoly.html
#include <stdio.h>typedef struct _Point
{float x;float y;
} Point;inline float max(float a, float b) { return a > b ? a : b; }
inline float min(float a, float b) { return a < b ? a : b; }void GetPntsExtremeXYs(Point *Pnts,int PntNum,float *MinX,float *MaxX,float *MinY,float *MaxY)
{*MinX=Pnts[0].x;*MaxX=Pnts[0].x;*MinY=Pnts[0].y;*MaxY=Pnts[0].y;Point P;for(int i=1;i<PntNum;i++){P=Pnts[i];if(P.x<*MinX)*MinX=P.x;if(P.x>*MaxX)*MaxX=P.x;if(P.y<*MinY)*MinY=P.y;if(P.y>*MaxY)*MaxY=P.y;}
}int PointInLineSegment(Point P1,Point P2,Point Q)
{if((Q.x - P1.x) * (P2.y - P1.y) == (P2.x - P1.x) * (Q.y - P1.y)//P1,P2,Q共线&& min(P1.x , P2.x) <= Q.x && Q.x <= max(P1.x , P2.x)    && min(P1.y , P2.y) <= Q.y && Q.y <= max(P1.y , P2.y))return 1;elsereturn 0;
}int IsPointInPolygon(Point *Pnts,int PntNum,Point Q)
{float MinX,MaxX,MinY,MaxY;GetPntsExtremeXYs(Pnts,PntNum,&MinX,&MaxX,&MinY,&MaxY);if(Q.x<MinX||Q.y<MinY||Q.x>MaxX||Q.y>MaxY)//判别点在多边形正最小外接矩形外return 0;int i, j, c = 0;Point P1,P2;for (i = 0, j = PntNum-1; i < PntNum; j = i++) {P1=Pnts[i];P2=Pnts[j];if(PointInLineSegment(P1,P2,Q))//点在多边形的边上return 1;if (((P1.y>Q.y) != (P2.y>Q.y)) &&//这行代码既表达了Y轴在起始结束点之间,又同时解决了射线点如果和边框线顶点重合的问题(Q.x < (P2.x-P1.x) * (Q.y-P1.y) / (P2.y-P1.y) + P1.x))//在此假设从Q点水平向右引出一条射线,因此可以由Q.y带入直线方程计算出xc = !c;//奇数次为真}return c;
}/*
int pnpoly (int nvert, float *vertx, float *verty, float testx, float testy) {int i, j, c = 0;for (i = 0, j = nvert-1; i < nvert; j = i++) {if ( ( (verty[i]>testy) != (verty[j]>testy) ) &&(testx < (vertx[j]-vertx[i]) * (testy-verty[i]) / (verty[j]-verty[i]) + vertx[i]) )c = !c;}return c;
}*/void main()
{float Polygon[10][2]={{123,394},{190,411},{206,344},{271,291},{518,299},{522,414},{564,417},{637,297},{579,246},{189,228}};Point Pnts[10];int PntNum=10;for(int i=0;i<PntNum;i++){Pnts[i].x=Polygon[i][0];Pnts[i].y=Polygon[i][1];}//float TestPnts[10][2]={{123,394},{190,411},{206,344},{271,291},{518,299},{522,414},{564,417},{637,297},{579,246},{189,228}};Point Q;//{583,241}Q.x=583;Q.y=241;if(IsPointInPolygon(Pnts,PntNum,Q))printf("Point Q in Polygon\n");elseprintf("Point Q not in Polygon\n");
}

下面是上述多边形和测试点

点是否在多边形内的射线判别法及其特殊处理C程序相关推荐

  1. python 判断一个点(坐标)是否在一个多边形内利用射线法

    看了一篇博客写的用射线法判断一个经纬度点是否在一个多边形的内部的方法 经验证可行所以拿来用作备份: class Point:lng = ''lat = ''def __init__(self, lng ...

  2. 射线法判断点是否在多边形内-JAVA

    1.定义点 public class Point {private BigDecimal x;private BigDecimal y;public Point() {};@Overridepubli ...

  3. python射线法判断点是否在多边形内

    python3射线法判断点是否在多边形内 射线法 首先我们要先理解什么是射线法.射线法的意思是:在随机点上做一条平行于x轴的射线,方向是x轴正方向,看这条射线与多边形区域的交点个数,如果是偶数,那么这 ...

  4. 射线法判断点在多边形内适用范围_X射线荧光光谱仪原理及主要技术指标对比...

    X荧光光谱仪主要由激发源(X射线管)和探测系统构成.其原理就是:X射线管通过产生入射X射线(一次X射线),来激发被测样品. 受激发的样品中的每一种元素会放射出二次X射线(又叫X荧光),并且不同的元素所 ...

  5. c语言实现点在多边形内部,C语言中实现 点在多边形内 算法

    来源: 天极网 作者: 若水 2008-05-15/01:29 本文是采用射线法判断点是否在多边形内的C语言程序.多年前,我自己实现了这样一个算法.但是随着时间的推移,我决定重写这个代码.参考周培德的 ...

  6. 判断点是否处于多边形内的三种方法(转)

    1. 叉乘判别法(只适用于凸多边形)想象一个凸多边形,其每一个边都将整个2D屏幕划分成为左右两边,连接每一边的第一个端点和要测试的点得到一个矢量v,将两个2维矢量扩展成3维的,然后将该边与v叉乘,判断 ...

  7. [math]判断一个点是否在多边形内的方法

    文章目录 向量叉乘判别法 面积和判别法 夹角和判别法 引射线法 PNPoly算法 多边形的内角是由两条相邻边形成边界之内的角:如果一个多边形的所有内角均小于180°,则该多边形为凸(convex)多边 ...

  8. 电子海图中点在多边形内的判定

    1          算法背景        在电子海图系统中,经常需要用到判断一个点(可能是一个船位,或者其它点状物标)是否在某个多边形区域内(矩形或圆也可看作特殊的多边形),比如某个警戒区,作业区 ...

  9. php之判断点在多边形内的api

    1.判断点在多边形内的数学思想:以那个点为顶点,作任意单向射线,如果它与多边形交点个数为奇数个,那么那个点在多边形内,相关公式: <?php class AreaApi{//$area是一个多边 ...

最新文章

  1. Spark SQL基本操作以及函数的使用
  2. Device Tree(三):代码分析
  3. 10个具体项目生动精彩讲述JavaScript;超级Web应用,构建不再困难
  4. php的异常处理,PHP异常处理Exception类
  5. 让SpringMVC Restful API优雅地支持多版本
  6. MFC的类层次结构图
  7. uva 12100 Printer Queue 优先级队列模拟题 数组模拟队列
  8. UVa 297 - Quadtrees
  9. java题霸_牛客题霸每日一题 + NC50 + Java题解
  10. 在字符串中找出第一个只出现一次的字符
  11. 3C(Computer、Communication、Consumer Electronic)
  12. 基于typescript的rtsp客户端实现
  13. body签名json序列号乱序,null参数问题
  14. Atitit java wav 压缩 mp3功能总结 目录 1.1. Lame mp3编码器 1 1.2. 使用时发现错误,不支持Unsupported number of channels: 4
  15. 打开本地安全策略的方式
  16. 苹果动图分享给android,苹果实况图片怎么发给别人
  17. c语言编译器tc2.0,深入认识 Turbo C 编译器 C语言 TC2.0.doc
  18. Hadoop的学习前景怎么样,Hadoop培训后的职业规划
  19. UVA 12307 Smallest Enclosing Rectangle
  20. Python正则re模块详解

热门文章

  1. Linq中的group by多表多字段
  2. 全站 HTTPS 来了
  3. Human-level control through deep reinforcement learning
  4. APP如何变现?主流变现方式有这些
  5. 微软必应推出移动输入法
  6. 将Simulink中的数据更新到GUI中(记录)
  7. (附源码)计算机毕业设计java视频点播系统
  8. WCF各种banding支持的类型
  9. html怎么创建盒子,html布局(盒子)
  10. additional、extra与supplementary 区别