码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-12-23 20:22:47      阅读:110      评论:0      收藏:0      [点我收藏+]

标签:names   namespace   顺时针   http   pos   就是   直线   .com   return   

就是利用叉积的性质,如果向量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

标签:names   namespace   顺时针   http   pos   就是   直线   .com   return   

原文地址:http://www.cnblogs.com/nbwzyzngyl/p/8094143.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!