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 }
时间: 2024-08-13 14:59:49

logN判点是否在凸多边形内 HRBUSTOJ1429的相关文章

O(logn)判断点在凸多边形内

学习了优秀的算法...大概是找到这个点在哪个三角形块内,所以二分很优秀~ 这个里面没有凸包,一般还要加个凸包 来自 http://blog.csdn.net/codeforces_sphinx/article/details/7200301 #include <iostream>#include <functional>#include <algorithm>#include <complex>#include <cstdlib>#include

ZOJ 3720 Magnet Darts (计算几何,概率,判点是否在多边形内)

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3720 题意: 在一个矩形区域投掷飞镖,因此飞镖只会落在整点上,投到每个点的得分是Ax+By.矩形区域里面有个多边形,如果飞镖投在多边形里面则得分,求最终的得分期望. 即:给定一个矩形内的所有整数点,判断这些点是否在一个多边形内 方法: 计算几何的判点是否在多边形内(几何模板),如果在,则令得分加(Ax+By)*以此点为中心边长为1的正方形面积 1 void solve()

poj 1584 A Round Peg in a Ground Hole 判断多边形是否为凸多边形 + 圆心是否在凸多边形内 + 圆是否在凸多边形内部

题目来源: http://poj.org/problem?id=1584 题意: 给一个多边形, 一个圆心以及半径. 首先判断是否为凸多边形. 如果是凸多边形, 再判断,圆是否在凸多边形内部. 分析: 1) 先判断是否为凸多边形 ,题目给出的顶点是有序的, 即顺时针或是 逆时针.用叉积方向判断. 2) 判断圆在多边形内, 首先判断 圆心是否在多边形内部, 是的话,然后再 判断 圆心到多边形 所有边的 距离d >= r , 即可. 代码如下: const int Max_N = 1005; con

判断点是否在凸多边形内

判断点是否在凸多边形内的方法很多,此处仅给出使用向量叉积判断点是否在凸多边形内的方法. 以下图为例说明问题: 原则: 1. 将多边形的第i条边的第一个顶点指向点P得到向量 v1,然后将从第一个顶点指向第二个顶点得到向量v2,叉乘这两个向量. 2.如果叉乘结果与上一条边的叉乘结果的乘积大于0则继续执行,如果乘积小于0,表示点P不在凸多边形内,直接返回即可. 要点:要求凸多边形的点以固定的顺序给出,例如固定为逆时针或顺时针. 实现的代码如下: struct Point { float x; floa

Kuangbin 带你飞-基础计算几何专题 题解

专题基本全都是模版应用.贴一下模版 const double eps = 1e-8; const int INF = 0x3f3f3f3f; int sgn(double x) { if (fabs(x) < eps) return 0; if (x < 0) return -1; return 1; } struct Point { double x,y; Point(){} Point(double tx,double ty) { x = tx; y = ty; } Point opera

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

题目大意:首先给一个圆的半径和圆心,然后给一个多边形的所有点(多边形按照顺时针或者逆时针给的),求,这个多边形是否是凸多边形,如果是凸多边形在判断这个圆是否在这个凸多边形内. 分析:判断凸多边形可以使用相邻的三个点叉积判断,因为不知道顺时针还是逆时针,所以叉积如果有有整数和负数,那么一定不是凸多边形(注意允许多多点在一条线段上).判断圆在凸多边形首先要判断圆心是否在多边形内,如果在多边形内,再次判断圆心到达到变形每条边的最短距离,如果小于半径就是不合法.ps:一道好题,通过这个题学会了不少东西.

POJ1584-A Round Peg in a Ground Hole(凸包,判圆在凸包内)

A Round Peg in a Ground Hole Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5301   Accepted: 1662 Description The DIY Furniture company specializes in assemble-it-yourself furniture kits. Typically, the pieces of wood are attached to on

POJ 1584 A Round Peg in a Ground Hole 判断凸多边形 点到线段距离 点在多边形内

首先判断是不是凸多边形 然后判断圆是否在凸多边形内 kuangbin的板子,但是有些地方不明白. 判断多边形不是凸多边形后,为什么用判断点是否在凸多边形内的模板交WA了,而用判断点是否在任意多边形内的模板A了 而且判断点是否在任意多边形的注释,返回值为什么又说是凸多边形~~~ POJ 1584 A Round Peg in a Ground Hole(判断凸多边形,点到线段距离,点在多边形内) #include <iostream> #include <cstdio> #inclu

POJ - 1584 A Round Peg in a Ground Hole(判断凸多边形,点到线段距离,点在多边形内)

http://poj.org/problem?id=1584 题意 按照顺时针或逆时针方向输入一个n边形的顶点坐标集,先判断这个n边形是否为凸包. 再给定一个圆形(圆心坐标和半径),判断这个圆是否完全在n边形内部. 分析 1.判断给出了多边形是不是凸多边形. 2.判断圆包含在凸多边形中:一定要保证圆心在凸多边形里面.然后判断圆心到每条线段的距离要大于等于半径.. #include <iostream> #include <stdio.h> #include <string.h