算法总结之几何模板

一 几何公式

三角形:

  1. 半周长 P=(a+b+c)/2

  2. 面积 S=aHa/2=absin(C)/2=sqrt(P(P-a)(P-b)(P-c))

  3. 中线 Ma=sqrt(2(b^2+c^2)-a^2)/2=sqrt(b^2+c^2+2bccos(A))/2

  4. 角平分线 Ta=sqrt(bc((b+c)^2-a^2))/(b+c)=2bccos(A/2)/(b+c)

  5. 高线 Ha=bsin(C)=csin(B)=sqrt(b^2-((a^2+b^2-c^2)/(2a))^2)

  6. 内切圆半径 r=S/P=asin(B/2)sin(C/2)/sin((B+C)/2)

    =4Rsin(A/2)sin(B/2)sin(C/2)=sqrt((P-a)(P-b)(P-c)/P)

    =Ptan(A/2)tan(B/2)tan(C/2)

  7. 外接圆半径 R=abc/(4S)=a/(2sin(A))=b/(2sin(B))=c/(2sin(C))

四边形:

  D1,D2为对角线,M对角线中点连线,A为对角线夹角

    1. a^2+b^2+c^2+d^2=D1^2+D2^2+4M^2

    2. S=D1D2sin(A)/2

    (以下对圆的内接四边形)

    3. ac+bd=D1D2

    4. S=sqrt((P-a)(P-b)(P-c)(P-d)),P为半周长

  正n边形:

  R为外接圆半径,r为内切圆半径

    1. 中心角 A=2PI/n

    2. 内角 C=(n-2)PI/n

    3. 边长 a=2sqrt(R^2-r^2)=2Rsin(A/2)=2rtan(A/2)

    4. 面积 S=nar/2=nr^2tan(A/2)=nR^2sin(A)/2=na^2/(4tan(A/2))

圆:

  1. 弧长 l=rA

  2. 弦长 a=2sqrt(2hr-h^2)=2rsin(A/2)

  3. 弓形高 h=r-sqrt(r^2-a^2/4)=r(1-cos(A/2))=atan(A/4)/2

  4. 扇形面积 S1=rl/2=r^2A/2

  5. 弓形面积 S2=(rl-a(r-h))/2=r^2(A-sin(A))/2

棱柱:

  1. 体积 V=Ah,A为底面积,h为高

  2. 侧面积 S=lp,l为棱长,p为直截面周长

  3. 全面积 T=S+2A

棱锥:

  1. 体积 V=Ah/3,A为底面积,h为高

  (以下对正棱锥)

  2. 侧面积 S=lp/2,l为斜高,p为底面周长

  3. 全面积 T=S+A

棱台:

  1. 体积 V=(A1+A2+sqrt(A1A2))h/3,A1.A2为上下底面积,h为高

  (以下为正棱台)

  2. 侧面积 S=(p1+p2)l/2,p1.p2为上下底面周长,l为斜高

  3. 全面积 T=S+A1+A2

圆柱:

  1. 侧面积 S=2PIrh

  2. 全面积 T=2PIr(h+r)

  3. 体积 V=PIr^2h

圆锥:

  1. 母线 l=sqrt(h^2+r^2)

  2. 侧面积 S=PIrl

  3. 全面积 T=PIr(l+r)

  4. 体积 V=PIr^2h/3

圆台:

  1. 母线 l=sqrt(h^2+(r1-r2)^2)

  2. 侧面积 S=PI(r1+r2)l

  3. 全面积 T=PIr1(l+r1)+PIr2(l+r2)

  4. 体积 V=PI(r1^2+r2^2+r1r2)h/3

球:

  1. 全面积 T=4PIr^2

  2. 体积 V=4PIr^3/3

球台:

  1. 侧面积 S=2PIrh

  2. 全面积 T=PI(2rh+r1^2+r2^2)

  3. 体积 V=PIh(3(r1^2+r2^2)+h^2)/6

球扇形:

  1. 全面积 T=PIr(2h+r0),h为球冠高,r0为球冠底面半径

  2. 体积 V=2PIr^2h/3

 二 几何模板

  1.Point结构体

1 struct point
2 {
3     double x;
4     double y;
5 }

  2.叉乘:

1 /*p0为公共点*/
2 double xmult(Point p1,Point p2,Point p0){
3     return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
4 }

  3.两点距离:

1 double dis(point p1,point p2){
2     return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
3 }

  4.Graham算法求凸包时点的排序cmp:

1 bool cmp(point a,point b)
2 {
3     if (CrossMul(a,b,p[1])>0 ||
4             (CrossMul(a,b,p[1])==0&&dis(a,p[1])<dis(b,p[1]))) return true;
5     return false;
6 }

  5.凸包:1)两点的最远距离2)面积3)周长

 1 int main()
 2 {
 3     int n,i,j,top;
 4     while (cin>>n)
 5     {
 6         for (i=1; i<=n; i++)
 7         {
 8             cin>>p[i].x>>p[i].y;
 9             if (p[i].y<p[1].y||(p[i].y==p[1].y && p[i].x<p[1].x))
10                 swap(p[1],p[i]);
11         }
12         sort(p+2,p+n+1,cmp);
13         top=0;
14         q[++top]=p[1];
15         q[++top]=p[2];
16         for (i=3; i<=n; i++)
17         {
18             while (top>1 && CrossMul(q[top],p[i],q[top-1])<0) top--;
19             q[++top]=p[i];
20         }
21         /*凸包直径*/
22         int max=INT_MIN;
23         for (int i=1;i<=top;i++)
24             for (int j=1;j<i;j++)
25                 max=max>dis_2(q[i],q[j])?max:dis_2(q[i],q[j]);
26         printf("%d\n",max);
27         /*凸包面积*/
28         int area=0;
29         for (int i=2;i<=top;i++)
30             area+=CrossMul(q[i],q[i+1],q[1]);
31         printf("%d\n",abs(area));
32         /*凸包周长*/
33         double sum=dis(q[1],q[2]);
34         for (i=3; i<=top; i++)
35             sum+=dis(q[i],q[i-1]);
36         sum+=dis(q[1],q[top]);
37         printf("%d",sum);
38     }
39     return 0;
40 }

(未完待续)

算法总结之几何模板

时间: 2024-11-03 21:26:24

算法总结之几何模板的相关文章

【几何模板加点小思路】hdu-4998 Rotate

用几何模板敲的,也有直接公式推的,追求短代码的可以点右上角小红了...... 题意就是想想一个物体分别做绕某一点(给出坐标)旋转p度(给出角度)后,其位置等价于绕哪一点旋转多少度,输出该等价点及其等价角度. 其实就是找两个定点,然后看这两个定点旋转后到了哪,分别连接原点与旋转后的点会得到两条线段,两条线段垂直平分线的交点即是等价后绕其旋转的点,再将该交点与任一原点及其旋转后的点连接得到的夹角(咖啡色角)即等价后的旋转角度. 附代码 1 #include <cstdio> 2 #include

LA 4127 - The Sky is the Limit (离散化 扫描线 几何模板)

题目链接 非原创 原创地址:http://blog.csdn.net/jingqi814/article/details/26117241 题意:输入n座山的信息(山的横坐标,高度,山底宽度),计算他们的轮廓线, 即露出来的表面边长,有些山是重叠的不计.空白地带不计,每座山都是等腰三角形. 分析:大白书P414页. 求小山的总长度,用一些虚线将其离散化,分成一段一段的,特征点:山脚,山顶,交点.这样就能保 证相邻两个扫描点之间再无交点.然后一最上面的点就是分割点,维护上一个点lastp即可. 1

几何模板总结——算法竞赛入门经典(第二版)

1 #include <iostream> 2 #include <string> 3 #include <cstdio> 4 #include <cstring> 5 #include <cmath> 6 #include <vector> 7 #include <algorithm> 8 9 using namespace std; 10 11 const double PI = acos(-1); 12 13 str

匈牙利算法 二分图最大匹配题模板

[任务] 给定一个二分图,用匈牙利算法求这个二分图的最大匹配数. [说明] 求最大匹配,那么我们希望每一个在左边的点都尽量找到右边的一个点和它匹配. 我们一次枚举左边的点x的所有出边指向的点y, 若y之前没有被匹配,那么(x,y)就是一对合法的匹配,我们将匹配数加一, 否则我们试图给原来匹配的y和x'重新找一个匹配,如果x'匹配成功,那么(x,y)就可以新增为一对合法的匹配. 给x'寻找匹配的过程可以递归解决. [接口] int hungary(); 复杂度O(|E|*sqrt(|V|)) 输入

最短路的几种算法及其优化(模板)

一.Dijkstra 算法 dijkstra算法适用于边权为正的情况,求单源最短路,适用于有向图和无向图 模板伪代码: 清除所有点的标号 设d[0]=0,其余d[i]=INF: 循环n次{ 在所有未标记的节点中,寻找d[i]最小的点x 给x做标记 对于从x出发的所有边(x,y)更新d[y]=min(d[y],d[x]+w[x,y]); } memset(v,0,sizeof(v)); for(int i=0;i<n;++i) d[i]=(i==0?0:INF); for(int i=0;i<n

HDU 5120 Intersection(几何模板题)

题意:给定两个圆环,求两个圆环相交的面积. 思路:由于圆心和半径不一样,分了好多种情况,后来发现只要把两个圆相交的函数写好之后就不需要那么复杂了.两个圆相交的面积的模板如下: double area_of_overlap(point c1, double r1, point c2, double r2) { double d = dist(c1, c2); if (sgn(d - r1 - r2) >= 0) return 0; if (sgn(fabs(r1 - r2) - d) >= 0)

【kmp算法】【Rabin-Karp算法】[BeiJing2011]矩阵模板

算法就不说了,反正是基于字符串匹配的.这里比较一下kmp和Rabin-Karp算法. <法一>kmp算法. 592788 lizitong 2462 Accepted 4828 kb 680 ms C++/Edit 2349 B 2014-03-29 19:07:02 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m,a,b,q; char

dinic 算法 基本思想及其模板

“网络流博大精深”—sideman语 一个基本的网络流问题 感谢WHD的大力支持 最早知道网络流的内容便是最大流问题,最大流问题很好理解: 解释一定要通俗! 如右图所示,有一个管道系统,节点{1,2,3,4},有向管道{A,B,C,D,E},即有向图一张. [1]是源点,有无限的水量,[4]是汇点,管道容量如图所示.试问[4]点最大可接收的水的流量? 这便是简单的最大流问题,显然[4]点的最大流量为50 死理性派请注意:流量是单位时间内的,总可以了吧! 然而对于复杂图的最大流方法是什么呢,有E

最短路算法总结(*【模板】)

1.Dijkstra算法(计算正权图上的单源最短路  single-source shortest paths (sssp) )从单个节点出发到所有节点的最短路. 该算法适用于:有向图和无向图. 1). O(n^2)的实现:邻接矩阵map存储实现,INF表示无穷大 void Dijkstra(int s, int e, int n) //从s开始到e点的最短路,有n个节点,编号:0-->n-1. { memset(vis, 0, sizeof(vis)); int i, j; for(i=0;