原题

多组数据。

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. 全文检索(Lucene&Solr)

    全文检索(Lucene&Solr) 1)什么是全文检索?为什么需要全文检索? 结构化数据(mysql等)方便查询,而非结构化数据(如多篇文章)是难以查询到自己需要的,所以要使用全文检索. 全文 ...

  2. JQuery实现子级选择器

    效果图如下: HTML代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charse ...

  3. Linux系统崩溃,数据迁移

    就在1小时前,处理了件如标题所述的麻烦事儿.吃完午饭,想对此作个总结,一来自己梳理下过程以便后面遇见类似的事可以 快速处理,二来同行的小伙伴们可以探讨下.故事是这样的,公司所在园区物业晚上断电8小时, ...

  4. css页面出现滚动条左右跳动

    问题描述:页面首次加载的时候内容是一屏,不会出现纵向滚动条,但是当点击加载的内容更多时页面会出现左右跳动一下的情况.出现跳动的主要原因就是出现了滚动条,滚动条的宽度影响了内容区域的宽度. 1.查看导航 ...

  5. PLC状态机编程第一篇-状态机介绍

    状态机的一般概念 过去我在学习PLC编程时,看的大部分书仅仅停留在软件的操作上,没有真正讲述如何组织程序,这里我们讲一个通用的描述控制算法的方法,就是状态机,和SFC很类似,其实SFC也是源于状态机啦 ...

  6. CERC2017 F: Faulty Factorial 简单数论题

    #include <iostream> using namespace std; #define ll long long ; ll n,p,r; ll poww(ll a,ll b){ ...

  7. Hibernate---开发环境搭建

    下载安装Hibernate 在官网http://hibernate.org/tools/上下载eclipse安装插件的文件/安装插件的地址.点击download选择JBoss Tools,选择Arti ...

  8. 《Cracking the Coding Interview》——第4章:树和图——题目8

    2014-03-19 05:04 题目:给定两棵二叉树T1和T2,判断T2是否是T1的子树.子树的定义是,以T1的某个节点(可以是T1的根)作为根节点,得到的这棵树和T2一模一样. 解法:首先可以根据 ...

  9. java日期格式化(util包下转成sql包下)

    package test; import java.text.SimpleDateFormat;import java.util.Date;import java.util.Scanner; publ ...

  10. soapUI的简单使用(webservice接口功能测试)

    1.soapUI支持什么样的测试? 功能测试.性能测试.负载.回归测试等,它不仅仅可以测试基于 SOAP 的 Web 服务,也可以测试 REST 风格的 Web 服务. 1.SoapUI安装注意事项 ...