凸多边形

称号: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. Android在浏览器启动APP

    要想在浏览器启动APP的方法例如以下: 在须要跳转的ACTIVITY中加入intent-filter的相关信息: <intent-filter>     <data android: ...

  2. mysql table is marked as crashed and last (automatic?) repair failed

    1.同事的服务器在mysqldump备份的时候报错了 这个原因是myisam的表数据太多,在某个时刻, 存放数据的这个MyISAM表数据急速长大. 比如一些log表, 当硬盘写满了.这个时候还在继续写 ...

  3. Swift新手教程3-字符串String

    原创blog,转载请注明出处 String 在swfit中,String兼容Unicode的方式.用法和C语言类似. 注意   在Cocoa和Cocoa touch中,Swift的String,和Fo ...

  4. Java应用中使用ShutdownHook友好地清理现场(转)

    在线上Java程序中经常遇到进程程挂掉,一些状态没有正确的保存下来,这时候就需要在JVM关掉的时候执行一些清理现场的代码.Java中得ShutdownHook提供了比较好的方案. JDK在1.3之后提 ...

  5. window.history.back()的改进方法window.history.go()

    今天在做项目时,測试人员提出了一条bug,起初没当回事,在改动过程中才意识到其重要性,故记录下来. 依照需求,系统应该实现例如以下的功能:有三个关联的页面a.aspx(简称a),b.aspx(简称b) ...

  6. poj 3662 Telephone Lines spfa算法灵活运用

    意甲冠军: 到n节点无向图,它要求从一个线1至n路径.你可以让他们在k无条,的最大值.如今要求花费的最小值. 思路: 这道题能够首先想到二分枚举路径上的最大值,我认为用spfa更简洁一些.spfa的本 ...

  7. 开源NetWorkSocket通讯组件

    开源NetWorkSocket通讯组件   前言 在<化茧成蝶,开源NetWorkSocket通讯组件>发表之后,收到大家很多个star,在此感谢!更可贵的是,一些网友提出了许多好建议,经 ...

  8. Statement和PreparedStatement的区别; 什么是SQL注入,怎么防止SQL注入? (转)

    问题一:Statement和PreparedStatement的区别 先来说说,什么是java中的Statement:Statement是java执行数据库操作的一个重要方法,用于在已经建立数据库连接 ...

  9. POJ 2217 Secretary (后缀数组)

    标题效果: 计算两个公共串串最长的字符串的长度. IDEAS: 这两个组合的字符串. 然后直接确定运行后缀数组height 然后,你可以直接扫描一次height .加个是不是在一个串中的推断就能够了. ...

  10. js中的json对象

    1.JSON(JavaScript Object  Notation)一种简单的数据格式,比xml更轻巧.JSON是JavaScript原生格式,这意味着在JavaScript中处理JSON数据不须要 ...