原题

多组数据。

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. jquery 操作css 尺寸

    .height() 获取元素集合中的第一个元素的当前计算高度值,或设置每一个匹配元素的高度值. .height() 获取匹配元素集合中的第一个元素的当前计算高度值. 这个方法不接受参数. $(wind ...

  2. HTTP:地址栏输入url到显示页面的步骤

    在浏览器地址栏输入URL 浏览器查看缓存,如果请求资源在缓存中并且新鲜,跳转到转码步骤 如果资源未缓存,发起新请求 如果已缓存,检验是否足够新鲜,足够新鲜直接提供给客户端,否则与服务器进行验证. 检验 ...

  3. HDU 1052 Tian Ji -- The Horse Racing(贪心)

    题目来源:1052 题目分析:题目说的权值匹配算法,有点误导作用,这道题实际是用贪心来做的. 主要就是规则的设定: 1.田忌最慢的马比国王最慢的马快,就赢一场 2.如果田忌最慢的马比国王最慢的马慢,就 ...

  4. 爬虫学习(十五)——json解析

    json与jsonpath 对象{}:jsonobject 对象:对象在js中表现为{}括起来的内容,数据结构为{key:value,key:value...}键值对的结构,在面向对象的结构中,key ...

  5. centos下LVM配置与管理

    centos下LVM配置与管理 LVM是逻辑盘卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制,LVM是建立在硬盘和分区之上的一个逻辑层, ...

  6. hibernate映射实体类查询时数据库空字段赋值给实体类报错的问题

    因为一直报实体类空异常,去网上查了资料只查到了并没有查到数据库空值时不给实体类赋值的属性 异常 org.hibernate.InvalidMappingException: Could not par ...

  7. 部分和问题 南阳acm1058(递归+dfs)

    部分和问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K.   输入 首先, ...

  8. 操作视频-对视频进行canny边缘检测

    #include<opencv2/opencv.hpp> using namespace cv; int main() { VideoCapture capture(); //从摄像头读入 ...

  9. python基础之闭包函数和装饰器

    补充:全局变量声明及局部变量引用 python引用变量的顺序: 当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量 global关键字用来在函数或其 ...

  10. FileStream流媒体

    class Program { static void Main(string[] args) { string source = @"mana.mp4"; string targ ...