几何模板Word文件下载.docx
- 文档编号:21041995
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:92
- 大小:45.27KB
几何模板Word文件下载.docx
《几何模板Word文件下载.docx》由会员分享,可在线阅读,更多相关《几何模板Word文件下载.docx(92页珍藏版)》请在冰豆网上搜索。
#include<
stdio.h>
stdlib.h>
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<
n;
i++){
if(p[i].y==p[u].y&
p[i].x<
p[u].x)u=i;
elseif(p[i].y<
p[u].y)u=i;
}
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;
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);
=ca;
n);
for(j=0;
j<
j++){
%d%d"
p[j].x,&
p[j].y);
Graham(p,n,stack,top);
area=0;
for(j=1;
=top-1;
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*/
math.h>
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)<
eps)printf("
x^2"
);
elseif(circle.centre.x<
0)printf("
(x-%.3lf)^2+"
-circle.centre.x);
elseprintf("
(x+%.3lf)^2+"
circle.centre.x);
if(fabs(circle.centre.y)<
y^2="
elseif(circle.centre.y<
(y-%.3lf)^2="
-circle.centre.y);
(y+%.3lf)^2="
circle.centre.y);
%.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;
x^2+y^2"
//if(fabs(c)<
eps)
if(c<
-%.3lfx"
-c);
+%.3lfx"
c);
if(d<
-%.3lfy"
-d);
+%.3lfy"
d);
if(e<
-%.3lf=0\n"
-e);
+%.3lf=0\n"
e);
\n"
}
(4)三角形的垂心内心重心中垂线
/*cug_1011_垂心内心重心中垂线.cpp*/
iostream>
cmath>
usingnamespacestd;
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;
%.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;
pointLineInter(TLinel1,TLinel2)
//求两直线得交点坐标
if(fabs(l1.b)<
eps){
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;
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){
%.3lf"
b+c);
return;
elseif(B-2*M_PI/3>
a+c);
elseif(C-2*M_PI/3>
a+b);
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);
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);
ans);
voidG(doublea,doubleb,doublec,doubleA,doubleB,doubleC)
//中线的交点
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*2/3);
voidO(doublea,doubleb,doublec,doubleA,doubleB,doubleC)
doublet=(A+C-B)/2;
3*b/2/cos(t));
inti,ca;
doubleA,B,C;
cin>
>
ca;
i++){
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);
============================================================================================--------------------------------------------------------------------------------------------
(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;
tmp.x=(c1*b2-b1*c2)/(b1*a2-b2*a1);
tmp.y=(-c1-a1*tmp.x)/b1;
//cout<
<
"
交点坐标"
<
endl;
a1*tmp.x+b1*tmp.y+c1<
a2*tmp.x+b2*tmp.y+c2<
(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)<
eps)other.x=2.0;
elseif(fabs(ky)<
other.x=mid.x;
other.y=1.0;
if(fabs(other.y-mid.y)<
eps)other.y=2.0;
else{
doublek
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 几何 模板