
计算几何
文章平均质量分 75
BRCOCOLI
初学者 记录成长 Fighting
展开
-
POJ 2007 Scrambled Polygon .
题目地址就是把点逆时针顺序排序把每个点看成从原点出发的向量利用叉积逆时针转180°以内为正的性质就能逆时针将点排序了#include#include#include#include#includeusing namespace std;typedef pair Point;vector G;double operator ^ (const Point& x,cons原创 2016-07-29 08:43:52 · 269 阅读 · 0 评论 -
POJ 4720 Naive and Silly Muggles -
题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=4720求围住一个三角形的最小圆如果是钝角,那么圆的直径就是最长的那条边其他情况圆是三角形的外接圆可用以下方法求的外心:给定三角形三个顶点的坐标,如何求三角形的外心的坐标呢?例如 :给定a(x1,y1) b(x2,y2) c(x3,y3)求外接圆心坐标O(x,y)原创 2017-01-06 08:43:55 · 258 阅读 · 0 评论 -
点和向量的表示和基本计算(刘汝佳版)
#include #include #include #include using namespace std;struct Point{ double x,y; Point(double x=0,double y=0):x(x),y(y){}};typedef Point Vector;//向量+向量=向量,点+向量=点Vector operator + (Vector A原创 2017-01-03 16:41:15 · 1599 阅读 · 0 评论 -
UVA 12304 2D Geometry 110 in 1! -
题目地址:https://vjudge.net/problem/UVA-12304#include #include #include #include #include #include using namespace std;#define REP(i,a,b) for(int i=a;i<=(int)(b);++i)#define REPD(i,a,b) for(int原创 2017-01-06 21:01:19 · 260 阅读 · 0 评论 -
LA 2572 Viva Confetti 离散化 *
题目地址:https://vjudge.net/problem/UVALive-2572离散化:把每个圆看成是一段一段弧组成的每个圆拿出来看一下,先求其上与其他所有圆的交点。每两个交点之间的那段弧要么可见要么不可见,在弧上任取一个点(这里取的的中点),将该点向内(圆心方向)和向外移动一个微小的eps距离,为p1,p2,看看p1和p2是否在最上层的圆内,如果在内部,那么该圆可见#原创 2017-01-07 12:40:49 · 375 阅读 · 0 评论 -
点在多边形内判定
#include #include #include #include #include using namespace std;#define REP(i,a,b) for(int i=a;i<=(int)(b);++i)#define REPD(i,a,b) for(int i=a;i>=(int)(b);--i)struct Point{ double x,y; Poi原创 2017-01-07 14:52:44 · 294 阅读 · 0 评论 -
Andrew算法求凸包
int ConvexHull(Point* p, int n, Point* ch){ //p是待凸包的点,ch是保存凸包的点 sort(p, p+n); int m=0; for(int i=0;i<n;i++){ while(m>1 && Cross(ch[m-1]-ch[m-2], p[i]-ch[m-1]) <= 0) m--; ch[m++]=p[i];原创 2017-01-07 15:46:15 · 341 阅读 · 0 评论 -
UVA 10652 Board Wrapping .
题目地址:https://vjudge.net/problem/UVA-10652模板题注意顺时针为正,并且输入的是度数而不是弧度值#include using namespace std;#define REP(i,a,b) for(int i=a;i<=(int)(b);++i)#define REPD(i,a,b) for(int i=a;i>=(int)(b);--i)原创 2017-01-07 19:01:30 · 229 阅读 · 0 评论 -
UVA 11168 Airport 凸包 .
题目地址:https://vjudge.net/problem/UVA-11168线是凸包上的相邻两点组成的线再每条线都枚举一下,求出最小值#include using namespace std;#define REP(i,a,b) for(int i=a;i<=(int)(b);++i)#define REPD(i,a,b) for(int i=a;i>=(int)(b);原创 2017-01-07 20:11:13 · 315 阅读 · 0 评论 -
UVA 10256 The Great Divide 凸包 .
题目地址:https://vjudge.net/problem/UVA-10256#include using namespace std;#define REP(i,a,b) for(int i=a;i<=(int)(b);++i)#define REPD(i,a,b) for(int i=a;i>=(int)(b);--i)const double PI=acos(-1);co原创 2017-01-07 22:01:33 · 334 阅读 · 0 评论 -
LA 4728 Squares 凸包 .
题目地址:https://vjudge.net/problem/UVALive-4728最远的两点肯定是凸包上的点,所以先求凸包再枚举凸包上的两个点,更新最远的距离,这里用滑动窗口算法优化#include using namespace std;#define REP(i,a,b) for(int i=a;i<=(int)(b);++i)#define REPD(i,a,b)原创 2017-01-08 10:48:31 · 244 阅读 · 0 评论 -
旋转卡壳算法
点集的直径:指的是点集中最远点对的距离对踵点对:过该点对的两条平行线能把所有凸包夹在之间 D,G就是点对旋转卡壳: 射线j,k同时逆时针旋转θ角度,绕凸多边形一圈,他们两线之间的最大距离就是点集的直径 刘汝佳的算法如下:// 返回点集直径的平方int diameter2(vector<Point>& points) { vector<Point> p = ConvexHull(原创 2017-01-08 12:08:44 · 509 阅读 · 0 评论 -
LA 3890 Most Distant Point from the Sea 半平面交 .
题目地址:https://vjudge.net/problem/UVALive-3890#include using namespace std;#define REP(i,a,b) for(int i=a;i<=(int)(b);++i)#define REPD(i,a,b) for(int i=a;i>=(int)(b);--i)const double PI=acos(-1);原创 2017-01-08 16:25:25 · 295 阅读 · 0 评论 -
半平面交的模板
网上看到个 把半平面交转化为求凸包的方法也即是把一条直线y=kx+b看成一个点(k,b)求凸包详细证明及其代码见:http://trinkle.blog.uoj.ac/blog/235#include using namespace std;#define REP(i,a,b) for(int i=a;i<=(int)(b);++i)#define REPD(i,a,b) fo原创 2017-01-08 15:16:21 · 302 阅读 · 0 评论 -
LA 4992 Jungle Outpost 半平面交 -
题目地址:https://vjudge.net/problem/UVALive-4992间隔一个点的所有线段连起来求半平面交,间隔两个点的所有线段连起来求半平面交,。。。直到刚好不存在半平面交,就是答案可以用二分来查找答案#include using namespace std;#define REP(i,a,b) for(int i=a;i<=(原创 2017-01-09 20:41:07 · 332 阅读 · 0 评论 -
圆的相关计算(刘汝佳版)
#include #include #include #include #include using namespace std;/*Point的模板*/struct Point{ double x,y; Point(double x=0,double y=0):x(x),y(y){}};typedef Point Vector;//向量+向量=向量,点+向量=点Vec原创 2017-01-05 20:01:48 · 368 阅读 · 0 评论 -
UVA 11796 Dog Distance .
题目地址:https://vjudge.net/problem/UVA-11796想法:对于A和B一起的每一线段,它们之间差的距离肯定要么是增函数,要么是减函数,所以答案只存在A处于莫个端点或B处于某个端点的时候所以 剩下的目标就是如何枚举每一线段,然后更新其中我还弄错了一个地方,我以为取答案的两个点肯定是在端点上,然而 不一定在端点上,那么在一起运动的时候,难得就是它们速度不一样,一原创 2017-01-05 11:19:21 · 332 阅读 · 0 评论 -
LA 3263 That Nice Euler Circuit 欧拉定理 -
题目地址:https://vjudge.net/problem/UVALive-3263#include #include #include #include #include using namespace std;#define REP(i,a,b) for(int i=a;i<=(int)(b);++i)#define REPD(i,a,b) for(int i=a;i>原创 2017-01-04 20:50:45 · 227 阅读 · 0 评论 -
矢量表示及其计算
#include#include#includeusing namespace std;struct CVector{ //向量 double x,y; CVector(double x,double y):x(x),y(y) {}};CVector operator + (CVector p,CVector q){ //c=a+b; return CVector(p.x+q原创 2016-07-29 08:47:38 · 926 阅读 · 0 评论 -
点线表示及其计算
#include#include#includeusing namespace std;struct CVector{ //向量 double x,y; CVector(double x,double y):x(x),y(y) {}};struct CPoint{ //点 double x,y; CPoint(double x,double y):x(x),y(y) {原创 2016-07-30 00:36:13 · 643 阅读 · 0 评论 -
百练 2624 4th Point .
水题一道.. 题目地址:http://www.bailian.openjudge.cn/practice/2624#include#includeusing namespace std;struct Point{ //点 double x,y; Point(double x,double y):x(x),y(y) {} Point operator + (const Poi原创 2016-07-30 02:07:40 · 375 阅读 · 0 评论 -
POJ 1066 Treasure Hunt (线段与线段相交) -
题目地址:http://poj.org/problem?id=1066可以1)从相邻两点的中间出发,求中间穿过多少直线但首先要极角排序,而且极角相同情况下离原点近的在前面也可以2)直接从每个墙的端点出发,这样就不用再排序了注意但n=1时要输出11)方法代码如下#include#include#include#include#includeusing namespa原创 2016-08-03 17:03:51 · 218 阅读 · 0 评论 -
凸包问题
根据极角排序Graham扫描法求凸包(但无法完全保留凸包边上的点)1. 找出最左下的点(首先要最下,有多个最下则找最左),记为p[0]2. 以p[0]为原点,对p[1]...p[n-1]进行按极角排序。极角相同的, 距离p[0]近的算小3. 栈里面放入p[0],p[1],p[2]for(int i = 3; i while(true) { 考察栈顶元素 k2,原创 2016-08-03 19:19:20 · 367 阅读 · 0 评论 -
POJ 1113 Wall (凸包问题) .
题目地址:http://poj.org/problem?id=1113先做个凸包求出最小的长度因为要远离至少L,所以把凸包的每个线段平移远离L,同时在每个顶点做半径为L的扇形每个顶点的扇形弧长加起来正好是一个半径为L的圆的周长所以答案就是凸包求出来的周长加上半径为L的圆的周长,别忘了答案要四舍五入#include#include#include#include#incl原创 2016-08-03 19:27:57 · 272 阅读 · 0 评论 -
POJ 1228 Grandpa's Estate -
题目地址:http://poj.org/problem?id=1228因为每条边至少要有3个点,所以要判断每条边有几个点共线方法是求出凸包的点,再任意枚举凸包上相邻的两个点,再遍历其他点利用叉积看是否与它共线要注意:但点数小于6是肯定不可能的,还有所有点都共线的情况也是不可能的#include#include#include#include#includeusin原创 2016-08-03 22:24:44 · 283 阅读 · 0 评论 -
半平面交
部分转自:http://www.cnblogs.com/yzcstc/archive/2013/04/11/3015521.html半平面交是求多边体的核,也即是类似求看多边形里面存不存在可以看到边上所有点的点的这种题所谓半平面,通俗一点就是就是一些形如 a*x+b*y+c =0)的区域,实际上就是平面的一半,成为半平面,而半平面交,就是一些这样的半平面解的交集,反映上直角原创 2016-08-03 23:34:37 · 392 阅读 · 0 评论 -
POJ 1474 Video Surveillance -
题目地址:http://poj.org/problem?id=1474半平面交的典型题目,模板直接上,但要注意题目中点的方向是顺时针给出的,要变为逆时针#include#include#include#include#includeusing namespace std;#define Vector Pointconst double EPS=1e-6;int Sign(d原创 2016-08-04 11:48:27 · 263 阅读 · 0 评论 -
百练 1039 Pipe -
题目地址:http://www.bailian.openjudge.cn/practice/1039依次枚举上面和下面的任意两点所组成的直线,然后依次判断是否与每个拐点的竖线相交判断是否相交的方法是算出该点处的y值并比较#include#include#include#include#includeusing namespace std;const double EPS=1原创 2016-08-02 22:29:24 · 196 阅读 · 0 评论 -
POJ 3304 Segments -
#include#include#include#include#includeusing namespace std;const double EPS=1e-8;bool IsZero(double x){ //判断x是否为零 return -EPS<x&&x<EPS;}#define Vector Pointstruct Point{ double x,y; Po原创 2016-08-02 18:25:20 · 288 阅读 · 0 评论 -
求两圆相交的面积
转自博客:http://blog.sina.com.cn/s/blog_850498e20100w6fq.html假设半径小的圆为c1,半径大的圆为c2。c1的半径r1,圆心坐标(x1,y1)。c2的半径r2,圆心坐标(x2,y2)。d为两圆圆心连线的长度。相交面积为Sd=sqrt((x1-x2)^2+(y1-y2)^2)(1)如果r1+r2那么两圆相离,相交面积S=0转载 2016-11-20 16:54:20 · 1015 阅读 · 0 评论 -
点和直线的计算(直线的参数方程表示)刘汝佳版
直线由一个点P和一个方向向量v表示,比如L=P+tv#include #include #include #include #include using namespace std;/*Point模板部分*/typedef complex Point;typedef Point Vector;const double eps = 1e-10;int dcmp(doub原创 2017-01-03 19:45:02 · 1273 阅读 · 0 评论 -
UVA 11178 Morley's Theorem .
题目地址:https://vjudge.net/problem/UVA-11178模板题#include #include #include #include #include using namespace std;/*Point模板部分*/typedef complex Point;typedef Point Vector;const double eps = 1e原创 2017-01-03 20:36:08 · 293 阅读 · 0 评论 -
平面直线图(PSLG)模板
来自LRJ类似卷包裹算法把每条边拆成两条半边(有向边),u->v和v->u,并且只取每条有向边的左边的区域思路就是从每个点出发(包括新产生的交点),沿着逆时针转的最多的一条边作为下一条边,直到回到起点,其左边围成的区域就是其中一个多边形遍历的方向如下:最外面的那个为无限面求沿着逆时针转的最多的一条边作为下一条边方法就是取反向边顺时针转动的第一条,这样子更加的方便原创 2017-01-14 09:34:40 · 1557 阅读 · 0 评论