
计算几何
流年冲淡时光
这个作者很懒,什么都没留下…
展开
-
LA 2572 圆盘的相互覆盖问题,圆弧极角排序,中点代替圆弧,轻微扰动的影响判断
#include#include#include#include#include#include#include#include#include#define LL long longusing namespace std;const double eps=5*1e-13;const double PI=acos(-1.0);int dcmp(double x){翻译 2015-03-25 20:32:32 · 793 阅读 · 0 评论 -
三维几何之求空间俩线段的公垂线,以及分数类
分析:首先判断线段俩直线是否平行(或重合),如果是的话直接求。考虑4个端点到另外一条线段的距离,取最小值即可。如果不平行或重合,说明俩条直线是异面直线,这时最短距离既可能是某端点到另外一条线段的距离,也可能是异面直线的最短距离。如何求异面直线的最短距离?假设俩条直线分别为l1=(p1,v1)和l2=(p2,v2),那么最短距离会在某个q1=p1+sv1和q2=p2+tv2上取到,其中q翻译 2015-05-17 20:41:37 · 3391 阅读 · 0 评论 -
三维几何之判断俩个一个六面题的重心稳定性
分析:压纸器一共有5个顶点,底面至少有三个顶点,所以可以枚举底面上的三个顶点P1P2P3,判断是否可以以该面为底进行稳定放置。具体来说需要判断是否所有顶点都在该面的同侧,然后整个压纸器的重心是否在底面三角形的内部,且离各边的距离不超过0.2.有一种特殊情况是很容易漏掉:如果还有一个点P4也在底面上(即四点共面),那么重心落在P1P2P3P4的凸包内即可,不一定在三角形P1P2P3内。翻译 2015-05-18 20:04:08 · 458 阅读 · 0 评论 -
三维集合之三维凸包,和求密度均匀的凸多面体的重心
分析:不难发现,最有放置方法是贴住俩颗行星的某俩个面,而最近距离为各自重心到这俩个面的距离之和。换句话说,我们可以独立求出俩颗行星的”重心到各面的最短距离“,再相加即可。由于只给出了顶点,需要先求一次三维凸包,找到所有面,然后求出重心,最后依次计算重心到各个面的距离。如何求重心呢?因为行星是均匀的,可以先随便找一个位于行星内部的点(比如所有顶点的坐标平均数),连接该点和各个面,得到若干翻译 2015-05-18 21:57:02 · 2133 阅读 · 0 评论 -
HNOJ13312注意精度的处理问题和三角形对应的外界圆的圆心交的求法
这题可以用数学几何来处理,即用极角相减就可以得出三角形一个角对应的圆心角,然后枚举是为了处理精度的问题。当然也是可以用ACM计算几何来做,就是求出三角形的外界圆圆心和半径,然后求出圆心角,然后用gcd求出公约数,用2*pi除以公约数即可以得出边数,注意四舍五入,另外注意实数的gcd用fmod;贴出前一种做法的代码;#include#include#include#includ翻译 2015-07-27 08:47:37 · 641 阅读 · 0 评论 -
小白书84页果园里的书,叉积方向问题和三角形面积
这题题本来想用转角发判断点在多边形内,后来发现给出的三角形的三个点的位置是不确定的,而转角法规定点是按逆时针拍好序的,随意放弃了这种做法,还是用三角形面积来做的,这里既可以按照三角形面积和是否相等来做,先可以想想一下有向面积公式,用方向来判断:判断点p是否在三角形内部或者是边界上的方法是:O点分出的三个三角形按oab,obc,oca的顺序得到的结果与原来的大三角形Sabc的同号或为0。翻译 2015-07-17 23:17:39 · 557 阅读 · 0 评论 -
小白书86页欧拉公式,椭圆边界上n个点最多能把椭圆分成多少块
这题虽然代码比较简单,但是分析比较困难,注意分析理解欧拉公式,以及一些分析的方法:不难发现,最优方案不会让任何三条线段交与一点。为了计算出答案,我们先要学习欧拉公式:V+F-E=2。其中,V是顶点数(即所有线段的端点数加上交点数),E是边数(即n段椭圆弧加上这些线段被切成的段数),F是面数(即土地数加上椭圆外那个无穷大的面)。换句话说,只需求出V和E,答案就是E-V+1。不管是翻译 2015-07-18 09:01:14 · 1040 阅读 · 0 评论 -
计蒜客429根据输入特点划分圆求扇形面积
做题的时候不能不着边际的乱想,注意这题的输入数据特点,以及圆的特点,把圆划分为360,标记每个度数的最大值然后求扇形面积,另外注意一度的扇形也是能求扇形面积的#include#include#include#include#include#includeusing namespace std;#define LL long longconst double pi=acos(翻译 2015-07-21 18:13:17 · 524 阅读 · 0 评论 -
UVA10112点在三角形内部和边界上
这题也是醉了,本来应该一发AC的,debug了好久发现原来只是下面求面积的时候忘记加绝对值了,醉了。三角形判定点注意绝对值的问题。#include#include#include#include#include#include#includeusing namespace std;const double eps=1e-6;int dcmp(double x){ i原创 2015-08-14 13:27:34 · 335 阅读 · 0 评论 -
HDU5295给出俩条线段和中点给出长度求点坐标
#include #include #include #include #include using namespace std;const double eps = 1e-6;int sgn(double x){if(fabs(x) return x > 0 ? 1 : -1;}struct P{double x , y;P(d翻译 2015-07-25 09:09:41 · 827 阅读 · 0 评论 -
HDU5298立体几何
#includeusing namespace std;struct P{ __int64 x,y,z;};struct Plane { __int64 a,b,c,d;};Plane pls[110];struct B{ __int64 x,y,z,r;};B bs[20];int m,n;inline int fp(const Plane& pl,const翻译 2015-07-25 09:17:44 · 620 阅读 · 0 评论 -
HDU5299拓扑排序和博弈
#include#include#include#include#include#include#includeusing namespace std;typedef double db;typedef long long LL;#define pb push_backconst db EPS = 1e-8;const int MAXN = 50015 ;db sqr翻译 2015-07-25 09:21:34 · 431 阅读 · 0 评论 -
UVA375等腰三角行无限内切圆面积
刚开始自己做的时候以为每个内切圆的直径连起来刚好等于高,那个精度并没有什么用,显然想当然了,而是每个内切圆都相当于一个新的三角形,重新求三角形的底边和高,利用最开始的底和高求出tan@和tan@/2,然后逐层递归即可。#include#include#include#include#include#include#include#include#include#inc原创 2015-08-05 15:42:55 · 440 阅读 · 0 评论 -
简单三维几何,判断俩个三角形是否相交
简单三维几何,多贴些三维几何的基本的东西,一些基本函数,和定义,判断俩个三角形是否相交,如果相交,那么必然有一个三角形的一条边经过另一个三角形的内部、边上或者顶点,代码:#include#include#include#include#include#include#include#include#include#include#include#includeu翻译 2015-05-16 22:11:37 · 3013 阅读 · 0 评论 -
PSLG,直线切割凸多边形,和判断圆与多边形相交
分析:除了圆盘之外,本题的输入也是一个PSLG,因此可以按照前面叙述的算法求出各个区域。但由于本题的特殊性,不难发现把线段改成直线后答案不变,因此每个块都是凸多边形,可以用切割凸多边形的方法求解:每读入一条线段,都把它当做直线,切割所有块。这样,我们最终得到了若干凸多边形,需要分别判断是否与圆盘相交。如何让判断多边形是否和圆盘相交?,显然,如果多边形的边和圆周规范相交,圆盘和多变性一定翻译 2015-05-15 22:04:18 · 1994 阅读 · 0 评论 -
使用叉积进行极角排序HDU1661
解题思路:扫描线算法。枚举任意一点,其他点依照那一点进行极角排序。扫描获得最大值。注意:1、因为 atan2方式的极角排序有精度误差,在这里需要用叉积方式排序。否则就自己慢慢测精度去吧!2、用叉积方式的极角排序需要将排序的点提前处理到两个象限范围内。注意点属性的状态转换。3、POJ数据较弱,HDU数据较强。两个OJ都是C++较慢。#include #includ转载 2015-03-17 21:20:49 · 1536 阅读 · 0 评论 -
UVA10652凸包简单应用
这题本身并没什么难度,就是一个裸的凸包,只是有一点我没想到而已,就是如何根据矩形中点坐标求出矩形顶点的坐标,它这里是使用平移的思想,假设凸包中点在圆心,然后根据从中心出发的向量加上中心坐标来求得顶点坐标。#include#include#include#include#include#include#include#include#include#i翻译 2015-03-28 10:19:37 · 553 阅读 · 0 评论 -
给定半径圆心未定的圆和若干点
Pesky MosquitoesTime Limit: 4000ms, Special Time Limit:10000ms,Memory Limit:65536KBTotal submit users: 9, Accepted users:9Problem 13239 : No special judgementProblem descri翻译 2015-03-17 20:48:52 · 538 阅读 · 0 评论 -
UVA11168凸包的应用之使用解析几何巧妙节省时间
#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;const double eps=1e-5;const int N=1e5;int dcmp(double x){ if(fabs(x)<eps)翻译 2015-03-28 20:53:18 · 582 阅读 · 0 评论 -
UVA12304直线,圆,点的综合应用
虽然这道题是个简单题,但对于我这样的弱渣还是研究了好久,而且自己根据大白书写的代码始终不对,无奈最后还是抄袭大神代码,通过这个题得到下面几条心得,1.做计算几何一定要注意精度问题,很难有绝对的相等,主要相对精度而言2.做计算几何比较繁琐,一定要理清思路,代码思路一定要清晰由于感觉大神的代码思路清晰,而且代码风格比较好,特贴出大神代码,以及我自己按照大白书写的始终WA的代码,留着翻译 2015-03-22 20:29:28 · 656 阅读 · 0 评论 -
uva10256如何判断俩个凸包是否相交
本题并没有多大的难度,就是点集分割,然后求凸包,判断俩个凸包是否相交,重点在于如何判断来个凸包是否相交,分俩步进行,1.判断俩个凸包上的任意线段是否规范相交2.判断各自凸包上的点是否在另一个凸包内部以及边界上#include#include#include#include#include#include#include#include#include#incl翻译 2015-03-29 19:59:19 · 1890 阅读 · 0 评论 -
UVA LA 4728旋转卡壳
看的大白书的旋转卡壳,但是看了讲解之后自己写不出来,找的题解,却总感觉别人写的不够优化,而且这个题本身暴力也可以过,数据有点水,先留下别人的代码,回头慢慢体会吧:#include#include#include#include#include#includeusing namespace std;const int maxn = 100500;const int maxe翻译 2015-04-12 19:02:21 · 448 阅读 · 0 评论 -
UVA LA3890 二分和半平面交
这题二分的思想很巧妙,加上基本的半平面交,代码:#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;const double eps=1e-6;int dcmp(double x){翻译 2015-05-10 19:44:06 · 436 阅读 · 0 评论 -
UVA LA 2218 列出不等式整理成半平面的形式来求半平面交,注意特判
分析: 思路总结与借鉴: 这个题很巧妙,遇到此类题要敢于去列出方程,不要惧怕未知数比较多,比如此题很巧妙的处理为半平面交。具体分析设比赛总长度为1,其中游泳长度为x,自行车长度为y,赛跑长度为1-x-y,则选手i打败选手j(不能并列)的条件是x/vi+y/ui+(1-x-y)/wi0的形式,然后分别可以求出A.B.C;这翻译 2015-05-10 20:59:47 · 522 阅读 · 0 评论 -
计算几何中的精度问题 转载自hust Erbao
计算几何头疼的地方一般在于代码量大和精度问题,代码量问题只要平时注意积累模板一般就不成问题了。精度问题则不好说,有时候一个精度问题就可能成为一道题的瓶颈,简直“画龙点睛”。这些年的题目基本是朝着越来越不卡精度的方向发展了,但是也不乏一些%^&%题#$%$^,另外有些常识不管题目卡不卡,都是应该知道的。今天我就开膛回顾下见过且还有印象的精度问题,由于本人见识和记忆均有限,望各位大神瞄过后不吝补充。另转载 2015-05-11 19:44:58 · 400 阅读 · 0 评论 -
UVA LA 2797 PSLG 线段闭合圈 神奇的精度问题
分析:本题的输入是一个PSLG,目标是判断起点和终点是否在同一个区域内,因此一个可行的方法是先找出所有区域,然后判断起点和终点分别属于哪个区域。但笔者并不推荐这样做,因为这种做法不仅麻烦,而且很容易出错。这道题看上去像个迷宫,可不可以用图论求解呢比如,每条线段的端点看成一个点,在加上起点和无穷远点(随便取一个坐标很大的点)构图。如果俩个点u和v的线段没有与其他线段规范相交;则连接一条边(表示可翻译 2015-05-12 20:35:47 · 753 阅读 · 0 评论 -
UVA LA3218 找边界,PSLG
分析:本题是求PSLG得外轮廓,需要借助与前面所说的“类似卷包裹”的算法。具体来说,首先找到x坐标最小的点(如果有多个,找y坐标最小的点),然后开始“卷包裹”。首先找到初始边。然后每次都执行如下操作。首先看看当前线段是否和其他线段相交(根据题意,一定是规范相交),如果不想交,说明可以直接走到当前线段的终点,否则走到最近的交点就得停下来,接下来转弯并继续前进。转弯时如果有多条路可翻译 2015-05-14 22:40:14 · 541 阅读 · 0 评论 -
UVA1973*3用七个碎片拼成正方形,正方体的旋转和平移,即矩阵变换
状态搜索题,重点不是状态,而是这道题的代码,以及空间想象能力,当然,做个几个星期,以我的水平也不见得做的出,看了一下别人的代码和题解,基本上理解了,这里先讲一下,正方体的变换:1、首选我们要根据碎片,求出所有碎片的不重复的三维构形,可以推论得到碎片的最多不同构形有6*4=24种,其中6表示,无论是碎片还是立体都会有6个面,依次使6个面朝向自己,这样相当于有6种不同的旋转方式了(对于原创 2015-10-09 21:52:51 · 1378 阅读 · 0 评论