随笔分类 - 计算几何
摘要:给你最多1000个圆,问画一条直线最多能与几个圆相交,相切也算。显然临界条件是这条线是某两圆的公切线,最容易想到的就是每两两圆求出所有公切线,暴力判断一下。可惜圆有1000个,时间复杂度太高。网上题解的做法是枚举每个“中心圆”,求出这个圆与其他圆的切线,然后按极角排序,扫一圈。把每条切线看成扫入线——添加一个圆,或扫出线——删除一个圆。形象一点就是一条与中心圆相切的直线,沿着中心圆滚了一圈,当这个直线碰到其他圆时,是添加了一个圆还是删除了一个圆。PS:这题C++交死活TLE,G++才能交过。为什么为什么为什么orz……PS2:这题我之前少判了一种情况(就是那个A内含B的情况),导致fix调整角
阅读全文
摘要:空间异面直线的距离直接套模板。求交点:求出两条直线的公共法向量,其中一条直线与法向量构成的平面 与 另一条直线 的交点即可。还是套模板o(╯□╰)o1.不会有两条线平行的情况。2.两条直线可能相交#include #include #include #include #include using namespace std;const double EPS = 1e-9;const int MAXN = 40;struct Point3 //空间点{ double x, y, z; Point3( double x=0, double y=0, double z=0 ): x(x...
阅读全文
摘要:以下摘自SPOJ泛做表格:题意:给定一个星形多边形,而且给出了一个可以看到形内所有点的位置(我们称这个点为观察点),让你判断有多少个点位于多边形内。时间复杂度:O(mlogn)将多边形上的点按极角排序,观察点与多边形上任意相邻两点形成若干个三角形,再按照极角查找给定点可能位于哪个三角形,最后用叉积判断它是否真的在那个三角形内。注意细节,给几组数据:input84 12 2-2 22 -2-2 -23 36 62 24 46 6-3 1-1 -15 15 12 26 67 71 13 322 152 02 24 45 51 50 5-1 5-5 5-4 4-3 3-2 2-2 0-2 -2-3
阅读全文
摘要:1.三角形的所有端点2.过所有三角形的端点对所有圆做切线,得到所有切点。3.做任意两圆的外公切线,得到所有切点。对上述所有点求凸包,标记每个点是三角形上的点还是某个圆上的点。求完凸包后,因为所有点都是按逆时针(或顺时针)排好序的,如果相邻两点在同一圆上,那么求这段圆弧的距离,否则求这段直线的距离。最后得到所有周长。#include #include #include #include #include using namespace std;const double eps = 1e-9;const double PI = acos(-1.0);const int MAXN = 60;stru
阅读全文
摘要:总体思路参考了 这里。细节:1.控制精度,虽然这题没卡精度,不过还是要控制一下。之前 bool operator#include #include #include #include #include using namespace std;const int MAXN = 20010;const double eps = 1e-9;struct Point{ double x, y; int type; Point( double x = 0, double y = 0, int tp = 0 ): x(x), y(y), type(tp) { } void read...
阅读全文
摘要:来源:http://wenku.baidu.com/view/9d2d5781d4d8d15abe234e35.html我是用到什么就敲什么,敲好了就放在这里备用#include #include #include #include #include using namespace std;const double EPS = 1e-9;const int MAXN = 40;struct Point3 //空间点{ double x, y, z; Point3( double x=0, double y=0, double z=0 ): x(x), y(y), z(z) { }...
阅读全文
摘要:题意:给你一些无限长的圆柱,知道圆柱轴心直线(根据他给的三个点确定的平面求法向量即可)与半径,判断是否有圆柱相交。如果没有,输出柱面最小距离。一共只有30个圆柱,直接暴力一下就行。判相交/相切:空间直线距离是否小于等于两圆柱半径和若无相交,求最小:空间直线距离-两圆柱半径和 1 #include 2 #include 3 #include 4 #include 5 #include 6 7 using namespace std; 8 9 const double EPS = 1e-9; 10 const int MAXN = 40; 11 12 struct...
阅读全文
摘要:航线算球面距离,需要经纬度转空间坐标。任意两点间距离用Floyd求出来,查询时直接查表。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 8 using namespace std; 9 10 const int MAXN = 110; 11 const double INF = 1e30; 12 const double eps = 1e-8; 13 const double PI = acos( -1.0 ); 14 15 struct Point 16 { 17 ...
阅读全文
摘要:求出所有交点枚举每个四边形找最大面积即可。 1 #include 2 #include 3 #include 4 5 using namespace std; 6 7 const int MAXN = 40; 8 9 const double eps = 1e-10; 10 11 struct Point 12 { 13 double x, y; 14 Point( double x = 0, double y = 0 ):x(x), y(y) { } 15 }; 16 17 typedef Point Vector; 18 19 Vecto...
阅读全文
摘要:模板敲错了于是WA了好几遍……判断由红点和蓝点分别组成的两个凸包是否相离,是输出Yes,否输出No。训练指南上的分析:1.任取红凸包上的一条线段和蓝凸包上的一条线段,判断二者是否相交。如果相交(不一定是规范相交,有公共点就算相交),则无解2.任取一个红点,判断是否在蓝凸包内。如果是,则无解。蓝点红凸包同理。其中任何一个凸包退化成点或者线段时需要特判。其实只需要把上面两个判断顺序颠倒一下,就可以不需要特判。先判断点是否在凸包内,因为这个考虑了点在凸包边界上的情况,所以后面判凸包线段是否相交时直接用规范相交判断即可。此时特殊情况包含在了上两种情况中,因此不需要特判。 1 #include 2...
阅读全文
摘要:旋转卡壳求凸包直径。参考:http://www.cppblog.com/staryjy/archive/2010/09/25/101412.html 1 #include 2 #include 3 #include 4 5 using namespace std; 6 7 const int MAXN = 100022 1 && Cross( ch[m - 1] - ch[m - 2], p[i] - ch[m - 2] ) = 0; --i ) 59 { 60 while ( m > k && Cross( ch[m - 1] - ch[m ...
阅读全文
摘要:旋转卡壳:http://blog.csdn.net/accry/article/details/6070626计算几何题目推荐:http://blog.csdn.net/accry/article/details/6070656先是计算几何入门题推荐:计算几何题的特点与做题要领:1.大部分不会很难,少部分题目思路很 巧妙2.做计算几何题目,模板很重要,模板必须高度可靠。3.要注意代码的组织,因为计算几何的题目很容易上两百行代码,里面大部分是模 板。如果代码一片混乱,那么会严重影响做题正确率。4.注意精度控制。5.能用整数的地方尽量用整数,要想到扩大数据的方法(扩大一倍, 或扩大sqrt2)。因
阅读全文
摘要:不完整,待补充#include #include #include using namespace std;const double eps = 1e-10;struct Point{ double x, y; Point( double x = 0, double y = 0 ):x(x), y(y) { }};typedef Point Vector;Vector operator+( Vector A, Vector B ) //向量加{ return Vector( A.x + B.x, A.y + B.y );}Vector operator-( Vec...
阅读全文