三维计算几何Word格式.docx

上传人:b****6 文档编号:19040125 上传时间:2023-01-03 格式:DOCX 页数:88 大小:71.83KB
下载 相关 举报
三维计算几何Word格式.docx_第1页
第1页 / 共88页
三维计算几何Word格式.docx_第2页
第2页 / 共88页
三维计算几何Word格式.docx_第3页
第3页 / 共88页
三维计算几何Word格式.docx_第4页
第4页 / 共88页
三维计算几何Word格式.docx_第5页
第5页 / 共88页
点击查看更多>>
下载资源
资源描述

三维计算几何Word格式.docx

《三维计算几何Word格式.docx》由会员分享,可在线阅读,更多相关《三维计算几何Word格式.docx(88页珍藏版)》请在冰豆网上搜索。

三维计算几何Word格式.docx

10.误差限缺省使用1e-8!

1.2几何公式

三角形:

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

球台:

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.3多边形

#include<

stdlib.h>

math.h>

#defineMAXN1000

#defineoffset10000

#defineeps1e-8

#definezero(x)(((x)>

0?

(x):

-(x))<

eps)

#define_sign(x)((x)>

eps?

1:

((x)<

-eps?

2:

0))

structpoint{doublex,y;

};

structline{pointa,b;

doublexmult(pointp1,pointp2,pointp0){

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

}

//判定凸多边形,顶点按顺时针或逆时针给出,允许相邻边共线

intis_convex(intn,point*p){

inti,s[3]={1,1,1};

for(i=0;

i<

n&

&

s[1]|s[2];

i++)

s[_sign(xmult(p[(i+1)%n],p[(i+2)%n],p[i]))]=0;

returns[1]|s[2];

//判定凸多边形,顶点按顺时针或逆时针给出,不允许相邻边共线

intis_convex_v2(intn,point*p){

s[0]&

returns[0]&

//判点在凸多边形内或多边形边上,顶点按顺时针或逆时针给出

intinside_convex(pointq,intn,point*p){

s[_sign(xmult(p[(i+1)%n],q,p[i]))]=0;

//判点在凸多边形内,顶点按顺时针或逆时针给出,在多边形边上返回0

intinside_convex_v2(pointq,intn,point*p){

//判点在任意多边形内,顶点按顺时针或逆时针给出

//on_edge表示点在多边形边上时的返回值,offset为多边形坐标上限

intinside_polygon(pointq,intn,point*p,inton_edge=1){

pointq2;

inti=0,count;

while(i<

n)

for(count=i=0,q2.x=rand()+offset,q2.y=rand()+offset;

n;

if(zero(xmult(q,p[i],p[(i+1)%n]))&

(p[i].x-q.x)*(p[(i+1)%n].x-q.x)<

eps&

(p[i].y-q.y)*(p[(i+1)%n].y-q.y)<

returnon_edge;

elseif(zero(xmult(q,q2,p[i])))

break;

elseif(xmult(q,p[i],q2)*xmult(q,p[(i+1)%n],q2)<

-eps&

xmult(p[i],q,p[(i+1)%n])*xmult(p[i],q2,p[(i+1)%n])<

-eps)

count++;

returncount&

1;

inlineintopposite_side(pointp1,pointp2,pointl1,pointl2){

returnxmult(l1,p1,l2)*xmult(l1,p2,l2)<

-eps;

inlineintdot_online_in(pointp,pointl1,pointl2){

returnzero(xmult(p,l1,l2))&

(l1.x-p.x)*(l2.x-p.x)<

(l1.y-p.y)*(l2.y-p.y)<

eps;

//判线段在任意多边形内,顶点按顺时针或逆时针给出,与边界相交返回1

intinside_polygon(pointl1,pointl2,intn,point*p){

pointt[MAXN],tt;

inti,j,k=0;

if(!

inside_polygon(l1,n,p)||!

inside_polygon(l2,n,p))

return0;

if(opposite_side(l1,l2,p[i],p[(i+1)%n])&

opposite_side(p[i],p[(i+1)%n],l1,l2))

return0;

elseif(dot_online_in(l1,p[i],p[(i+1)%n]))

t[k++]=l1;

elseif(dot_online_in(l2,p[i],p[(i+1)%n]))

t[k++]=l2;

elseif(dot_online_in(p[i],l1,l2))

t[k++]=p[i];

k;

for(j=i+1;

j<

j++){

tt.x=(t[i].x+t[j].x)/2;

tt.y=(t[i].y+t[j].y)/2;

if(!

inside_polygon(tt,n,p))

return0;

}

return1;

pointintersection(lineu,linev){

pointret=u.a;

doublet=((u.a.x-v.a.x)*(v.a.y-v.b.y)-(u.a.y-v.a.y)*(v.a.x-v.b.x))

/((u.a.x-u.b.x)*(v.a.y-v.b.y)-(u.a.y-u.b.y)*(v.a.x-v.b.x));

ret.x+=(u.b.x-u.a.x)*t;

ret.y+=(u.b.y-u.a.y)*t;

returnret;

pointbarycenter(pointa,pointb,pointc){

lineu,v;

u.a.x=(a.x+b.x)/2;

u.a.y=(a.y+b.y)/2;

u.b=c;

v.a.x=(a.x+c.x)/2;

v.a.y=(a.y+c.y)/2;

v.b=b;

returnintersection(u,v);

//多边形重心

pointbarycenter(intn,point*p){

pointret,t;

doublet1=0,t2;

inti;

ret.x=ret.y=0;

for(i=1;

n-1;

if(fabs(t2=xmult(p[0],p[i],p[i+1]))>

eps){

t=barycenter(p[0],p[i],p[i+1]);

ret.x+=t.x*t2;

ret.y+=t.y*t2;

t1+=t2;

if(fabs(t1)>

ret.x/=t1,ret.y/=t1;

1.4多边形切割

//多边形切割

//可用于半平面交

#defineMAXN100

intsame_side(pointp1,pointp2,pointl1,pointl2){

returnxmult(l1,p1,l2)*xmult(l1,p2,l2)>

pointintersection(pointu1,pointu2,pointv1,pointv2){

pointret=u1;

doublet=((u1.x-v1.x)*(v1.y-v2.y)-(u1.y-v1.y)*(v1.x-v2.x))

/((u1.x-u2.x)*(v1.y-v2.y)-(u1.y-u2.y)*(v1.x-v2.x));

ret.x+=(u2.x-u1.x)*t;

ret.y+=(u2.y-u1.y)*t;

//将多边形沿l1,l2确定的直线切割在side侧切割,保证l1,l2,side不共线

voidpolygon_cut(int&

n,point*p,pointl1,pointl2,pointside){

pointpp[MAXN];

intm=0,i;

i++){

if(same_side(p[i],side,l1,l2))

pp[m++]=p[i];

if(!

same_side(p[i],p[(i+1)%n],l1,l2)&

!

(zero(xmult(p[i],l1,l2))&

zero(xmult(p[(i+1)%n],l1,l2))))

pp[m++]=intersection(p[i],p[(i+1)%n],l1,l2);

}

for(n=i=0;

m;

i||!

zero(pp[i].x-pp[i-1].x)||!

zero(pp[i].y-pp[i-1].y))

p[n++]=pp[i];

if(zero(p[n-1].x-p[0].x)&

zero(p[n-1].y-p[0].y))

n--;

if(n<

3)

n=0;

1.5浮点函数

//浮点几何函数库

//计算crossproduct(P1-P0)x(P2-P0)

doublexmult(doublex1,doubley1,doublex2,doubley2,doublex0,doubley0){

return(x1-x0)*(y2-y0)-(x2-x0)*(y1-y0);

//计算dotproduct(P1-P0).(P2-P0)

doubledmult(pointp1,pointp2,pointp0){

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

doubledmult(doublex1,doubley1,doublex2,doubley2,doublex0,doubley0){

return(x1-x0)*(x2-x0)+(y1-y0)*(y2-y0);

//两点距离

doubledistance(pointp1,pointp2){

returnsqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));

doubledistance(doublex1,doubley1,doublex2,doubley2){

returnsqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));

//判三点共线

intdots_inline(pointp1,pointp2,pointp3){

returnzero(xmult(p1,p2,p3));

intdots_inline(doublex1,doubley1,doublex2,doubley2,doublex3,doubley3){

returnzero(xmult(x1,y1,x2,y2,x3,y3));

//判点是否在线段上,包括端点

intdot_online_in(pointp,linel){

returnzero(xmult(p,l.a,l.b))&

(l.a.x-p.x)*(l.b.x-p.x)<

(l.a.y-p.y)*(l.b.y-p.y)<

intdot_online_in(pointp,pointl1,pointl2){

intdot_online_in(doublex,doubley,doublex1,doubley1,doublex2,doubley2){

returnzero(xmult(x,y,x1,y1,x2,y2))&

(x1-x)*(x2-x)<

(y1-y)*(y2-y)<

//判点是否在线段上,不包括端点

intdot_online_ex(pointp,linel){

returndot_online_in(p,l)&

(!

zero(p.x-l.a.x)||!

zero(p.y-l.a.y))&

zero(p.x-l.b.x)||!

zero(p.y-l.b.y));

intdot_online_ex(pointp,pointl1,pointl2){

returndot_online_in(p,l1,l2)&

zero(p.x-l1.x)||!

zero(p.y-l1.y))&

zero(p.x-l2.x)||!

zero(p.y-l2.y));

intdot_online_ex(doublex,doubley,doublex1,doubley1,doublex2,doubley2){

returndot_online_in(x,y,x1,y1,x2,y2)&

zero(x-x1)||!

zero(y-y1))&

zero(x-x2)||!

zero(y-y2));

//判两点在线段同侧,点在线段上返回0

intsame_side(pointp1,pointp2,linel){

returnxmult(l.a,p1,l.b)*xmult(l.a,p2,l.b)>

//判两点在线段异侧,点在线段上返回0

intopposite_side(pointp1,pointp2,linel){

returnxmult(l.a,p1,l.b)*xmult(l.a,p2,l.b)<

intopposite_side(pointp1,pointp2,pointl1,pointl2){

//判两直线平行

intparallel(lineu,linev){

returnzero((u.a.x-u.b.x)*(v.a.y-v.b.y)-(v.a.x-v.b.x)*(u.a.y-u.b.y));

intparallel(pointu1,pointu2,pointv1,pointv2){

returnzero((u1.x-u2.x)*(v1.y-v2.y)-(v1.x-v2.x)*(u1.y-u2.y));

//判两直线垂直

intperpendicular(lineu,linev){

returnzero((u.a.x-u.b.x)*(v.a.x-v.b.x)+(u.a.y-u.b.y)*(v.a.y-v.b.y));

intperpendicular(pointu1,pointu2,pointv1,pointv2){

returnzero((u1.x-u2.x)*(v1.x-v2.x)+(u1.y-u2.y)*(v1.y-v2.y));

//判两线段相交,包括端点和部分重合

intintersect_in(lineu,linev){

dots_inline(u.a,u.b,v.a)||!

dots_inline(u.a,u.b,v.b))

return!

same_side(u.a,u.b,v)&

same_side(v.a,v.b,u);

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

当前位置:首页 > 自然科学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1