几何acm.docx
《几何acm.docx》由会员分享,可在线阅读,更多相关《几何acm.docx(182页珍藏版)》请在冰豆网上搜索。
![几何acm.docx](https://file1.bdocx.com/fileroot1/2022-11/19/24f1886e-997a-4f7b-bb60-b526c98c8c7d/24f1886e-997a-4f7b-bb60-b526c98c8c7d1.gif)
几何acm
(1)几何公式
【三角形】:
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
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)pi+pi-beta;
相等应该是
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)结果的意义:
正:
在顺时针(0,pi)内
负:
在逆时针(0,pi)内
0:
,共线,夹角为0或pi
(2)ComputationalGeometry2008
#include
#include
#include
#include
#include
#include
usingnamespacestd;
#defineeps1e-6
#definepiacos(-1)
#defineMaxNode1000
#definesqr(a)((a)*(a))
#defineIsZero(a)(fabs(a)#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)?
(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.xmin(p2.x,p3.x)
&&p1.ymin(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;
return0;
}
intisIntersected