计算几何
ACdreamers
这个作者很懒,什么都没留下…
展开
-
计算几何基础
我们都知道已知A(x1,y1)、B(x2,y2)、C(x3,y3)三点的面积公式为 |x1 x2 x3| S(A,B,C) = |y1 y2 y3| * 0.5 = [(x1-x3)*(y2-y3) - (x2-x3)*(y1-y3)]*0.5 |1 1 1 | (当三点为逆时针时为正,顺原创 2012-08-31 21:33:55 · 2875 阅读 · 0 评论 -
POJ1106(简单几何--极角排序)
题目:Transmitters 题意:给一个半圆的半径和圆心坐标,再给平面上的n个点,这个半圆可以绕圆心任意旋转,问半圆最多能覆盖多少个点? 分析:本题可以这样做,我们只需要考虑到圆心距离小于或者等于半径的那些点,因为大于半径的点一定不能覆盖到,那么这样我们把符合条件的点全部存入一个数组p[],那么然后就二重循环枚举每一个点与圆心所连的直线的的左侧有多少个点,记录最大即可。原创 2013-08-17 16:34:33 · 3272 阅读 · 0 评论 -
POJ3608(旋转卡壳--求两凸包的最近点对距离)
题目:Bridge Across Islands 分析:以下内容来自:http://blog.csdn.net/acmaker/article/details/3178696 考虑如下的算法, 算法的输入是两个分别有m和n个顺时针给定顶点的凸多边形P和Q。1.计算P上y坐标值最小的顶点(称为 yminP )和Q上y坐标值最大的顶点(称为 ymaxQ)。2.为多边形在原创 2013-08-17 15:50:28 · 4813 阅读 · 1 评论 -
POJ1228(稳定凸包问题)
题目:Grandpa's Estate 题意:输入一个凸包上的点(没有凸包内部的点,要么是凸包顶点,要么是凸包边上的点),判断这个凸包是否稳定。所谓稳定就是判断能不能在原有凸包上加点,得到一个更大的凸包,并且这个凸包包含原有凸包上的所有点。 分析:容易知道,当一个凸包稳定时,凸包的每条边上都要有至少三个点,若只有两个点,则可以增加一个点,得到更大的凸包。这样我们可以求出凸包原创 2013-08-17 14:22:10 · 5556 阅读 · 7 评论 -
任意给4条边求形成四边形面积最大值
题目:任意给4条边求形成四边形面积最大值。结论:形成的四边形的四个顶点都在它的外接圆上,面积S满足:其中这也即是圆内接四边形的面积公式。证明过程:首先我们把四边形的四个顶点和四条边顺次分别记为:A,B,C,D和a,b,c,d,角B和D分别记为,设面积为S这样就可以写推导过程了:,亦即 (1)原创 2013-07-29 13:19:31 · 14742 阅读 · 3 评论 -
HDU3634(矩形切割)
题目:City Planning 注意本题应该用value值高的去覆盖低的。#include #include #include using namespace std;const int N = 205;#define LL long longtypedef struct{ LL x1,y1; LL x2,y2;原创 2013-04-10 15:24:42 · 1249 阅读 · 0 评论 -
POJ3695(矩形切割中等题)
题目:Rectangles 题意:给N个矩形,他们可能会重叠,然后给M个询问,每个询问给出指定的矩形位置,然后分别计算每个询问中选中的矩形的并。 本题跟求所有矩形的并一个思路,只是再增加一个数组来保存选中矩形的位置,然后直接求并即可。#include #include #include using namespace std;#define LL __i原创 2013-04-10 14:27:12 · 1754 阅读 · 0 评论 -
POJ3277(矩形切割)
题目:City Horizon 题意:实际上就是求面积的并。因为是面积和的问题,所以越宽越高的肯定应该放在后面,低的先被覆盖。以后在做矩形切割题目的时候最好先排序,那样不容易超时。 #include #include #include using namespace std;#define LL __int64const int N = 4000原创 2013-04-09 16:47:37 · 2800 阅读 · 0 评论 -
POJ1151(矩形切割入门题)
题目:Atlantis 我的上一篇文章已经讲明了线段切割的思想,矩形切割就是把线段切割从一维推到二维就行了,思想都一样。#include #include const int N = 205;typedef struct{ double x1,y1; double x2,y2; double sum;}Node;Node原创 2013-04-09 15:59:20 · 1754 阅读 · 0 评论 -
NEFU709(第K个圆的半径)
题目:The Kth Circle 题意:平面上给定n个点的坐标,我们可以选其中3点构成一个圆,当然也就有3段弧,我们定义第K个圆满足条件:(1)除了已选的3个点,剩下的n-3个点中有K个点在圆内,有n-K-1个点在圆外(2)保证所有的点在圆的三条弧中其中一条弧的一侧解析:本题实际上就是得到这样一个结论,满足条件的圆其中有两点一定在这些点的凸包上,并且这两点相邻,这样我原创 2013-07-22 20:00:16 · 1207 阅读 · 0 评论 -
HDU1756(判断点在多边形内外)
题目:Cupid's Arrow 题意:判断给定的点是否在多边形内或者外。#include #include #include typedef double DIY;const DIY EPS = 1e-8;const int N = 100005;const int INF = 999999999;using namespace std;原创 2013-04-24 16:37:06 · 1521 阅读 · 0 评论 -
Codeforces Beta Round #1--C题(多边形求最小面积)
题目:Ancient Berland Circus 题意:给你一个正凸多边形的三个点,然后求出这个正凸多边形的面积的最小值。方法是这样的:以这三个点做一个三角形,求出这个三角形的外心(外接圆的圆心),这个点也就是外接多边形的中心然后找出内角所对应的边数的GCD当然,内角所对应的边数不一定是整数,我们需要用double的GCD和LCM进行计算,求出最小边数。#inc原创 2013-03-16 13:27:44 · 1447 阅读 · 0 评论 -
极角排序
题目:Space Ant 题意:一只蚂蚁,只会向左转,现在给出平面上很多个点,求解一种走法,能使得蚂蚁能经过的点最多,每个顶点该蚂蚁只能经过一次,且所行走的路线不能发生交叉. 对于题目所输入的点,先找出最左下方的顶点(即纵坐标最小的顶点),然后对剩下的顶点按照对与左下点的极角排序,然后反复找最左下的点,反复进行极角排序,同时记录排序后左下的顶点. 极角排序原创 2013-04-10 19:16:42 · 1689 阅读 · 0 评论 -
平面最近点对
题目:Quoit Design /**最近点对问题,时间复杂度为O(n*logn*logn)*/#include #include #include #include #include using namespace std;const double INF = 1e20;const int N = 100005;struct Point原创 2013-05-16 13:09:40 · 1433 阅读 · 0 评论 -
SPOJ3931(N个点形成三角形的最大面积)
题目:http://www.spoj.com/problems/MTRIAREA/ 题意:就是给定一些点,点的个数最多为50000,从这n个点中选3个点形成的三角形面积最大是多少? 分析:对于这个问题,在网上题解中各种方法都有,但是大部分都是不可靠的,现在我知道的最快的正确方法是O(n^2)的。貌似还有O(nlog(n))的算法,我们可以这样考虑: 最大面积的三角形三个原创 2013-09-01 21:20:01 · 4613 阅读 · 3 评论 -
正方形个数(二维点哈希)
题目:http://poj.org/problem?id=2002 题意:平面上给定n个点,求由这些点能构成多少个正方形。 分析:我们枚举两个点,那么在这两个点形成的直线两边可以计算出正方形的另外两个点,利用Hash然后查找即可。 #include #include #include using namespace std;typedef long lo原创 2013-11-10 19:27:59 · 3412 阅读 · 0 评论 -
三角形内切圆的半径
已知一个三角形的三条边长分别为a,b,c,求它的内切圆的半径大小。 分析:对于这个三角形,设它的顶点分别是A,B,C,圆心为O,半径大小为r。那么过圆心作这三条边的垂线分别交AB,BC,AC于D,E,F,很明显OD = OE = OF = r,而且有:,亦即有: 从而解之, 已知三角形三边计算面积利用海伦公式:,其中原创 2013-11-08 21:09:05 · 5045 阅读 · 0 评论 -
平面最远哈密顿距离
题目:http://poj.org/problem?id=2926 分析:哈密顿距离定义是:对于二维平面上的两点A,B,其坐标分别为:,,那么它们的哈密顿距离D表示为: ,去掉绝对值符号,有以下四种情况: 然后进一步转化: 然后,用二进制枚举。 D = max{每种情况的最大值} #include #include #includ原创 2013-10-15 15:39:57 · 6204 阅读 · 1 评论 -
HDU3662(求三维凸包表面的多边形个数,表面三角形个数,体积,表面积,凸包重心,凸包中点到面的距离)
题目:3D Convex Hull 题意:给定空间中的n个点,求这n个点形成的凸包的表面的多边形个数。增量法求解:首先任选4个点形成的一个四面体,然后每次新加一个点,分两种情况:1> 在凸包内,则可以跳过2> 在凸包外,找到从这个点可以"看见"的面S(看不看得见可以用法向量,看点是否在面外侧),删除这些面S,然后对于S的每条边E进行判断,看该点还能否看到这些边E的另一侧的面原创 2013-05-16 02:39:46 · 2245 阅读 · 0 评论 -
POJ1177矩形面积并(矩形切割+括号匹配)
题目:http://poj.org/problem?id=1177 分析:(括号匹配)首先把矩形的上边界作为“左括号”边,下边界作为“右括号”边,然后上下排序。假定排完序之后是下面的状态:(())()(()()(())) 考虑“最外侧”的括号的数量。显然上面的那个串是(()) & () & (()()(()))有六个最外侧括号,那么边界数量就是6。排序的复杂度O(nlogn原创 2013-09-20 16:11:16 · 2261 阅读 · 0 评论 -
HDU3629(凸四边形的个数)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3629 题意:平面上给n个点,问有多少个凸四边形? 分析:对于每个点,凹四边形的个数等于:C(n-1,3)-在这个点同一侧三点构成的三角形的个数。对于凸多边形的一个顶点,其他顶点必然在穿过这个顶点的直线的同侧。 算极角时,如果是负数(-pi ~ 0),就把它加上2 * pi,这样原创 2013-09-19 18:13:13 · 1903 阅读 · 0 评论 -
HDU4741(异面直线间的距离--空间解析几何)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4741 题意:给定两条异面直线,求它们最近的距离和对应的坐标。#include #include #include #include using namespace std;const double eps = 1e-8;//三维空间点struct Point原创 2013-09-17 16:51:14 · 2663 阅读 · 1 评论 -
POJ2528的另一种解法(线段切割)
题目:Mayor's posters 首先本题题意是:有一面墙,被等分为1QW份,一份的宽度为一个单位宽度。现在往墙上贴N张海报,每张海报的宽度是任意的,但是必定是单位宽度的整数倍,且位置),问张贴完N张海报后,还能看见多少张海报? 利用线段切割,由于后贴的海报可能会覆盖前面的,而很明显知道前面的海报不会影响后面海报的可见性,所以应该从后面往前面推。所以程序中就有:fo原创 2013-04-09 07:17:43 · 1804 阅读 · 2 评论 -
POJ1269(判断线段相交)
题目:Intersecting Lines 题目大意:给两个点能够确定一条直线,题目给出两条直线(由4个点确定),要求判断出这两条直线的关系:平行,同线,相交。如果相交还要求出交点坐标。 解题方法: 先判断两条直线是不是同线,不是的话再判断是否平行,再不是的话就只能是相交的,求出交点。 如何判断是否同线?由叉积的原理知道如果A,B,C共线的话那么(B-A)*(C原创 2013-04-16 21:28:57 · 2774 阅读 · 0 评论 -
最小覆盖圆的增量算法
题意:给出平面上的一些点,要求用一个最小的圆,把所有的点包围起来。最小覆盖圆, 增量法:假设圆O是前i-1个点得最小覆盖圆,加入第i个点,如果在圆内或边上则什么也不做。否,新得到的最小覆盖圆肯定经过第i个点。然后以第i个点为基础(半径为0),重复以上过程依次加入第j个点,若第j个点在圆外,则最小覆盖圆必经过第j个点。重复以上步骤(因为最多需要三个点来确定这个最小覆盖圆,原创 2013-07-22 11:33:33 · 8047 阅读 · 0 评论 -
hdu3007(最小覆盖圆问题)
题目:Buried memory 最小圆覆盖,很经典的问题。题目大概是,平面上n个点,求一个半径最小的圆,能够覆盖所有的点。 如果要求一个最小覆盖圆,这个圆至少要由三个点确定。有一种算法就是任意取三个点作圆,然后判断距离圆心最远的点是否在圆内,若在,则完成;若不在则用最远点更新这个圆。这里不仔细介绍。 这里介绍的算法是,先任意选取两个点,以这两个点的连线为直径作圆。原创 2013-07-22 11:17:02 · 3899 阅读 · 0 评论 -
HDU4273(求三维凸包重心到表面的最短距离)
题目:Rescue 题意:求三维凸包重心到表面的最短距离#include#include#include#include#includeusing namespace std;const int MAXN=1050;const double eps=1e-8;struct Point{ double x,y,z; Point(原创 2013-05-16 11:42:36 · 1452 阅读 · 0 评论 -
POJ1265(Pick定理的应用)
题目:Area 先说说什么是Pick定理吧Pick定理:设以整数点为顶点的多边形的面积为S,多边形内部的整数点数为N,多边形边界上的整数点数为L,则 S=L/2 + N-1。而对于线段上的整点数我们可以通过以下计算得到:int SegmentPointNum(Point A,Point B){ return gcd(abs(A.x-B.x),abs(A.y-B.y原创 2013-04-14 20:38:14 · 1290 阅读 · 0 评论 -
POJ1279(求多边形内核的面积)
题目:Art Gallery 先求出内核,然后再求多边形的面积就行。/*Goujinping 2013.4.12 NEFUThe masterplate of Polygon kernel.Now the global variable Area stand for the area of Polygon kernelIn most case,the原创 2013-04-12 19:30:38 · 1155 阅读 · 0 评论 -
POJ3130(还是判断多边形的内核是否存在)
题目:How I Mathematician Wonder What You Are! 题意:给一个多边形,判断它是否是星形多边形,星形多边形的定义就是:如果在多边形内部能够找到一点能观察到多边形边上的所有点,那么此多边形就 是星形多边形。另外重要的一点就是本题点的输入方向是逆时针方向。所以先变为顺时针。/*Goujinping 2013.4.12原创 2013-04-12 20:16:09 · 1122 阅读 · 0 评论 -
POJ3335(判断多边形内核是否存在)
题目:Rotating Scoreboard 题意:题目要求判断多边形内核是否存在,若存在就输出YES,不存在就输出NO,本题和POJ1474一样。本题点的输入顺序是顺时针方向。/*Goujinping 2013.4.12 NEFUThe masterplate of Polygon kernel.Now the global variable Area st原创 2013-04-12 19:24:22 · 1399 阅读 · 0 评论 -
Codeforces problem 67E(多边形求内核的应用)
题目:E. Save the City! /*Goujinping 2013.4.12 NEFUThe masterplate of Polygon kernel.Now the global variable Area stand for the area of Polygon kernelIn most case,the problem let us原创 2013-04-12 18:52:49 · 1307 阅读 · 0 评论 -
NEFU 635(二分+枚举)
题目:Twinkle Twinkle Little Star 题意:就是给n个点的坐标,然后在这个图形中找出一个边长最小的正方形,要求正方形的边平行于坐标轴且覆盖的点大于等于k个。#include #include #include #include using namespace std;const int N = 200010;const int I原创 2013-04-12 13:26:58 · 931 阅读 · 0 评论 -
POJ4449(三维凸包+空间坐标旋转+二维凸包)
题目:Building Design 题意:题目就是给了一个凸多面题。要把这个凸多面体放到地上,一个面要接触到地面。求一种放法,使得最高点最高,最高点相同时使投影面积最小。输出最高点高度H和投影面积S。先三维凸包一下求得所有的三角形表面。然后枚举每一个表面,进行坐标变换,旋转使得这个表面变水平,然后投影求投影面积,算最高点高度。 题目的数据好像没有n==1 ,2原创 2013-05-16 13:01:45 · 1717 阅读 · 0 评论 -
HDU3400(计算几何中的三分法利用)
题目:Line belt 题意:就是给你两条线段AB , CD ,一个人在AB上跑速度p, 在CD上跑q,在其他地方跑速度是r。问你从A到D最少的时间是好多。#include#include#include using namespace std;typedef struct{ double x , y ;}point;point a,b,c原创 2013-05-16 11:57:25 · 1352 阅读 · 0 评论 -
HDU4367(线段相交与斐波那契数列)
题目:The war of virtual world 题意:在平面内给n个点的坐标,n小于等于200,在这n个点中先选两个点a,b,有(n-1)*n/2种,对于每一种情况,分别求出Ki,Ki等于选定的a,b直线与剩下的点的交点数,求表达式:的值。 #include #include #include #include using namespace s原创 2013-07-21 21:04:55 · 1330 阅读 · 0 评论 -
HDU4353(找一个三角形面积与它里面包含点的比值最小)
题目:Finding Mine 题意:给你n个点,m个金矿点,找一个多边形,使得多边形的面积除以这个多边形内的金矿点个数的比值最小。思路:其实就是找一个比值最小的三角形就行了,因为其他的三角形的比值都比它大,组合成多边形后势必会将比值变大。可以简短的证明的。#include #include #include #include #include using原创 2013-07-19 21:12:43 · 1600 阅读 · 0 评论 -
NJUST4316(立体几何投影的面积交)
题目:Mission Impossible 题意:在天花板上有3个摄像头,下面有一个凸多面体,问摄像头观测不到的在地面上的面积是多少。 思路:先求出每个摄像头对于凸多面体在xoy平面的投影,然后求凸包,然后利用半平面交来求面积交即可,注意求投影时用到一个结论:如果在空间有3点共线则满足:(z3-z2)/(z2-z1)=(y3-y2)/(y2-y1)=(x3-x2)/(x2-x1原创 2013-06-04 21:30:59 · 1790 阅读 · 0 评论 -
UVA10173(求凸包的面积最小外接矩形)
题目:10173 - Smallest Bounding Rectangle 求凸包的最小外接矩形的面积。思路:旋转卡壳给定点集S,求S的最小覆盖矩形最小覆盖矩形的四条边上,其中一条边有至少两个点,其他边上至少有一个点。然后沿着凸包的边旋转,维护矩形另外三条边上的点。#include#include#include#define eps 1e-8原创 2013-05-16 13:21:20 · 4385 阅读 · 0 评论 -
HDU4082(相似三角形的个数)
题目:Hou Yi's secret #include#include#include#include#includeusing namespace std;const double eps=1e-6;mapmp;struct Node{ int x,y;}node[50];double dis(Node a,Node b){原创 2013-05-16 12:49:06 · 1419 阅读 · 0 评论