判断点集与多边形的位置关系

  • 点集与凸多边形
  • 点集与一般性多边形

点集与凸多边形

点集或者是点与多边形位置关系无非就三种

  • 点在多边形的内部
  • 点在多边形的外部
  • 点在多边形上
    一般如果该多边形是凸的那么我们可以直接用面积法或者向量法来解决位置关系,如下图所示:

点集与一般性多边形

但是更为一般的多边形可能有凸有凹,该方法便不再适用,如下图所示:

根据该思路可以使用射线法,首先看看射线法的基本操作:
从目标点引一条射线与多边形做交,当交点个数为奇数说明该点在多边形内部,若是为偶数则该点位于多边形外部,且该方法也适用于内部有封闭轮廓的多边形。


图中绿色点为在外部的点,蓝色为在内部和边缘的点:
具体实现代码:

返回是否在多边形内部

//border 为轮廓点集, test1为测试点集
bool IsinPolygon(Border &border, vector<vec2>&test1)
{//射线法求点在多边形内部int numcrossline = 0;int numvecpol = border.p.size();for (int n = 0; n < test1.size(); n++){for (int i = 0; i < numvecpol; ++i){int j = (i + 1) % numvecpol;if ((((border.p[i][1] > test1[n][1]) != (border.p[j][1] > test1[n][1])) &&(test1[n][0] < (border.p[j][0] - border.p[i][0])*(test1[n][1] - border.p[i][1]) / (border.p[j][1] - border.p[i][1]) + border.p[i][0])))//                &&(((border2.p[i][1] > pp[n][1]) != (border2.p[j][1] > pp[n][1])) &&//               (pp[n][0] < (border2.p[j][0] - border2.p[i][0])*(pp[n][1] - border2.p[i][1]) / (border2.p[j][1] - border2.p[i][1]) + border2.p[i][0]))){numcrossline = numcrossline + 1;}}if (numcrossline % 2 == 0){test1.erase(test1.begin() + n);}else{return false;numcrossline = 0;}}return true;
}

返回结果为在内部的点

vector<vec2> IsinPolygon(Border &border, vector<vec2>&test1)
{//射线法求点在多边形内部int numcrossline = 0;int numvecpol = border.p.size();for (int n = 0; n < test1.size(); n++){for (int i = 0; i < numvecpol; ++i){int j = (i + 1) % numvecpol;if ((((border.p[i][1] > test1[n][1]) != (border.p[j][1] > test1[n][1])) &&(test1[n][0] < (border.p[j][0] - border.p[i][0])*(test1[n][1] - border.p[i][1]) / (border.p[j][1] - border.p[i][1]) + border.p[i][0])))//                &&(((border2.p[i][1] > pp[n][1]) != (border2.p[j][1] > pp[n][1])) &&//               (pp[n][0] < (border2.p[j][0] - border2.p[i][0])*(pp[n][1] - border2.p[i][1]) / (border2.p[j][1] - border2.p[i][1]) + border2.p[i][0]))){numcrossline = numcrossline + 1;}}if (numcrossline % 2 == 0){}else{test1.erase(test1.begin() + n);n--;//n--2020.3.13numcrossline = 0;}}return test1;
}

判断点集与多边形的位置关系相关推荐

  1. C#判断点和直线的位置关系

    /// <summary>/// 判断点和直线的位置关系/// </summary>/// <param name="LinePntA">直线上 ...

  2. 判断点与圆的位置关系

    判断点与圆的位置关系 第一步,创建一个类,代表二维空间的一个点.二维空间确定一个点可参考平面直角坐标系中,确定了x坐标和y坐标,即可确定点的位置 package com.tyl.homework;im ...

  3. c++实现判断点与圆的位置关系

    Question: c++实现判断点与圆的位置关系 (1)点在圆上 (2)点在圆内 (3)点在圆外 c++代码实现: #include <iostream>using namespace ...

  4. 如何判断直线和圆的位置关系?

    在学生已经掌握"直线的方程"和"圆的方程"的基础上,会进一步研究直线与圆的位置关系.通过课本上的介绍,我们知道直线与圆的位置关系包括了好几种,那么怎样才能给学生 ...

  5. C++实现设计一个圆形类(Circle),和一个点类(Point), 计算并判断点和圆的位置关系

    题目要求 设计一个圆形类(Circle),和一个点类(Point), 计算并判断点和圆的位置关系. 无分区版 : #include <iostream> using namespace s ...

  6. 判断两个圆形的位置关系

    自定义方法判断两个圆形的位置关系 用的是cocos引擎,如果没用过我说下实现方法 思路很简单,只要根据两个圆的中心距离和半径比较就可以得出位置关系 // return: -1 不相交 0 正常相交 1 ...

  7. 判断点和直线的位置关系

    ```csharp/// <summary>/// 判断点和直线的位置关系/// </summary>/// <param name="LinePntA&quo ...

  8. AcWing 2983. 玩具 / POJ 2318.toys(计算几何基础、二分、判断点和直线的位置关系)

    计算几何基础题 题目大意就是一个盒子被分成了若干个区域,有m个小球,问每个区域里分别有多少个小球. 我们首先考虑暴力. 我们如何判断小球是否在一个区域内呢,我们发现一个小球在区域x,也就是说所有小于x ...

  9. C++类实例:判断点和圆的位置关系

    C++学习记录 给定一个点和一个圆,总体有三个位置关系:1.点在圆内:2.点在圆外:3.点在圆上 设计一个C++程序,输入一个圆的坐标和半径,以及一个点的位置坐标,实现相对位置的判断.如下图所示: u ...

最新文章

  1. python中的tuple_python 数据类型 - tuple
  2. WPF自定义命令(转)
  3. 截取AVI格式的视频C语言代码
  4. mysql-5.7.24初始化数据库_MySQL5.7.28 初始化数据库
  5. 8能达到go速度吗 php_相同逻辑的php与golang代码效率对比,最好语言落谁家…
  6. windows .bat批处理实现进程监控确保程序运行
  7. 云计算设计模式(二十四)——仆人键模式
  8. Win7平台下配置Sublime Text2 的C++编译环境
  9. 第四十二节,configparser特定格式的ini配置文件模块
  10. 程序设计与c语言区别,c语言程序设计和c程序设计有什么区别啊
  11. ucos操作系统(2)——OSTimeDly
  12. 2022年fw保研经验(东南大学网安、湖南大学计科学硕、中科院沈阳自动化所,最终东南网安)
  13. 3D图库框架范围与示例
  14. 如何用Python操作Excel自动化办公?一个案例教会你openpyxl——图表设计和透视表
  15. 网易笔试001(HR之声)
  16. 网络编程+go+java,Go语言中的TCP/IP网络编程
  17. latex审阅版添加行号,遇见公式就缺失行号
  18. 一起学libcef--正确关闭你创建的浏览器
  19. “人机大战”简单复盘
  20. 使用Ultra Librarian把bxl文件转为CAD Capture CIS的原理图库及Allegro的PCB封装库

热门文章

  1. 如何下载bing必应首页图片
  2. 基于centos8部署nextcloud+onlyoffice----2021-07-16
  3. WPS怎么转换成PDF?这样转换准没错
  4. RocketMQ延迟消息的代码实战及原理分析
  5. 【转】Python之获取每日涨停板股票数据并绘制K线图!
  6. 怎么给自己的电脑连接打印机
  7. LifeSmart云起局域网直接控制向往背景音乐
  8. tensorflow2.0实现DeepFM
  9. 基于STM32的五子棋游戏
  10. RTC实时时钟实验学习笔记一