凸多边形

称号:http://acm.hrbust.edu.cn/index.php?m=ProblemSet&a=showProblem&problem_id=1429

Description

已知一个凸多边形A(包括n个点,点依照顺时针给出)。和一个点集B(包括m个点),请推断这m个点是否都严格在凸多边形A内部。



Input

输入包括多组測试数据。

对于每组測试数据:

第1行。包括一个整数n (3 ≤ n ≤ 105)代表着凸多边形A的点的数量。

接下来n行每行包括一个坐标(x, y) (-109 ≤ x, y ≤ 109) 表示这个凸多边形,点依照顺时针给出。

第n + 2行。包括一个整数m (3 ≤ m ≤ 105)代表着点集B的点的数量。

接下来m行每行包括一个坐标(x, y) (-109 ≤ x, y ≤ 109) 表示这个点集B。

处理到文件结束



Output

对于每组測试数据:

第1行,假设点集B都严格在凸多边形A内,输出YES,否则输出NO。



Sample Input

4

-10 -10

-10 10

10 10

10 -10

3

0 0

1 1

2 2

4

-10 -10

-10 10

10 10

10 -10

3

100 100

1 1

2 2



Sample Output

YES

NO

计算几何之推断点是否在多边形内,

推断点是否在多边形内有多种方法:射线法,角度和推断法,改进弧长法还有这次用到的二分法。

前三者的时间复杂度均为O(n),此方法复杂度仅为O(logn)。

并且对于推断非常多点是否在多边形内,就能够用这样的方法了,耗时少。

原理:

将一个多边形,以当中一个点为原点,開始与其它各点相连并延长做射线。则会形成很多个三角形区域。(如左图)

这样我们能够先推断点在哪两条向量之间。用二分查找,能够非常快搜索到。

当然,首先要推断点是否在最左边向量左側或者最右边向量右側,如是。则点不在多边形内。

以右图为例,我们找到紫色点在左数第一个三角形区域内,绿色点在左数第二个三角形区域内。

然后,再推断下图所看到的线段与 所推断点的位置关系。

绿色的线段能够推断绿色的点。左边紫色的点也由对应的线段来推断位置关系。

这样能够推断点是否在多边形内啦。

总结一下:

①建立一个个三角形区域。用当中两条边推断点所在大体区域。

②用第三条边来推断点是否在多边形内。

二分查找就是用在了第一条的地方,用来查找大体区域位置。

明确了这个,就能够做对应的题目来练习一下了!

就是这道题~。~

#include <stdio.h>
struct point
{
double x,y;
}a[100005],b[100005];
double cross(point p0,point p1,point p2)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
} int main()
{
int n,m,i,low,high,mid,flag;
while( scanf("%d",&n)!=EOF )
{
for( i=0 ; i<n ; ++i )
scanf("%lf%lf",&a[i].x,&a[i].y);
scanf("%d",&m);
for( i=0 ; i<m ; ++i )
scanf("%lf%lf",&b[i].x,&b[i].y);
flag=0;
for( i=0 ; i<m ; ++i )
{
// ① 推断初始时,点是否在凸多边形两最外側边外面
if( cross(a[0],a[1],b[i])>=0 || cross(a[0],a[n-1],b[i])<=0 )
{
flag=1;
break;
} // ② 推断凸多边形在哪个三角形里头
low=2;high=n-1;
while( low<high )
{
mid=(low+high)>>1; // 就是除以2。比除以2快(位运算比乘除快非常多)
if( cross(a[0],a[mid],b[i])>0 )
high=mid;
else
low=mid+1;
}
// 查看b是否在凸多边形上面那些边的外面
if( cross(a[low],a[low-1],b[i])<=0 )
{
flag=1;
break;
}
}
if(flag) printf("NO\n");
else printf("YES\n");
}
return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

ACM-凸多边形的计算几何——hrbust1429的更多相关文章

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

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

  2. ACM/ICPC 之 计算几何入门-叉积-to left test(POJ2318-POJ2398)

    POJ2318 本题需要运用to left test不断判断点处于哪个分区,并统计分区的点个数(保证点不在边界和界外),用来做叉积入门题很合适 //计算几何-叉积入门题 //Time:157Ms Me ...

  3. BZOJ2618 [Cqoi2006]凸多边形 凸包 计算几何

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ2618 题意概括 给出多个凸包,求面积交. 题解 首先我们考虑两个凸包相交的情况. 例题:HDU16 ...

  4. hdu 2108:Shape of HDU(计算几何,判断多边形是否是凸多边形,水题)

    Shape of HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Tota ...

  5. ACM计算几何题目推荐

    //第一期 计算几何题的特点与做题要领: 1.大部分不会很难,少部分题目思路很巧妙 2.做计算几何题目,模板很重要,模板必须高度可靠. 3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面 ...

  6. HDU 4063 Aircraft(计算几何)(The 36th ACM/ICPC Asia Regional Fuzhou Site —— Online Contest)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4063 Description You are playing a flying game. In th ...

  7. 【计算几何初步-判断是否凸多边形】【HDU2108】Shape of HDU

    Shape of HDU Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot ...

  8. ACM 计算几何中的精度问题(转)

    http://www.cnblogs.com/acsmile/archive/2011/05/09/2040918.html 计算几何头疼的地方一般在于代码量大和精度问题,代码量问题只要平时注意积累模 ...

  9. 【BZOJ-2618】凸多边形 计算几何 + 半平面交 + 增量法 + 三角剖分

    2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 959  Solved: 489[Submit][Status] ...

随机推荐

  1. JDBC批处理executeBatch

    JDBC运行SQL声明,有两个处理接口,一PreparedStatement,Statement,一般程序JDBC有多少仍然比较PreparedStatement 只要运行批处理,PreparedSt ...

  2. 【原创】shadowebdict开发日记:基于linux的简明英汉字典(一)

    全系列目录: [原创]shadowebdict开发日记:基于linux的简明英汉字典(一) [原创]shadowebdict开发日记:基于linux的简明英汉字典(二) [原创]shadowebdic ...

  3. SQLServer 网络协议(一)

    SQLserver现在主要的3种协议:Shared Memory.TCP/IP 和 Named Pipe SharedMemory: Shared Memory最快最简单的协议,使用SharedMem ...

  4. linux如何执行后台进程

    linux直接执行一个过程.电流指令结束后.或者关闭掉shell形成过程将结束. 如何在后台执行的处理 办法1 采用nohup命令,nohup命令本身的意思no hung up他说,他们将不会收到sh ...

  5. WMI 获取硬件信息的封装函数与获取联想台式机的出厂编号方法

    原文:WMI 获取硬件信息的封装函数与获取联想台式机的出厂编号方法 今天玩了一把WMI,查询了一下电脑的硬件信息,感觉很多代码都是可以提取出来的,就自己把那些公共部分提出出来,以后如果要获取 某部分的 ...

  6. [LeetCode179]Largest Number

    题目: Given a list of non negative integers, arrange them such that they form the largest number. For ...

  7. 弹出式菜单PopMenu

    MainActivity.java public class MainActivity extends Activity implements OnClickListener{ private Pop ...

  8. 在投票系统方法的原则刷票(突破ip限制刷票PHP版)

    让我谈一点:事实上,没有一个突破ip限制,因为实际上,,这项限制server结束,client牛逼,不能突破..只要是能够始终重复刷票罢了 一个朋友突然来了个网站,让我帮她投票..我是一个更好的人说话 ...

  9. ORACLE profile列4 --CREATE PROFILE

    这个博客是ORACLE profile系列第四部分.主要说一下,假设你创建profile而使用profile资源和password控制 CREATE PROFILE Note: Oracle reco ...

  10. 动软.NET 分页存储过程UP_GetRecordByPage

    1, ------------------------------------ --用途:支持任意排序的分页存储过程 --说明: ----------------------------------- ...