国际大学生程序设计竞赛计算几何源码Word下载.docx

上传人:b****4 文档编号:8008666 上传时间:2023-05-09 格式:DOCX 页数:98 大小:41.24KB
下载 相关 举报
国际大学生程序设计竞赛计算几何源码Word下载.docx_第1页
第1页 / 共98页
国际大学生程序设计竞赛计算几何源码Word下载.docx_第2页
第2页 / 共98页
国际大学生程序设计竞赛计算几何源码Word下载.docx_第3页
第3页 / 共98页
国际大学生程序设计竞赛计算几何源码Word下载.docx_第4页
第4页 / 共98页
国际大学生程序设计竞赛计算几何源码Word下载.docx_第5页
第5页 / 共98页
国际大学生程序设计竞赛计算几何源码Word下载.docx_第6页
第6页 / 共98页
国际大学生程序设计竞赛计算几何源码Word下载.docx_第7页
第7页 / 共98页
国际大学生程序设计竞赛计算几何源码Word下载.docx_第8页
第8页 / 共98页
国际大学生程序设计竞赛计算几何源码Word下载.docx_第9页
第9页 / 共98页
国际大学生程序设计竞赛计算几何源码Word下载.docx_第10页
第10页 / 共98页
国际大学生程序设计竞赛计算几何源码Word下载.docx_第11页
第11页 / 共98页
国际大学生程序设计竞赛计算几何源码Word下载.docx_第12页
第12页 / 共98页
国际大学生程序设计竞赛计算几何源码Word下载.docx_第13页
第13页 / 共98页
国际大学生程序设计竞赛计算几何源码Word下载.docx_第14页
第14页 / 共98页
国际大学生程序设计竞赛计算几何源码Word下载.docx_第15页
第15页 / 共98页
国际大学生程序设计竞赛计算几何源码Word下载.docx_第16页
第16页 / 共98页
国际大学生程序设计竞赛计算几何源码Word下载.docx_第17页
第17页 / 共98页
国际大学生程序设计竞赛计算几何源码Word下载.docx_第18页
第18页 / 共98页
国际大学生程序设计竞赛计算几何源码Word下载.docx_第19页
第19页 / 共98页
国际大学生程序设计竞赛计算几何源码Word下载.docx_第20页
第20页 / 共98页
亲,该文档总共98页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

国际大学生程序设计竞赛计算几何源码Word下载.docx

《国际大学生程序设计竞赛计算几何源码Word下载.docx》由会员分享,可在线阅读,更多相关《国际大学生程序设计竞赛计算几何源码Word下载.docx(98页珍藏版)》请在冰点文库上搜索。

国际大学生程序设计竞赛计算几何源码Word下载.docx

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=-kx/ky;

other.y=mid.y+k*(other.x-mid.x);

returnother;

(7)根据两点坐标求直线方程

TLinelineFromSegment(TPointp1,TPointp2)

(8)差积的应用

doublemulti(TPointp1,TPointp2,TPointp0)

//求矢量[p0,p1],[p0,p2]的叉积

//p0是顶点

return(p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);

//若结果等于0,则这三点共线

//若结果大于0,则p0p2在p0p1的逆时针方向

//若结果小于0,则p0p2在p0p1的顺时针方向

/*

折线的拐向的判断(从p0向p1看过去的左边)

若(p2-p1)叉乘(p1-p0)<

0,则p0p1在p1点拐向左侧后得到p1p2

若(p2-p1)叉乘(p1-p0)=0,则p0,p1,p2三点共线

若(p2-p1)叉乘(p1-p0)>

0,则p0p1在p1点拐向右侧后得到p1p2

(9)三角形的面积公式

//角形面积的计算

//S=ah/2

//S=absinC/2

//S=sqrt(p*(p-a)*(p-b)*(p-c)),p=(a+b+c)/2

//S=abc/R/4

doubletriangleArea(TPointt[])

returnfabs

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 预防医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2