平面三角形外接(内切)圆圆心与半径求解算法
0.1 三角形面积S与外接圆半径R的关系
\[ \begin{align*} S &= \frac{a * b * c}{4 * R} \\ 外接圆半径R &= \frac{a * b * c}{4 * S} \end{align*} \]
0.2 三角形面积S与内切圆半径r的关系
\[ \begin{align*} S &= \frac{a * b * c}{4 * R} \\ 内切圆半径 r &= \frac{2 * S}{a + b + c} \end{align*} \]
1. 直角三角形
直角三角形的外心(即三边垂直平分线交点)在斜边的中点上,因此直角三角形的外接圆半径就等于斜边的一半。
a和b分别为直角三角形两条直角边。 \[ 外接圆半径R = \frac{\sqrt{a^2 + b^2}}{2} \]
2. 已知一边长a和该边上的高h(条件不足,只能求面积)
\[ S = \frac{a * h}{2} \]
3. 已知一边长a和该边上的高h,边长a被高h分割为a1,a2
\[ \begin{align*} S &= \frac{(a1 + a2) * h}{2} \\ 外接圆半径R &= \frac{\sqrt{a1^2 + h^2} * \sqrt{a2^2 + h^2}}{h * 2} \end{align*} \]
4. 已知两边长a,b和它们的夹角C
\[ S = \frac{a * b * sin(c)}{2} \]
5. 已知三角形三边长a,b,c 用海伦公式
\[ \begin{align*} p &= \frac{a+b+c}{2} \\ S &= \sqrt{p*(p-a)*(p-b)*(p-c)} \\ 外接圆半径R &= \frac{a * b * c}{4 * S} \\ &= \frac{a * b * c}{\sqrt{(a+b+c) * (a+b-c) * (a+c-b) * (b+c-a)}} \\ \\ 内切圆半径 r &= \frac{2 * S}{a + b + c} \\ &= \frac{\sqrt{(a+b+c) * (a+b-c) * (a+c-b) * (b+c-a)}}{2} \end{align*} \]
6.已知三角形三点坐标A(x1,y1) B(x2,y2) C(x3,y3)
\[ \begin{align*} S &= \frac{abs( x1*y2+x2*y3+x3*y1-x2*y1-x3*y2-x1*y3 )}{2} \\ \\ a &= \sqrt{(x2-x1)^2 + (y2-y1)^2} \\ b &= \sqrt{(x3-x1)^2 + (y3-y1)^2} \\ c &= \sqrt{(x3-x2)^2 + (y3-y2)^2} \\ \\ p &= \frac{a+b+c}{2} \\ S &= \sqrt{p*(p-a)*(p-b)*(p-c)} \\ 外接圆半径R &= \frac{a * b * c}{4 * S} \\ &= \frac{a * b * c}{\sqrt{(a+b+c) * (a+b-c) * (a+c-b) * (b+c-a)}} \end{align*} \]
6. 1求外接圆圆心
/**
处理:如三点共线,则返回false;否则,返回true,并将计算得到的圆心与半径存放在center和radius众返回。
*/
bool triangleCircle(const Point& p1,const Point& p2,const Point& p3,Point ¢er,double &radius)
{
//检查三点是否共线
if( isThreePointsOnOneLine(p1,p2,p3) )
return false;
double x1,x2,x3,y1,y2,y3;
x1 = p1.x;
x2 = p2.x;
x3 = p3.x;
y1 = p1.y;
y2 = p2.y;
y3 = p3.y;
//求外接圆半径
double a=sqrt( (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2) );
double b=sqrt( (x1-x3)*(x1-x3)+(y1-y3)*(y1-y3) );
double c=sqrt( (x2-x3)*(x2-x3)+(y2-y3)*(y2-y3) );
double p=(a+b+c)/2;
double S=sqrt( p*(p-a)*(p-b)*(p-c) );
radius=a*b*c/(4*S);
//求外接圆圆心
double t1=x1*x1+y1*y1;
double t2=x2*x2+y2*y2;
double t3=x3*x3+y3*y3;
double temp=x1*y2+x2*y3+x3*y1-x1*y3-x2*y1-x3*y2;
double x=(t2*y3+t1*y2+t3*y1-t2*y1-t3*y2-t1*y3)/temp/2;
double y=(t3*x2+t2*x1+t1*x3-t1*x2-t2*x3-t3*x1)/temp/2;
center.x = x ;
center.y = y ;
return true;
}
/**
判断3个点是否共线
*/
bool isThreePointsOnOneLine(const Point& p1,const Point& p2,const Point& p3){
if(p2.x==p1.x){
if(p2.x==p3.x)
return true;
return false;
}else{
if(p2.x==p3.x)
return true;
}
//判断依据:p2与p1两点构成直线的斜率=p2与p3两点构成直线的斜率
double k1=(p2.y-p1.y)/(p2.x-p1.x);
double k2=(p3.y-p2.y)/(p3.x-p2.x);
double DIFF=0.00000001;
if( fabs(k1-k2)<DIFF )
return true;
return false;
}