平面三角形外接(内切)圆圆心与半径求解算法


平面三角形外接(内切)圆圆心与半径求解算法

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 &center,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;
}


文章作者: Vinx
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Vinx !
 上一篇
QT获取下载、桌面、临时文件....等系统默认目录 QT获取下载、桌面、临时文件....等系统默认目录
QT获取下载、桌面、临时文件....等系统默认目录 头文件: #include <QStandardPaths> 示例代码: qDebug()<<"系统字体目录路径:"<<QStandardPaths:
2023-05-19
下一篇 
208. 实现 Trie (前缀树) 208. 实现 Trie (前缀树)
题目 Trie(发音类似 "try")或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。 请你实现 Trie 类: Trie() 初始化前缀树对象
2023-04-25
  目录