[zoj] 1081 Points Within || 判断点是否在多边形内
原题
多组数据。
n为多边形顶点数,m为要判断的点数
按逆时针序给出多边形的点,判断点是否在多边形内,在的话输出"Within",否则输出"Outside"
//每次要输出“Problem %d:"数据组数;
射线法
过要判断的点向x轴正方向做一条射线,如果交点数是奇数即在其中,否则不在其中。
枚举每条边,判断该点和边是否有交点。
若有交点,则:满足图一或图二之一(要保证y值在范围内)
//因为按逆时针扫描顶点,所以第一种情况叉积>0;第二种<0
点是否在线段上特判即可(叉积=0,点积<=0)
area等是用于将点按逆时针存储,这道题其实据说不用
#include<cstdio>
#include<algorithm>
#define N 110
using namespace std;
int n,m,t;
struct point
{
int x,y;
point() {}
point(int _x,int _y) : x(_x),y(_y) {}
friend inline point operator - (const point &a,const point &b)
{
return point(b.x-a.x,b.y-a.y);
}
friend inline int operator * (const point &a,const point &b)
{
return a.x*b.y-a.y*b.x;
}
friend inline int dot(const point &a,const point &b)
{
return a.x*b.x+a.y*b.y;
}
}q;
inline int read()
{
int ans=0,fu=1;
char j=getchar();
for (;j<'0' || j>'9';j=getchar()) if (j=='-') fu=-1;
for (;j>='0' && j<='9';j=getchar()) ans*=10,ans+=j-'0';
return ans*fu;
}
inline bool check(const point &u,const point &v,const point &p)
{
int det=(u-p)*(v-p);
if (det!=0) return 0;
int Dot=dot(u-p,v-p);
return Dot<=0;
}
struct polygon//(多边形)
{
int n;
point p[N];
void init(int _n)
{
n=_n;
for (int i=0;i<n;i++) { p[i].x=read(); p[i].y=read(); }
p[n]=p[0];
if (area()<0) reverse(p,p+n);
p[n]=p[0];
}
inline int area() const//calc the area of polygon
{
int ret=0;
for (int i=0;i<n;i++)
ret+=p[i]*p[i+1];
return ret;
}
bool inner(const point &b)
{
int cnt=0;
for (int i=0;i<n;i++)
{
if (check(p[i],p[i+1],b)) return 1;
int d1=p[i].y-b.y,d2=p[i+1].y-b.y;
int det=(p[i]-b)*(p[i+1]-b);
if ((det>=0 && d1<0 && d2>=0) || (det<=0 && d1>=0 && d2<0))
++cnt;
}
return cnt&1;
}
}P;
int main()
{
while (~scanf("%d",&n) && n)
{
m=read();
if (t) putchar('\n');
P.init(n);
printf("Problem %d:\n",++t);
while (m--)
{
q.x=read();
q.y=read();
if (P.inner(q)) puts("Within");
else puts("Outside");
}
}
return 0;
}
[zoj] 1081 Points Within || 判断点是否在多边形内的更多相关文章
- ZOJ 1081 Points Within | 判断点在多边形内
题目: 给个n个点的多边形,n个点按顺序给出,给个点m,判断m在不在多边形内部 题解: 网上有两种方法,这里写一种:射线法 大体的思想是:以这个点为端点,做一条平行与x轴的射线(代码中射线指向x轴正方 ...
- zoj 1081:Points Within(计算几何,判断点是否在多边形内,经典题)
Points Within Time Limit: 2 Seconds Memory Limit: 65536 KB Statement of the Problem Several dra ...
- ZOJ 1081 Points Within( 判断点在多边形内外 )
链接:传送门 题意:给出n个点围成的一个多边形,现在有m个点p,询问p是否在多边形内,你可以认为这些点均不同且输入的顶点是多边形中相邻的两个顶点,最后的顶点与第一个相邻并且每一个顶点都连接两条边( 左 ...
- 百度地图 判断marker是否在多边形内
昨天画了圆形,判marker是否存在圆形内.今天来画多边形,判断marker在多边形内. 需要引入一个js <script type="text/javascript&quo ...
- hrbustoj 1429:凸多边形(计算几何,判断点是否在多边形内,二分法)
凸多边形 Time Limit: 2000 MS Memory Limit: 65536 K Total Submit: 130(24 users) Total Accepted: 40(1 ...
- C# 判断点是否在多边形内
/// <summary>/// 判断点是否在多边形内/// </summary>/// <param name="pnt">点</par ...
- hrbustoj 1306:再遇攻击(计算几何,判断点是否在多边形内,水题)
再遇攻击 Time Limit: 1000 MS Memory Limit: 65536 K Total Submit: 253(37 users) Total Accepted: 56(2 ...
- PHP 判断点是否在多边形内
如何判断一个点是否在一个多边形内,何时会用到这个场景. 我们就模拟一个真是场景.我们公司是快递公司,在本地区域有6个分点.每个分点有3-5个工人负责附近的快递派遣发送,所以根据每个点的服务区域我们就能 ...
- zoj 1081 Points Within (判断点是否在多边形内)
http://blog.csdn.net/zxy_snow/article/details/6339621先保存,搞懂了再来写
随机推荐
- Python 初始—(字符编码解码)
字符编码之间的编码转换则需要通过Unicode 进行转换,那么需要一个编码和解码实现与Unicode进行关联转换 例如utf-8转gbk utf-8----decode----->Unicode ...
- 使用select2 宽度自适应
加一个CSS属性:style = "width : 100%"
- 记一次FTP下载踩坑的故(shi)事(gu)
下班前领导忽然要求我将客户的日志服务器上一些日志拷贝到测试服务器中,不过领导只提供给我FTP的连接方式,很明显就是要我用FTP方式去做啦 一般来说FTP批量下载也就上网随便找个脚本的事,但是却成了我疯 ...
- 理解canvas路径
canvas路径和ps里面的路径差不多,在进行图形绘制时,先绘制出来图形的路径,然后再描边或者填充. canvas路径还有子路径的概念,在某一时刻,canvas之中只能有一条路径存在,Canvas规范 ...
- Pandas库入门
pandas库的series类型
- Android面试收集录3 ContentProvider详解
1.ContentProvider简单介绍 1.1.定义 ContentProvider,即内容提供者属于Android的四大组件之一. 1.2.作用 进程间进行数据交互&共享,即跨进程通信. ...
- Android 数据库中的数据给到ListView
前言:因为之前学的都是用一个自己定义的类,完成将某一个bean中的数据直接获取,而实际中通常是通过数据库来得到的,总之,最终就是要得到数据.提一下最重要的东西,我把它叫做代理,如同一个校园代理,没有他 ...
- CentOS 7.X 防火墙简单配置
CentOS7使用的是Linux Kernel 3.10.0的内核版本,新版的Kernel内核已经有了防火墙netfilter,并且使用效能更高,稳定性更好. 配置防火墙的两种方法: 一.使用xml配 ...
- 图解java面试
图解Java面试题:基本语法 2017-02-07 14:34 出处:清屏网 人气:178 评论(0) 内容大纲.png &和&&的区别 &和&&的 ...
- HTTP协议中POST方法和GET方法有那些区别?
GET用于向服务器请求数据,POST用于提交数据 GET请求,请求参数拼接形式暴露在地址栏,而POST请求参数则放在请求体里面,因此GET请求不适合用于验证密码等操作 GET请求的URL有长度限制1k ...