题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=81Points Within


Time Limit: 2 Seconds      Memory Limit: 65536 KB

Statement of the Problem

Several drawing applications allow us to draw polygons and almost all of them allow us to fill them with some color. The task of filling a polygon reduces to knowing which points are inside it, so programmers have to colour only those points.

You're expected to write a program which tells us if a given point lies inside a given polygon described by the coordinates of its vertices. You can assume that if a point is in the border of the polygon, then it is in fact inside the polygon.

Input Format

The input file may contain several instances of the problem. Each instance consists of: (i) one line containing integers N, 0 < N < 100 and M, respectively the number of vertices of the polygon and the number of points to be tested. (ii) N lines, each containing a pair of integers describing the coordinates of the polygon's vertices; (iii) M lines, each containing a pair of integer coordinates of the points which will be tested for "withinness" in the polygon.

You may assume that: the vertices are all distinct; consecutive vertices in the input are adjacent in the polygon; the last vertex is adjacent to the first one; and the resulting polygon is simple, that is, every vertex is incident with exactly two edges and two edges only intersect at their common endpoint. The last instance is followed by a line with a 0 (zero).

Output Format

For the ith instance in the input, you have to write one line in the output with the phrase "Problem i:", followed by several lines, one for each point tested, in the order they appear in the input. Each of these lines should read "Within" or "Outside", depending on the outcome of the test. The output of two consecutive instances should be separated by a blank line.

Sample Input

3 1
0 0
0 5
5 0
10 2
3 2
4 4
3 1
1 2
1 3
2 2
0

Sample Output

Problem 1:
Outside

Problem 2:
Outside
Within


Source: South America 2001

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

题意就是判断是否在多边形内,是个的话就输出Within……

看书上敲的,不是太懂,没用到射线求交点稀里糊涂的就求出来了

先贴个好点的代码:转至:http://blog.csdn.net/zxy_snow/article/details/6339621

#include <queue>
#include <stack>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <limits.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int MAX = ;
const double eps = 1e-;
struct point
{
double x,y;
};
struct beeline
{
point a,b;
};
point p[MAX];
int n; bool dy(double x,double y) // x > y
{
return x > y + eps;
}
bool xy(double x,double y) // x < y
{
return x < y - eps;
}
bool dyd(double x,double y) // x >= y
{
return x > y - eps;
}
bool xyd(double x,double y) // x <= y
{
return x < y + eps;
}
bool dd(double x,double y) // x == y
{
return fabs( x - y ) < eps;
}
double crossProduct(point a,point b,point c)//向量 ac 在 ab 的方向
{
return (c.x - a.x)*(b.y - a.y) - (b.x - a.x)*(c.y - a.y);
}
bool onSegment(point a, point b, point c)
{
double maxx = max(a.x,b.x);
double maxy = max(a.y,b.y);
double minx = min(a.x,b.x);
double miny = min(a.y,b.y);
if( dd(crossProduct(a,b,c),0.0) && dyd(c.x,minx) && xyd(c.x,maxx) && dyd(c.y,miny) && xyd(c.y,maxy) )
return true;
return false;
}
bool segIntersect(point p1,point p2, point p3, point p4)
{
double d1 = crossProduct(p3,p4,p1);
double d2 = crossProduct(p3,p4,p2);
double d3 = crossProduct(p1,p2,p3);
double d4 = crossProduct(p1,p2,p4);
if( xy(d1 * d2,0.0) && xy( d3*d4,0.0 ) )
return true;
if( dd(d1,0.0) && onSegment(p3,p4,p1) )
return true;
if( dd(d2,0.0) && onSegment(p3,p4,p2) )
return true;
if( dd(d3,0.0) && onSegment(p1,p2,p3) )
return true;
if( dd(d4,0.0) && onSegment(p1,p2,p4) )
return true;
return false;
}
bool inPolygon(point pot)
{
int count = ;
beeline l;
l.a = pot;
l.b.x = 1e10;
l.b.y = pot.y;
p[n] = p[];
for(int i=; i<n; i++)
{
if( onSegment(p[i],p[i+],pot) )
return true;
if( !dd(p[i].y,p[i+].y) )//水平边不考虑
{
int tmp = -;
if( onSegment(l.a,l.b,p[i]) )//对于顶点与射线相交,该顶点应是所属边上纵坐标上较大的
tmp = i;
else if( onSegment(l.a,l.b,p[i+]) )
tmp = i+;
if( tmp != - && dd(p[tmp].y,max(p[i].y,p[i+].y)) )
count++;
else if( tmp == - && segIntersect(p[i],p[i+],l.a,l.b) )//相交
count++;
}
}
if( count % == )
return true;
return false;
}
int main()
{
int m;
int ind = ;
point pot;
while( ~scanf("%d",&n) && n )
{
if( ind != )
printf("\n");
scanf("%d",&m);
for(int i=; i<n; i++)
scanf("%lf %lf",&p[i].x,&p[i].y);
printf("Problem %d:\n",ind++);
while( m-- )
{
scanf("%lf %lf",&pot.x,&pot.y);
if( inPolygon(pot) )
printf("Within\n");
else
printf("Outside\n");
}
}
return ;
}

下面是我的代码,写的自己不是很懂

#include <stdio.h>
#include <math.h>
#include <string.h>
#include <iostream>
#include <stdlib.h>
#include <map> #define eps 1.0e-5
inline double max(double a,double b){return a>b?a:b;}
inline double min(double a,double b){return a<b?a:b;}
inline double dabs(double a ){return a<?-a:a;} struct point
{
double x,y;
}; point poly[];
int n,m; bool online(const point &p1,const point &p2,const point &p3)
{
if(p2.x>=min(p1.x,p3.x)&&p2.x<=max(p1.x,p3.x)&&
p2.y>=min(p1.y,p3.y)&&p2.y<=max(p1.y,p3.y))
{
if(dabs((p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y))<=eps)
return true;
}
return false;
} bool insidepolygon(point p)
{
int count = ;
double xinters;
point p1,p2;
p1=poly[]; for(int i=;i<=n;i++)
{
p2=poly[i%n];
if(online(p1,p,p2))return true;
if(p.y>min(p1.y,p2.y))
{
if(p.y<=max(p1.y,p2.y))
{
if(p.x<=max(p1.x,p2.x))
{
if(p1.y!=p2.y)
{
xinters=(p.y-p1.y)*(p2.x-p1.x)/(p2.y-p1.y)+p1.x;
//(p.y-p1.y)/(xinter-p1.x)=(p2.y-p1.y)/(p2.x-p1.x)斜率
if(p1.x == p2.x||p.x<=xinters)count++;
}
}
}
}
p1=p2;
}
if(count% == )
return false;
return true;
} int main()
{
int i,j;
point p;
int cas=;
while(scanf("%d",&n)!=EOF)
{
if(n == )break;
if(cas>)printf("\n");
printf("Problem %d:\n",cas++); scanf("%d",&m);
for(i=;i<n;i++)
{
scanf("%lf%lf",&poly[i].x,&poly[i].y);
} for(j=;j<m;j++)
{
scanf("%lf%lf",&p.x,&p.y);
if(insidepolygon(p))
{
printf("Within\n");
}
else
{
printf("Outside\n");
}
}
}
return ;
}

zoj 1081 判断点在多边形内的更多相关文章

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

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

  2. 判断点在多边形内算法的C++实现

    目录 1. 算法思路 2. 具体实现 3. 改进空间 1. 算法思路 判断平面内点是否在多边形内有多种算法,其中射线法是其中比较好理解的一种,而且能够支持凹多边形的情况.该算法的思路很简单,就是从目标 ...

  3. hdu 1756:Cupid's Arrow(计算几何,判断点在多边形内)

    Cupid's Arrow Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tot ...

  4. php之判断点在多边形内的api

    1.判断点在多边形内的数学思想:以那个点为顶点,作任意单向射线,如果它与多边形交点个数为奇数个,那么那个点在多边形内,相关公式: <?php class AreaApi{ //$area是一个多 ...

  5. POJ 2318 TOYS | 二分+判断点在多边形内

    题意: 给一个矩形的区域(左上角为(x1,y1) 右下角为(x2,y2)),给出n对(u,v)表示(u,y1) 和 (v,y2)构成线段将矩形切割 这样构成了n+1个多边形,再给出m个点,问每个多边形 ...

  6. R树判断点在多边形内-Java版本

    1.什么是RTree 待补充 2.RTree java依赖 rtree的java开源版本在GitHub上:https://github.com/davidmoten/rtree 上面有详细的使用说明 ...

  7. hdu 1756 判断点在多边形内 *

    模板题 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring> ...

  8. A Round Peg in a Ground Hole - POJ 1584 (判断凸多边形&判断点在多边形内&判断圆在多边形内)

    题目大意:首先给一个圆的半径和圆心,然后给一个多边形的所有点(多边形按照顺时针或者逆时针给的),求,这个多边形是否是凸多边形,如果是凸多边形在判断这个圆是否在这个凸多边形内.   分析:判断凸多边形可 ...

  9. matlab inpolygon 判断点在多边形内

    如何判断一个点在多边形内部? xv= [0 3 3 0 0]; %x坐标 yv= [0 0 3 3 0];%y坐标 x=1.5; y=1.5; in=inpolygon(x,y,xv,yv) plot ...

随机推荐

  1. COM编程之三 QueryInterface

    [1]IUnknown接口 客户同组件交互都是通过接口完成的. 在客户查询组件的其它接口时,也是通过接口完成的.而那个接口就是IUnknown. IUnknown接口的定义包含在Win32SDK中的U ...

  2. linux设备驱动归纳总结(十):1.udev&misc【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-111839.html linux设备驱动归纳总结(十):1.udev&misc xxxxxxx ...

  3. scala简单的文件操作

    1.scala写入文件操作 package com.test import java.io.File import java.io.PrintWriter /** * scala文件写入 */ obj ...

  4. Bootstrap:弹出框和提示框效果以及代码展示

    前言:对于Web开发人员,弹出框和提示框的使用肯定不会陌生,比如常见的表格新增和编辑功能,一般常见的主要有两种处理方式:行内编辑和弹出框编辑.在增加用户体验方面,弹出框和提示框起着重要的作用,如果你的 ...

  5. flex datagrid 换行

    <mx:DataGrid id="myGrid" width="100%" height="90%" headerStyleName= ...

  6. win8以上版本离线安装.NET

    方法一.C盘自带.NET 3.5,安装系统以后直接安装.NET 3.5.     1.按下:win+x,点击“命令提示符(管理员),     2.输入或复制以下代码(不可漏空格):dism.exe / ...

  7. 【PHP设计模式 03_JianDanGongChang.php】 简单工厂

    <?php /** * [简单工厂] * 之前 02.php 面向接口开发,客户端还是知道了服务器端的所有类. * 现在想让客户端只知道一个类,就用工厂. */ header("Con ...

  8. JS参数传值

    1.JS获取URL参数值 //js获取url参数值 function request(paras) { var url = location.href; , url.length).split(&qu ...

  9. Oracle绑定变量

    select * from table where id = ? 类似于上面这样的sql,如果不用绑定变量,每次执行时Oracle会认为是不同的sql,会在每次执行时生成一遍执行计划,而执行计划的生成 ...

  10. HDU 4709:Herding

    Herding Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...