几何acm文档格式.docx
《几何acm文档格式.docx》由会员分享,可在线阅读,更多相关《几何acm文档格式.docx(182页珍藏版)》请在冰豆网上搜索。
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
【球台】:
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
Euler的任意四面体体积公式(已知边长求体积)
已知4点坐标求体积(其中四个点的坐标分别为(x1,y1,z1),(x2,y2,z2),(x3,y3,z3),(x4,y4,z4)
)
注意事项:
1.注意舍入方式(0.5的舍入方向);
防止输出-0.
2.几何题注意多测试不对称数据.
3.整数几何注意xmult和dmult是否会出界;
符点几何注意eps的使用.
4.避免使用斜率;
注意除数是否会为0.
5.公式一定要化简后再代入.
6.判断同一个2*PI域内两角度差应该是
abs(a1-a2)<
beta||abs(a1-a2)>
pi+pi-beta;
相等应该是
eps||abs(a1-a2)>
pi+pi-eps;
7.需要的话尽量使用atan2,注意:
atan2(0,0)=0,
atan2(1,0)=pi/2,atan2(-1,0)=-pi/2,atan2(0,1)=0,atan2(0,-1)=pi.
8.crossproduct=|u|*|v|*sin(a)
dotproduct=|u|*|v|*cos(a)
9.(P1-P0)x(P2-P0)结果的意义:
正:
<
P0,P1>
在<
P0,P2>
顺时针(0,pi)内
负:
逆时针(0,pi)内
0:
<
共线,夹角为0或pi
(2)ComputationalGeometry2008
#include<
math.h>
stdio.h>
stdlib.h>
string.h>
iostream>
algorithm>
usingnamespacestd;
#defineeps1e-6
#definepiacos(-1)
#defineMaxNode1000
#definesqr(a)((a)*(a))
#defineIsZero(a)(fabs(a)<
eps)
#definesame(a,b)(fabs((a)-(b))<
#definedot(a,b)(a.x*b.x+a.y*b.y)
#definemax(a,b)((a)>
(b)?
(a):
(b))
#definemin(a,b)((a)<
(b))
#definecross(a,b)(a.x*b.y-a.y*b.x)
#defineleft(a,b,c)(multi(a,b,c)>
0)
#definetriArea(a,b,c)(fabs(multi(a,b,c)/2))
#definePointInCircle2(p,c)(dis2(p,c.center)<
=c.r)
#definedis2(a,b)sqrt(sqr(a.x-b.x)+sqr(a.y-b.y))
#definedis3(a,b)sqrt(sqr(a.x-b.x)+sqr(a.y-b.y)+sqr(a.z-b.z))
#definemulti(a,b,c)(((double)b.x-a.x)*(c.y-a.y)-((double)c.x-a.x)*(b.y-a.y))
structpoint
{
doublex,y;
pointoperator-(point&
a)
{
pointb;
b.x=x-a.x;
b.y=y-a.y;
returnb;
}
};
structline
doublea,b,c;
structcircle
pointcenter;
doubler;
structpolygon
intn;
pointp[MaxNode];
doublepolygonArea(polygonpoly)
//已知多边形各顶点的坐标,求其面积
doublearea=0.0;
intn=poly.n;
for(inti=1;
i<
=n;
i++)
area+=(poly.p[i-1].x*poly.p[i%n].y-poly.p[i%n].x*poly.p[i-1].y);
returnfabs(area)/2;
}
intPointInTriangle(pointp,pointa,pointb,pointc)
returnsame(triArea(a,b,c),triArea(p,a,b)
+triArea(p,b,c)+triArea(p,c,a));
doubleget_angle(pointcenter,pointp)
//以center为原点,p的斜角
pointb=p-center;
doublea;
if(IsZero(b.x))
if(b.y>
0)returnpi/2;
returnpi*3/2;
else
a=atan(b.y/b.x);
if(b.x<
0)a+=pi;
if(a<
0)a+=2*pi;
returna;
}
linelineFromSegment(pointp1,pointp2)
//线段所在直线,返回直线方程的三个系统
linetmp;
tmp.a=p2.y-p1.y;
tmp.b=p1.x-p2.x;
tmp.c=p2.x*p1.y-p1.x*p2.y;
returntmp;
intOn_Segment(pointp1,pointp2,pointp3)
if(p1.x<
max(p2.x,p3.x)&
&
p1.x>
min(p2.x,p3.x)
&
p1.y<
max(p2.y,p3.y)&
p1.y>
min(p2.y,p3.y))return1;
return0;
intisIntersected(points1,pointe1,points2,pointe2)
intd1,d2,d3,d4;
d1=multi(s1,s2,e1);
d2=multi(s1,e1,e2);
d3=multi(s2,s1,e2);
d4=multi(s2,e2,e1);
if(d1*d2>
0&
d3*d4>
0)return1;
if(d1==0&
On_Segment(s2,s1,e1))return1;
if(d2==0&
On_Segment(e2,s1,e1))return1;
if(d3==0&
On_Segment(s1,s2,e2))return1;
if(d4==0&
On_Segment(e1,s2,e2))return1;
intisIntersected