logN判点是否在凸多边形内 HRBUSTOJ1429

Posted 大奕哥&VANE

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了logN判点是否在凸多边形内 HRBUSTOJ1429相关的知识,希望对你有一定的参考价值。

就是利用叉积的性质,如果向量A1到向量A2是顺时针则叉积为负反之为正。

然后我们可以二分的判断找到一个点恰被两条射线夹在一起。

然后我们再判断是否l,r这两个点所连直线与点的关系。

具体资料可以参照这个BLOG https://www.cnblogs.com/yym2013/p/3673616.html

代码 By:大奕哥

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=100005;
 4 int x[N],y[N],n,m;
 5 double eps=1e-10;
 6 struct node{double a,b;}q[N],p[N];
 7 double xmul(node a,node b,node c)
 8 {
 9     return (a.a-c.a)*(b.b-c.b)-(b.a-c.a)*(a.b-c.b);
10 }
11 void judge()
12 {
13     for(int i=1;i<=m;++i)
14     {
15         
16         if(xmul(q[i],p[2],p[1])<=eps||xmul(q[i],p[n],p[1])>=-eps){
17             puts("NO");return;
18         }
19         int l=2,r=n;
20         while(r-l>1)
21         {
22             int mid=l+r>>1;
23             if(xmul(q[i],p[mid],p[1])>eps)l=mid;
24             else r=mid;
25         }
26         if(xmul(q[i],p[r],p[l])<=eps)
27         {
28             puts("NO");return;
29         }
30     }
31     puts("YES");
32 }
33 int main()
34 {
35     while(~scanf("%d",&n))
36     {
37         for(int i=1;i<=n;++i)scanf("%lf%lf",&p[i].a,&p[i].b);
38         scanf("%d",&m);
39         for(int i=1;i<=m;++i)scanf("%lf%lf",&q[i].a,&q[i].b);
40         judge();
41     }
42     return 0;
43 }

 

以上是关于logN判点是否在凸多边形内 HRBUSTOJ1429的主要内容,如果未能解决你的问题,请参考以下文章

Hrbustoj 1429 二分+计算几何

如何确定一个点是否在多边形内仅由水平线和垂直线组成?

检查点是否在多边形内

POJ1584 A Round Peg in a Ground Hole 凸包判断 圆和凸包的关系

谷歌地图颤动检查多边形内的点

3.2 多边形的交点 [点/多边形 内/外 测试]