几何模板.docx
- 文档编号:7907493
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:92
- 大小:45.27KB
几何模板.docx
《几何模板.docx》由会员分享,可在线阅读,更多相关《几何模板.docx(92页珍藏版)》请在冰豆网上搜索。
几何模板
大几何模板
大几何模板1
(1)凸包2
(2)判断两条线段是否相交(平行,不平行)4
(3)三角形的外接圆(已知不在同一直线上的三点求经过三点的圆)4
(4)三角形的垂心内心重心中垂线6
(5)求直线的交点10
(6)根据线段两端点的坐标求垂直平分线上除中点外的另一点11
(7)根据两点坐标求直线方程11
(8)差积的应用12
(9)三角形的面积公式12
(10)三角形的内接圆12
(11)多边形的面积(适合凹多边形)13
(12)判断点是否在线段上14
(13)平面上两个点之间的距离14
(14)p点关于直线L的对称点14
(15)判断一个矩形是否在另一个矩形中15
(16)直线和圆的交点+点关于线的对称点+点到线的距离+直线方程16
(17)判断点是否在多边形内21
(18)N点中三个点组成三角形面积最大28
(19)扇形的重心31
(20)多边形的重心32
(21)判断N点是否共面33
(22)求共线的点最多为多少34
(23)N个矩形的相交的面积36
(24)三角形外接圆+圆的参数方程38
(25)判断线段是否有交点并求交点43
(26)简单多边形的核46
(27)线段重叠+投影50
(28)二分+圆的参数方程53
(29)Pick公式54
(30)根据经度纬度求球面距离56
(31)两圆切线的交点58
(31)两圆切线的交点(32)线段与三角形的交60
(33)最近最远点对68
------------------------------------------------------------------------------------------------------------------------------------------
(1)凸包
/*凸包cug_1038*/
#include
#include
structpoint
{
intx,y;
}pp;
pointp[100005];
intstack[100005],top;
intdis(pointa,pointb)
{
return((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
intmulti(pointb,pointc,pointa)
{
return(b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
}
voidswap(pointp[],ints,intt)
{
pointtmp;
tmp=p[s];
p[s]=p[t];
p[t]=tmp;
}
intcmp(constvoid*a,constvoid*b)
{
point*c=(point*)a;
point*d=(point*)b;
doublek=multi(*c,*d,pp);
if(k<0)return1;
elseif(k==0&&dis(*c,pp)>=dis(*d,pp))return1;
elsereturn-1;
}
voidGraham(pointp[],intn,intstack[],int&top)
{
inti,u;
u=0;
for(i=1;i if(p[i].y==p[u].y&&p[i].x elseif(p[i].y } swap(p,0,u); pp=p[0]; qsort(p+1,n-1,sizeof(p[0]),cmp); stack[0]=0; stack[1]=1; top=1; for(i=2;i while(multi(p[i],p[stack[top]],p[stack[top-1]])>=0){ if(top==0)break; top--; } top++; stack[top]=i; } } intmain() { intca,i,j,n; intarea; scanf("%d",&ca); for(i=1;i<=ca;i++){ scanf("%d",&n); for(j=0;j scanf("%d%d",&p[j].x,&p[j].y); } Graham(p,n,stack,top); area=0; for(j=1;j<=top-1;j++){ area+=abs(multi(p[stack[0]],p[stack[j]],p[stack[j+1]])); } printf("%.1lf\n",(double)area/2); } return0; } --------------------------------------------------------------------------------------------------------------------- (2)判断两条线段是否相交(平行,不平行) boolisIntersected(TPoints1,TPointe1,TPoints2,TPointe2) { //判断线段是否相交 //1.快速排斥试验判断以两条线段为对角线的两个矩形是否相交 //2.跨立试验 if( (max(s1.x,e1.x)>=min(s2.x,e2.x))&& (max(s2.x,e2.x)>=min(s1.x,e1.x))&& (max(s1.y,e1.y)>=min(s2.y,e2.y))&& (max(s2.y,e2.y)>=min(s1.y,e1.y))&& (multi(s2,e1,s1)*multi(e1,e2,s1)>=0)&& (multi(s1,e2,s2)*multi(e2,e1,s2)>=0) )returntrue; returnfalse; } (3)三角形的外接圆(已知不在同一直线上的三点求经过三点的圆) /*三角形的外接圆pku_1329*/ #include #include constdoubleeps=1e-6; typedefstructTPoint { doublex; doubley; }TPoint; typedefstructTTriangle { TPointt[3]; }TTriangle; typedefstructTCircle { TPointcentre; doubler; }TCircle; doubledistance(TPointp1,TPointp2) { //计算平面上两个点之间的距离 returnsqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)); } doubletriangleArea(TTrianglet) { //已知三角形三个顶点的坐标,求三角形的面积 returnfabs(t.t[0].x*t.t[1].y+t.t[1].x*t.t[2].y+t.t[2].x*t.t[0].y -t.t[1].x*t.t[0].y-t.t[2].x*t.t[1].y-t.t[0].x*t.t[2].y)/2; } TCirclecircumcircleOfTriangle(TTrianglet) { //三角形的外接圆 TCircletmp; doublea,b,c,c1,c2; doublexA,yA,xB,yB,xC,yC; a=distance(t.t[0],t.t[1]); b=distance(t.t[1],t.t[2]); c=distance(t.t[2],t.t[0]); //根据S=a*b*c/R/4;求半径R tmp.r=a*b*c/triangleArea(t)/4; xA=t.t[0].x;yA=t.t[0].y; xB=t.t[1].x;yB=t.t[1].y; xC=t.t[2].x;yC=t.t[2].y; c1=(xA*xA+yA*yA-xB*xB-yB*yB)/2; c2=(xA*xA+yA*yA-xC*xC-yC*yC)/2; tmp.centre.x=-(c1*(yA-yC)-c2*(yA-yB))/ ((xA-xB)*(yA-yC)-(xA-xC)*(yA-yB)); tmp.centre.y=-(c1*(xA-xC)-c2*(xA-xB))/ ((yA-yB)*(xA-xC)-(yA-yC)*(xA-xB)); returntmp; } intmain() { TTrianglet; TCirclecircle; doublec,d,e; while(scanf("%lf%lf%lf%lf%lf%lf",&t.t[0].x,&t.t[0].y, &t.t[1].x,&t.t[1].y,&t.t[2].x,&t.t[2].y)! =EOF){ circle=circumcircleOfTriangle(t); //printf("%lf%lf%lf\n",circle.centre.x,circle.centre.y,circle.r); if(fabs(circle.centre.x) elseif(circle.centre.x<0)printf("(x-%.3lf)^2+",-circle.centre.x); elseprintf("(x+%.3lf)^2+",circle.centre.x); if(fabs(circle.centre.y) elseif(circle.centre.y<0)printf("(y-%.3lf)^2=",-circle.centre.y); elseprintf("(y+%.3lf)^2=",circle.centre.y); printf("%.3lf^2\n",circle.r); c=2*circle.centre.x; d=2*circle.centre.y; e=circle.centre.x*circle.centre.x+ circle.centre.y*circle.centre.y-circle.r*circle.r; printf("x^2+y^2"); //if(fabs(c) if(c<0)printf("-%.3lfx",-c); elseprintf("+%.3lfx",c); if(d<0)printf("-%.3lfy",-d); elseprintf("+%.3lfy",d); if(e<0)printf("-%.3lf=0\n",-e); elseprintf("+%.3lf=0\n",e); printf("\n"); } return0; } (4)三角形的垂心内心重心中垂线 /*cug_1011_垂心内心重心中垂线.cpp*/ #include #include usingnamespacestd; constdoubleeps=1e-6; structpoint { doublex,y; }; voidK() { //到三边距离和最短 } voidL(doublea,doubleb,doublec,doubleA,doubleB,doubleC) {//垂线的交点 doublet1,t2,t3; t1=c*cos(A)/cos(M_PI/2-C); t2=c*cos(B)/cos(M_PI/2-C); t3=a*cos(C)/cos(M_PI/2-A); t1+=t2+t3; printf("%.3lf\n",t1); } structTLine { doublea,b,c; }; TLinelineFromSegment(pointp1,pointp2) { //线段所在直线,返回直线方程的三个系统 TLinetmp; tmp.a=p2.y-p1.y; tmp.b=p1.x-p2.x; tmp.c=p2.x*p1.y-p1.x*p2.y; returntmp; } pointLineInter(TLinel1,TLinel2) { //求两直线得交点坐标 pointtmp; if(fabs(l1.b) tmp.x=-l1.c/l1.a; tmp.y=(-l2.c-l2.a*tmp.x)/l2.b; } else{ tmp.x=(l1.c*l2.b-l1.b*l2.c)/(l1.b*l2.a-l2.b*l1.a); tmp.y=(-l1.c-l1.a*tmp.x)/l1.b; } returntmp; } doubledis(pointa,pointb) { returnsqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)); } voidF(doublea,doubleb,doublec,doubleA,doubleB,doubleC) { //到三顶点的距离和最短,费马点 /*当三角形最大的顶角小于120度的时候,三角形内一点到 三顶点之间的距离最小是与三顶点夹角都成120度的点P当 最到顶点大于等于120度,该顶点取最小值 补充一下,当三角形的最大角小于120度时,费尔码点在三 角形内,作法有多种,可以从任二办向外作等边三角形,联 接正三角形的顶点和原三角形的对角,两者的联线即所求。 当三角形的最大角大于等于120度时, 费尔码点在三角形的钝角上。 */ if(A-2*M_PI/3>-eps){ printf("%.3lf",b+c); return; } elseif(B-2*M_PI/3>-eps){ printf("%.3lf",a+c); return; } elseif(C-2*M_PI/3>-eps){ printf("%.3lf",a+b); return; } pointpa,pb,pc,pc1,pa1; pa.x=0,pa.y=0; pb.x=c,pb.y=0; pc.x=b*cos(A); pc.y=b*sin(A); pc1.x=c*cos(-M_PI/3); pc1.y=c*sin(-M_PI/3); pa1.x=a*cos(2*M_PI/3-B)+c; pa1.y=a*sin(2*M_PI/3-B); TLinel1,l2; l1=lineFromSegment(pa,pa1); l2=lineFromSegment(pc,pc1); pointf=LineInter(l1,l2); printf("%.3lf",dis(pa,f)+dis(pb,f)+dis(pc,f)); } voidI(doublea,doubleb,doublec,doubleA,doubleB,doubleC) { //角平分线的交点到三顶点的距离和 doublet,ans; t=(a+b-c)/2; ans=t/cos(C/2)+(b-t)/cos(A/2)+(a-t)/cos(B/2); printf("%.3lf",ans); } voidG(doublea,doubleb,doublec,doubleA,doubleB,doubleC) { //中线的交点 doublet1,t2,t3; t1=sqrt((b/2)*(b/2)+a*a-2*a*b/2*cos(C)); t2=sqrt((a/2)*(a/2)+c*c-2*a*c/2*cos(B)); t3=sqrt((c/2)*(c/2)+b*b-2*b*c/2*cos(A)); t1+=t2+t3; printf("%.3lf",t1*2/3); } voidO(doublea,doubleb,doublec,doubleA,doubleB,doubleC) {//垂线的交点 doublet=(A+C-B)/2; printf("%.3lf\n",3*b/2/cos(t)); } intmain() { inti,ca; doublea,b,c; doubleA,B,C; cin>>ca; for(i=1;i<=ca;i++){ cin>>a>>b>>c; A=(b*b+c*c-a*a)/2/b/c; B=(a*a+c*c-b*b)/2/a/c; C=(a*a+b*b-c*c)/2/a/b; A=acos(A),B=acos(B),C=acos(C); F(a,b,c,A,B,C); I(a,b,c,A,B,C); G(a,b,c,A,B,C); O(a,b,c,A,B,C); } return0; } ============================================================================================-------------------------------------------------------------------------------------------- (5)求直线的交点 /*求直线的交点,注意平形的情况无解,避免RE*/ TPointLineInter(TLinel1,TLinel2) { //求两直线得交点坐标 TPointtmp; doublea1=l1.a; doubleb1=l1.b; doublec1=l1.c; doublea2=l2.a; doubleb2=l2.b; doublec2=l2.c; //注意这里b1=0 if(fabs(b1) tmp.x=-c1/a1; tmp.y=(-c2-a2*tmp.x)/b2; } else{ tmp.x=(c1*b2-b1*c2)/(b1*a2-b2*a1); tmp.y=(-c1-a1*tmp.x)/b1; } //cout<<"交点坐标"< //cout< //cout< returntmp; } (6)根据线段两端点的坐标求垂直平分线上除中点外的另一点 TPointGetOtherPoint(TPointpre,TPointtmp) { /*根据线段两端点的坐标求垂直平分线上除中点外的另一点*/ doublekx,ky; TPointother,mid; mid.x=(pre.x+tmp.x)/2; mid.y=(pre.y+tmp.y)/2; kx=pre.x-tmp.x; ky=pre.y-tmp.y; if(fabs(kx) other.y=mid.y; other.x=1.0; if(fabs(other.x-mid.x) } elseif(fabs(ky) other.x=mid.x; other.y=1.0; if(fabs(other.y-mid.y) } else{ doublek
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 几何 模板