三角形的外接圆
三角形外接圆圆心是三条边上垂直平分线的交点。
外接圆的半径是外心到顶点的距离。
圆在解析几何中表示圆心坐标以及圆的半径。
由:可知三角形面积与外接圆半径的关系。
因此,可通过计算三角形面积得出外接圆半径。外心的坐标是两条边的垂直平分线交点的坐标。
设三角形坐标为:A(x1,y1) B(x2,y2) C(x3,y3),
则其中一条垂直平分线方程为:
另一条垂直平分线的方程为:
两公式联立得
Code:
struct Circle{
double r;
Point centre;
Circle(Point _centre=Point(0,0),double _r=0){
centre=_centre;r=_r;
}
};
struct Triangle{
Point p[3];
};
//求出各边长用到的距离公式:
double Distance(Point p1,Point p2){
p2=p2-p1;
return sqrt(p2.x*p2.x+p2.y*p2.y);
}
//首先对三角形面积进行计算,一直三点坐标,求三角形的面积。
//其原理是利用行列式求三角形面积。
double TriangleArea(Triangle t){
return fabs((t.p[1]-t.p[0])^(t.p[2]-t.p[0]))/2.0;
}
Circle CircumCircleOfTriangle(const Triangle &t){
Circle tmp;
double a,b,c,c1,c2;
double xa,ya,xb,yb,xc,yc;
a=Distance(t.p[0],t.p[1]);b=Distance(t.p[1],t.p[2]);c=Distance(t.p[2],t.p[0]);
//根据S=a*b*c/4R求外接圆半径
tmp.r=a*b*c/TriangleArea(t)/4.0;
xa=t.p[0].x;ya=t.p[0].y;
xb=t.p[1].x;yb=t.p[1].y;
xc=t.p[2].x;yc=t.p[2].y;
c1=(xa*xa+ya*ya-xb*xb-yb*yb)/2.0;
c2=(xa*xa+ya*ya-xc*xc-yc*yc)/2.0;
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));
return tmp;
}
三角形的内切圆
三角形的内切圆的圆心是三角形内角平分线的交点。
由公式:可知,三角形内切圆半径和三角形面积的关系。
得向量:BC=a,CA=b,AB=c,内心坐标M,则有 a*MA+b*MB+c*MC=0;
其中,MA=(x1-xm,y1-ym) MB=(x2-xm,y2-ym) MC=(x3-xm,y3-ym);
Code:
Circle InCircleOfTriangle(const Triangle &t){
//三角形的内接圆
double a,b,c;
a=Distance(t.B,t.C);b=Distance(t.A,t.C);c=Distance(t.A,t.B);
double r=2.0*TriangleArea(t)/(a+b+c);
double angleA,angleB,angleC;//利用余弦定理求出角度
angleA=acos((b*b+c*c-a*a)/(2.0*b*c));
angleB=acos((a*a+c*c-b*b)/(2.0*a*c));
angleC=acos((a*a+b*b-c*c)/(2.0*a*b));
//求出半角弧度值。
double p1=sin(angleA/2.0),p2=sin(angleB/2.0),p3=sin(angleC/2.0);
double x1=t.A.x,y1=t.A.y,x2=t.B.x,y2=t.B.y,x3=t.C.x,y3=t.C.y;
double f1=((r/p2)*(r/p2)-(r/p1)*(r/p1)+x1*x1-x2*x2+y1*y1-y2*y2)/2.0;
double f2=((r/p3)*(r/p3)-(r/p1)*(r/p1)+x1*x1-x3*x3+y1*y1-y3*y3)/2.0;
double x=(f1*(y1-y3)-f2*(y1-y2))/((x1-x2)*(y1-y3)-(x1-x3)*(y1-y2));
double y=(f1*(x1-x3)-f2*(x1-x2))/((y1-y2)*(x1-x3)-(y1-y3)*(x1-x2));
return Circle(Point(x,y),r);
}
三角形只是一个特殊的例子,最常见的还是多边形的有关问题,下面我么来学习一下关于多边形的外接圆与内接圆。
多边形的外接圆
这个可以理解成,求一个最小的圆,覆盖多边形的点集。于是转化成了最小圆覆盖的问题,这个问题在后面的最小圆覆盖专题再学习。
多边形的内接圆
这里的多边形特指凸多边形(其他的多边形我还不会QAQ)
如果这个是凸多边形就好办了,我们可以求它的半平面交,然后多边形的边向内开始平移,并计算半平面交,直到多边形的半平面交为0(变成一个点)那么平移的距离就是内接圆的半径。
其中涉及到了平移旋转有关知识,下一个专题学习平移旋转。
对于多边形的边收缩:
void Move(double mid){
for(int i=1;i<=n;++i){
Edge2[i].start=Point(Edge[i].start.x+cos(Edge[i].ang+PI/2.0)*mid,Edge[i].start.y+sin(Edge[i].ang+PI/2.0)*mid);
Edge2[i].end=Point(Edge[i].end.x+cos(Edge[i].ang+PI/2.0)*mid,Edge[i].end.y+sin(Edge[i].ang+PI/2.0)*mid);
}
}
例题:POJ-3525-Most Distant Point from the Sea;
AC代码和思路在之前的半平面交汇总中:https://blog.csdn.net/qq_40482358/article/details/87921815