zoj1081判断点是否在多边形内
首先判断要检测的点是否在边上
然后再判断射线是否经过一个线段的端点,如果经过低端点不计数,经过高端点计数
#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. 叉乘判别法(只适用于凸多边形)想象一个凸多边形,其每一个边都将整个2D屏幕划分成为左右两边,连接每一边的第一个端点和要测试的点得到一个矢量v,将两个2维矢量扩展成3维的,然后将该边与v叉乘,判断 ...
- 如何判断一个点在多边形内
一.从三角形开始说起---怎么判断一个点在三角形内 三角形是最简单的多边形了.先说说三角形有哪些判断方法. 参考自:判断一个点是否在三角形内部 - 知乎 几种方法判断平面点在三角形内_独L无二的博客- ...
- 判断一点是否在多边形内(附Java实现代码)
引射线法:从目标点出发引一条射线,看这条射线和多边形所有边的交点数射线法 时间复杂度:O(n) 适用范围:任意多边形 个人认为是非常不错的算法(不需考虑精度误差和多边形点给出的顺序),可以作为第一选择 ...
- 射线法判断点是否在多边形内-JAVA
1.定义点 public class Point {private BigDecimal x;private BigDecimal y;public Point() {};@Overridepubli ...
- 判断点是否位于多边形内(包含凹多边形)
如果判断点是否在凸多边形内,则有多种方法,方法简单,计算速度也快,直接使用物理引擎做判断也行 但实际问题中遇到的多边形不一定是凸多边形,它可能是凹边行或者复合多边形判断一个点在多边形内或多边形外,射线 ...
- python射线法判断点是否在多边形内
python3射线法判断点是否在多边形内 射线法 首先我们要先理解什么是射线法.射线法的意思是:在随机点上做一条平行于x轴的射线,方向是x轴正方向,看这条射线与多边形区域的交点个数,如果是偶数,那么这 ...
- PHP 判断点是否在多边形内
如何判断一个点是否在一个多边形内,何时会用到这个场景. 我们就模拟一个真是场景.我们公司是快递公司,在本地区域有6个分点.每个分点有3-5个工人负责附近的快递派遣发送,所以根据每个点的服务区域我们就能 ...
- 判断某点在多边形内——方法一
算法思路 判断平面内点是否在多边形内有多种算法,其中射线法是其中比较好理解的一种,而且能够支持凹多边形的情况.该算法的思路很简单,就是从目标点出发引一条射线,看这条射线和多边形所有边的交点数目.如果有 ...
- 判断某点在多边形内——方法二
/* 原理: 将测试点的Y坐标与多边形的每一个点进行比较, ** 会得到测试点所在的行与多边形边的所有交点. ** 如果测试点的两边点的个数都是奇数个, ** 则该测试点在多边形内,否则在多边形外. ...
最新文章
- 记录:开始整合以前的微信预约与内部系统,进行一体化管理。
- 见了很久没见的高中同学,真好
- 谈谈我开发过的几套语音通信解决方案
- 磁盘上重复的贴图在内存中也会重复存在
- mysql st_contains实现_MySQL实现树状所有子节点查询的方法
- 计算机中 amp 是什么符号,这里面的amp;amp;,||是什么意思,相当与数学里面的什么符号?...
- 如何在SQL Server VARCHAR / NVARCHAR字符串中插入换行符
- 配置rsync同步+inotify实时监控
- 蓝桥杯c语言基础试题答案,蓝桥杯试题C语言答案.doc
- 不同SIP客户端使用说明
- MFC控件之cimagelist,加载不上位图
- python怎么对数用log,python中的对数log函数表示及用法
- linux游戏主机,Steam OS界面介绍
- 区块链公司BitFury与联合国合作开展哈萨克斯坦的森林项目
- 集合中某几个数字之和等于一个固定值 java
- ios html格式转换,如何使用HTML模版和iOS中的UIPrintPageRenderer来生成PDF文档
- 2020春招 / 2021秋招阿里、腾讯、字节、快手、美团 JAVA 开发岗面试高频问题总结
- 雷达感应模块技术,在智能家电中的应用,智能传感器
- 关于BatchNorm的理解与讨论
- numpy.arange()函数解析
热门文章
- 五十九、使用ZXing生成二维码
- 二十八、接了一单Python北京空气质量数据处理
- django model
- EM算法和GMM(上)
- centos mysql下载64位_CentOS7 64位安装mysql教程
- keepalived安装与配置_面试官问LVS+keepalived+nginx怎么实现时该怎么答?
- SIGIR 2021 最佳学生论文:用于图像-文本检索的动态交互式建模
- ICLR 2020 开源论文 | 多关系图神经网络CompGCN
- python深度学习NER任务中:对段落的分割
- 11 | 脑裂: 一次奇怪的数据丢失