解析几何--与三角形有关的圆,多边形圆的扩展

三角形的外接圆

三角形外接圆圆心是三条边上垂直平分线的交点。

外接圆的半径是外心到顶点的距离。

圆在解析几何中表示圆心坐标以及圆的半径。

由:S\Delta =\frac{abc}{4R}可知三角形面积与外接圆半径的关系。

因此,可通过计算三角形面积得出外接圆半径。外心的坐标是两条边的垂直平分线交点的坐标。

设三角形坐标为:A(x1,y1) B(x2,y2) C(x3,y3),

则其中一条垂直平分线方程为:(x-\frac{x_{1}+x_{2}}{2})(x_{1}-x_{2})=-(y_{1}-y_{2})(y-\frac{y_{1}+y_{2}}{2})

另一条垂直平分线的方程为:(x-\frac{x_{3}+x_{2}}{2})(x_{3}-x_{2})=-(y_{3}-y_{2})(y-\frac{y_{3}+y_{2}}{2})

两公式联立得

X=\frac{\frac{(x_{1}-x_{2})(x_{1}+x_{2})}{2y_{1}-2y_{2}}-\frac{(x_{3}-x_{2})(x_{3}+x_{2})}{2y_{3}-2y_{2}}+\frac{y_{1}+y_{2}}{2}-(y_{3}+y_{2})}{\frac{x_{1}-x_{2}}{y_{1}-y_{2}}-\frac{x_{3}-x_{2}}{y_{3}-y_{2}}}

Y=\frac{\frac{(y_{1}-y_{2})(y_{1}+y_{2})}{2x_{1}-2x_{2}}-\frac{(y_{3}-y_{2})(y_{3}+y_{2})}{2x_{3}-2x_{2}}+\frac{x_{1}+x_{2}}{2}-(x_{3}+x_{2})}{\frac{y_{1}-y_{2}}{x_{1}-x_{2}}-\frac{y_{3}-y_{2}}{x_{3}-x_{2}}}

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;
}

三角形的内切圆

三角形的内切圆的圆心是三角形内角平分线的交点。

由公式:S\Delta =\frac{(a+b+c)r}{2}可知,三角形内切圆半径和三角形面积的关系。

得向量: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

猜你喜欢

转载自blog.csdn.net/qq_40482358/article/details/87987375