首先判断要检测的点是否在边上

然后再判断射线是否经过一个线段的端点,如果经过低端点不计数,经过高端点计数

#include <vector>
#include <string>
#include <iostream>
#include <cmath>
#include <stdio.h>using namespace std;const double eps = 1e-10;const int N = 103;bool lessEqual(double a, double b) {//<=return a < b + eps;
}bool largerEqual(double a, double b) {// >=return a + eps > b;
}bool equal(double a, double b) {return fabs(a-b) < eps;
}struct point {double x;double y;point(){}point(double a, double b) :x(a),y(b) {}
};point ps[N];
int num;
int m;//(b-a)X(c-a)
//如果b在c的右手边,为正;
//b在c的左手边,为负
//a,b,c共线,0
double x_multi(point &a, point &b, point &c) {return (b.x - a.x) * (c.y - a.y) - (c.x - a.x) * (b.y - a.y);
}//(b-a)X(c-a)
//夹角小于90,正
//大于90,负
//等于90,0
double dot_multi(point &a, point &b, point &c) {return (b.x - a.x) * (c.x - a.x) + (b.y - a.y) * (c.y - a.y);
}bool onSegment(point &a, point &b, point &c) {//c点是否在线段ab之间double max_x = max(a.x, b.x);double max_y = max(a.y, b.y);double min_x = min(a.x, b.x);double min_y = min(a.y, b.y);if (equal(x_multi(a,b,c),0.0) && lessEqual(c.x,max_x) && largerEqual(c.x, min_x) && lessEqual(c.y, max_y) && largerEqual(c.y, min_y))return true;return false;
}bool onLine(point &a, point &b, point &c) {//已知a,b,c共线double max_x = max(a.x, b.x);double max_y = max(a.y, b.y);double min_x = min(a.x, b.x);double min_y = min(a.y, b.y);if (lessEqual(c.x,max_x) && largerEqual(c.x, min_x) && lessEqual(c.y, max_y) && largerEqual(c.y, min_y))return true;return false;
}bool segmentIntersect(point &a, point &b, point &c, point &d) {//两条线段是否相交double d1 = x_multi(a,b,d);double d2 = x_multi(a,b,c);double d3 = x_multi(c,d,a);double d4 = x_multi(c,d,b);if (d1*d2 < 0 && d3 * d4 <0)return true;if (equal(d1,0.0) && onLine(a,b,d))return true;if (equal(d2,0.0) && onLine(a,b,c))return true;if (equal(d3,0.0) && onLine(c,d,a))return true;if (equal(d4,0.0) && onLine(c,d,b))return true;return false;
}bool isInside(point &pt) {int count = 0;point end(1e9,pt.y);for (int i = 0; i < num; ++i) {int j = (i+1)%num;if (onSegment(ps[i], ps[j], pt))return true;if (!equal(ps[i].y, ps[j].y)) {point low = ps[i];if (low.y > ps[j].y)low = ps[j];if (onSegment(pt,end,low))//较低端点不计算continue;if (segmentIntersect(pt,end,ps[i],ps[j]))++count;/*int tmp = -1;if (onSegment(pt,end,ps[i]))tmp = i;else if (onSegment(pt,end,ps[j]))tmp = j;if(tmp != -1 && equal(ps[tmp].y, max(ps[i].y,ps[j].y)))++count;else if (tmp == -1 && segmentIntersect(ps[i],ps[j],pt,end))++count;*/}}return count % 2==1;
}int main() {int ind = 1;while (scanf("%d", &num) && num !=0) {scanf("%d", &m);for (int i = 0; i < num ; ++i){scanf("%lf%lf",&ps[i].x, &ps[i].y);}if (ind !=1)cout<<endl;cout<<"Problem "<<ind<<":"<<endl;++ind;for (int i = 0; i < m; ++i) {point pt;scanf("%lf%lf", &pt.x, &pt.y);if (isInside(pt))cout<<"Within"<<endl;elsecout<<"Outside"<<endl;}}
}

zoj1081判断点是否在多边形内相关推荐

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

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

  2. 如何判断一个点在多边形内

    一.从三角形开始说起---怎么判断一个点在三角形内 三角形是最简单的多边形了.先说说三角形有哪些判断方法. 参考自:判断一个点是否在三角形内部 - 知乎 几种方法判断平面点在三角形内_独L无二的博客- ...

  3. 判断一点是否在多边形内(附Java实现代码)

    引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数射线法 时间复杂度:O(n) 适用范围:任意多边形 个人认为是非常不错的算法(不需考虑精度误差和多边形点给出的顺序),可以作为第一选择 ...

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

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

  5. 判断点是否位于多边形内(包含凹多边形)

    如果判断点是否在凸多边形内,则有多种方法,方法简单,计算速度也快,直接使用物理引擎做判断也行 但实际问题中遇到的多边形不一定是凸多边形,它可能是凹边行或者复合多边形判断一个点在多边形内或多边形外,射线 ...

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

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

  7. PHP 判断点是否在多边形内

    如何判断一个点是否在一个多边形内,何时会用到这个场景. 我们就模拟一个真是场景.我们公司是快递公司,在本地区域有6个分点.每个分点有3-5个工人负责附近的快递派遣发送,所以根据每个点的服务区域我们就能 ...

  8. 判断某点在多边形内——方法一

    算法思路 判断平面内点是否在多边形内有多种算法,其中射线法是其中比较好理解的一种,而且能够支持凹多边形的情况.该算法的思路很简单,就是从目标点出发引一条射线,看这条射线和多边形所有边的交点数目.如果有 ...

  9. 判断某点在多边形内——方法二

    /* 原理: 将测试点的Y坐标与多边形的每一个点进行比较, ** 会得到测试点所在的行与多边形边的所有交点. ** 如果测试点的两边点的个数都是奇数个, ** 则该测试点在多边形内,否则在多边形外. ...

最新文章

  1. 记录:开始整合以前的微信预约与内部系统,进行一体化管理。
  2. 见了很久没见的高中同学,真好
  3. 谈谈我开发过的几套语音通信解决方案
  4. 磁盘上重复的贴图在内存中也会重复存在
  5. mysql st_contains实现_MySQL实现树状所有子节点查询的方法
  6. 计算机中 amp 是什么符号,这里面的amp;amp;,||是什么意思,相当与数学里面的什么符号?...
  7. 如何在SQL Server VARCHAR / NVARCHAR字符串中插入换行符
  8. 配置rsync同步+inotify实时监控
  9. 蓝桥杯c语言基础试题答案,蓝桥杯试题C语言答案.doc
  10. 不同SIP客户端使用说明
  11. MFC控件之cimagelist,加载不上位图
  12. python怎么对数用log,python中的对数log函数表示及用法
  13. linux游戏主机,Steam OS界面介绍
  14. 区块链公司BitFury与联合国合作开展哈萨克斯坦的森林项目
  15. 集合中某几个数字之和等于一个固定值 java
  16. ios html格式转换,如何使用HTML模版和iOS中的UIPrintPageRenderer来生成PDF文档
  17. 2020春招 / 2021秋招阿里、腾讯、字节、快手、美团 JAVA 开发岗面试高频问题总结
  18. 雷达感应模块技术,在智能家电中的应用,智能传感器
  19. 关于BatchNorm的理解与讨论
  20. numpy.arange()函数解析

热门文章

  1. 五十九、使用ZXing生成二维码
  2. 二十八、接了一单Python北京空气质量数据处理
  3. django model
  4. EM算法和GMM(上)
  5. centos mysql下载64位_CentOS7 64位安装mysql教程
  6. keepalived安装与配置_面试官问LVS+keepalived+nginx怎么实现时该怎么答?
  7. SIGIR 2021 最佳学生论文:用于图像-文本检索的动态交互式建模
  8. ICLR 2020 开源论文 | 多关系图神经网络CompGCN
  9. python深度学习NER任务中:对段落的分割
  10. 11 | 脑裂: 一次奇怪的数据丢失