原题

多组数据。

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 || 判断点是否在多边形内的更多相关文章

  1. ZOJ 1081 Points Within | 判断点在多边形内

    题目: 给个n个点的多边形,n个点按顺序给出,给个点m,判断m在不在多边形内部 题解: 网上有两种方法,这里写一种:射线法 大体的思想是:以这个点为端点,做一条平行与x轴的射线(代码中射线指向x轴正方 ...

  2. zoj 1081:Points Within(计算几何,判断点是否在多边形内,经典题)

    Points Within Time Limit: 2 Seconds      Memory Limit: 65536 KB Statement of the Problem Several dra ...

  3. ZOJ 1081 Points Within( 判断点在多边形内外 )

    链接:传送门 题意:给出n个点围成的一个多边形,现在有m个点p,询问p是否在多边形内,你可以认为这些点均不同且输入的顶点是多边形中相邻的两个顶点,最后的顶点与第一个相邻并且每一个顶点都连接两条边( 左 ...

  4. 百度地图 判断marker是否在多边形内

    昨天画了圆形,判marker是否存在圆形内.今天来画多边形,判断marker在多边形内. 需要引入一个js      <script type="text/javascript&quo ...

  5. hrbustoj 1429:凸多边形(计算几何,判断点是否在多边形内,二分法)

    凸多边形 Time Limit: 2000 MS    Memory Limit: 65536 K Total Submit: 130(24 users)   Total Accepted: 40(1 ...

  6. C# 判断点是否在多边形内

    /// <summary>/// 判断点是否在多边形内/// </summary>/// <param name="pnt">点</par ...

  7. hrbustoj 1306:再遇攻击(计算几何,判断点是否在多边形内,水题)

    再遇攻击 Time Limit: 1000 MS    Memory Limit: 65536 K Total Submit: 253(37 users)   Total Accepted: 56(2 ...

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

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

  9. zoj 1081 Points Within (判断点是否在多边形内)

    http://blog.csdn.net/zxy_snow/article/details/6339621先保存,搞懂了再来写

随机推荐

  1. mysql数据库设置外键,更新与删除选项

    CASCADE:父表delete.update的时候,子表会delete.update掉关联记录:SET NULL:父表delete.update的时候,子表会将关联记录的外键字段所在列设为null, ...

  2. VS2013使用自带的数据库 Microsoft SQL Server 2012 Express LocalDB

    注:DeptLocalDB:自己取的数据库实例名称 DeptSharedLocalDB:自己取的实例共享名称np:\\.\pipe\LOCALDB#SH7C6ED5\tsql\query:命名管道名称 ...

  3. mysql中列属性

    mysql列属性包括:NULL .default.comment.primary key.unique key 一.NULL定义方式:NULL(默认) NOT NULL 空属性有2个值,mysql数据 ...

  4. vue笔记v-bind

    把message的信息绑定给title,运行出来的结果是<span title="you loaded this page on +Mon Nov 21 2016 18:28:38 G ...

  5. 删除警告的方法 python

    import warningswarnings.filterwarnings('ignore')

  6. 图像的模糊-opencv

    调用两个API,一个是均值模糊,一个是高斯模糊.如下所示: #include<opencv2/opencv.hpp> #include<iostream> using name ...

  7. [BZOJ3172 ][Tjoi2013]单词(AC自动机)

    Description 不稳定的传送门 某人读论文,一篇论文是由许多单词组成.但他发现一个单词会在论文中出现很多次,现在想知道每个单词分别在论文中出现多少次.单词个数<=200,单词总长度< ...

  8. 笔记-git-基础使用

    笔记-git-基础使用 1.      git相关概念 工作区(Working Directory): 就是在电脑里能看到的目录,init后的当前目录就是一个工作区: 版本库(Repository): ...

  9. Android 自定义光标样式

    今天自定义光标,自己切图,不过怎么切都是很宽.不是一个很细的条.我用ps花了一个像素的直线,放上去还是不行.后来在网上找到方法,那就是用shape.不得不说,shape真的是太吊了. 给EditTex ...

  10. Hyper-V中的Linux无法配置网络地址的解决办法

    一周碰到2次在Hyper-V 2012中安装了Linux,也安装了IC 3.4.但是却无法配置IP地址的问题.因此造成很多不便,因此找机会把这个原因和解决办法进行了尝试. 这过程中感谢同事的提示,让我 ...