计算几何模板Word下载.docx
- 文档编号:15940896
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:13
- 大小:17.62KB
计算几何模板Word下载.docx
《计算几何模板Word下载.docx》由会员分享,可在线阅读,更多相关《计算几何模板Word下载.docx(13页珍藏版)》请在冰豆网上搜索。
typedefstructRadial
Pointp;
Pointinf;
(无穷远出一点)
}Radial;
//三角形
typedefstructTriangle
Pointp[3];
}Triangle;
//圆
typedefstructCircle
doubler;
Pointcenter;
}Circle;
====================函数===============
=====点点====================================================
/判断两点是否相等(重载==)
booloperator==(Pointa,Pointb)
if(fabs(a.x-b.x)<
eps&
&
fabs(a.y-b.y)<
eps)
return1;
return0;
}
//重载矢量-
Pointoperator-(Pointa,Pointb)
Pointtem;
tem.x=a.x-b.x;
tem.y=a.y-b.y;
returntem;
//重载矢量+
Pointoperator+(Pointa,Pointb)
tem.x=a.x+b.x;
tem.y=a.y+b.y;
//重载矢量*
Pointoperator*(Pointa,Pointb)
tem.x=a.x*b.x;
tem.y=a.y*b.y;
//求矢量差积
doublecross(Pointp1,Pointp2)//计算叉乘p1×
p2
{
return(p1.x*p2.y-p2.x*p1.y);
}
//求两点距离
doubledistance(Pointp1,Pointp2)
//计算平面上两个点之间的距离
p.x=p1.x-Cp2.x;
p.y=p1.y-Cp2.y;
returnsqrt(p.x*p.x+p.y*p.y);
//点关于点的对称点
PointsymPoint(Pointp1,Pointp2)
//求p1关于p2的对称点
Pointp3;
p3.x=2*p2.x-p1.x;
p3.y=2*p2.y-p1.y;
returnp3;
=======点线=========================================================
//点在直线上
intisPOnLine(Pointp,Linel)//-1表示在直线左边,0表示在直线上,1在直线右边
if(fabs(p.x*l.a+p.y*l.b+l.c)<
return0;
elseif((p.x*l.a+p.y*l.b+l.c)<
0)
return-1;
return1;
;
//两点求直线方程
LineppLine(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;
//判断三点共线
boolpppOnLine(Pointa,Pointb,Pointc)
Lineab=ppLine(a,b);
returnpOnLine(c,ab);
//点是否在线段上
c
//点到直线距离
doubledisPtoLine(Pointp,Linel)
doubleresult;
result=fabs(p.x*l.a+p.y*l.b+l.c);
result/=sqrt(l.a*l.a+l.b*l.b);
returnresult;
//点关于直线的对称点
PointsymPointLine(Pointp1,Linel)
//p1点关于直线L的对称点
Pointp2;
doubled;
d=l.a*l.a+l.b*l.b;
p2.x=(l.b*l.b*p1.x-l.a*l.a*p1.x-
2*l.a*l.b*p1.y-2*l.a*l.c)/d;
p2.y=(l.a*l.a*p1.y-l.b*l.b*p1.y-
2*l.a*l.b*p1.x-2*l.b*l.c)/d;
returnp2;
=====点与多边形====================================
//判断点在多边形上
/*
如果点在多边形内:
返回0
如果点在多边形边上:
返回1
如果点在多边形外:
返回2
*/
intisInPolygon(Pointp0,Pointp[],intn)
intcounter=0;
doublexinters;
Pointp1,p2;
p1=p[0];
for(inti=1;
i<
=n;
i++)
{
p2=p[i%n];
if(isPointOnSegment(p0,p1,p2))
return1;
if(p0.y>
min(p1.y,p2.y))
{
if(p0.y<
=max(p1.y,p2.y))
{
if(p0.x<
=max(p1.x,p2.x))
{
if(p1.y!
=p2.y)
{
xinters=(p0.y-p1.y)*(p2.x-p1.x)/(p2.y-p1.y)+p1.x;
if(p1.x==p2.x||p0.x<
=xinters)
counter++;
}
p1=p2;
if(counter%2==0)
return2;
=====线线==========================================
//判断两条线段是否相交
boolisIntersected(Points1,Pointe1,Points2,Pointe2)
//判断线段[s1,e1]和[s2,e2]是否相交
//判断线段是否相交
//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))&
(cross(s2-s1,e1-s1)*cross(e2-s1,e1-s1)<
=0)&
(cross(s1-s2,e2-s2)*cross(e1-s2,e2-s2)<
=0)
)returntrue;
returnfalse;
//判断线段与直线是否相交
比如判断线段[s2,e1]和直线L是否相交,只需要在直线L上取横坐标X无穷大和无穷小的两点s1,e1,然后判断线段[s1,e1]和线段[s2,e2]是否相交即可。
//求直线的交点
PointlineInter(Linel1,Linel2)
//求直线的交点,注意平形的情况无解,避免RE
//求两直线得交点坐标
Pointtmp;
doublea1=l1.a;
doubleb1=l1.b;
doublec1=l1.c;
doublea2=l2.a;
doubleb2=l2.b;
doublec2=l2.c;
//注意这里b1=0
if(fabs(b1)<
eps)
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;
//========图形====================================
//多边形的面积(也适合凹多边形)
doublepolygonArea(Pointp[],intn)
//已知多边形各顶点的坐标,求其面积
doublearea;
inti;
area=0;
for(i=1;
i<
=n;
i++){
area+=(p[i-1].x*p[i%n].y-p[i%n].x*p[i-1].y);
returnfabs(area/2);
//三角形面积
doubletriangleArea(Pointp0,Pointp1,Pointp2)
//已知三角形三个顶点的坐标,求三角形的面积
doublek=p0.x*p1.y+p1.x*p2.y
+p2.x*p0.y-p1.x*p0.y
-p2.x*p1.y-p0.x*p2.y;
returnfabs(k/2);
//求三角形外接圆
CircleoutCircleOfTriangle(Pointp1,Pointp2,Pointp3)
//三角形的外接圆
Circletmp;
doublea,b,c,c1,c2;
doublexA,yA,xB,yB,xC,yC;
a=distance(p1,p2);
b=distance(p2,p3);
c=distance(p3,
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算 几何 模板