zoukankan      html  css  js  c++  java
  • 算法总结之几何模板

    一 几何公式

    三角形:

      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
    ",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
    ",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 }

    (未完待续)

  • 相关阅读:
    git clone GitLab 工程报错Repository not found
    vue + Element-ui 实现分页
    Element-ui 实现table的合计功能
    python 使用UUID库生成唯一ID
    css 设置overflow:scroll 滚动条的样式
    下载css-loader 安装及使用
    vue实现首页导航切换不同路由的方式(二)【使用vuex实现的】
    vue实现随机验证码功能
    vue实现首页导航切换不同路由的方式
    vue实现菜单切换
  • 原文地址:https://www.cnblogs.com/Enumz/p/3885871.html
Copyright © 2011-2022 走看看