文章目录

  • 问题引入
    • 问题分析
  • 公式推导
  • 代码实现
  • 例题
  • 高维情况
    • 三维三角形外心
    • n维度三角形外心

问题引入

给定二维平面上三个不共线的点 A(x0,y0),B(x1,y1),C(x2,y2)A(x_0,y_0),B(x_1,y_1),C(x_2,y_2)A(x0​,y0​),B(x1​,y1​),C(x2​,y2​), 求出他们形成的圆的圆心和半径。

问题分析

计算几何问题常用数形结合解决,不妨设圆心 O(x,y)O(x,y)O(x,y),则满足三个点到圆心的距离相同。我们可以用两个等价方程来描述:

(x−x0)2+(y−y0)2=(x−x1)2+(y−y1)2(x−x0)2+(y−y0)2=(x−x2)2+(y−y2)2(1)(x-x_0)^2+(y-y_0)^2=(x-x_1)^2+(y-y_1)^2\\\\(x-x_0)^2+(y-y_0)^2=(x-x_2)^2+(y-y_2)^2\tag1(x−x0​)2+(y−y0​)2=(x−x1​)2+(y−y1​)2(x−x0​)2+(y−y0​)2=(x−x2​)2+(y−y2​)2(1)

现在转换为两个方程解两个未知数 x,yx,yx,y 的问题。上式化简后可得两个线性方程,使用克拉默法则可以容易解出答案。

公式推导

对公式 (1)(1)(1) 分别移项展开消去二次项,得到:

2(x1−x0)x+2(y1−y0)y=x12−x02+y12−y022(x2−x0)x+2(y2−y0)y=x22−x02+y22−y02(2)2(x_1-x_0)x+2(y_1-y_0)y=x_1^2-x_0^2+y_1^2-y_0^2\\\\2(x_2-x_0)x+2(y_2-y_0)y=x_2^2-x_0^2+y_2^2-y_0^2\tag22(x1​−x0​)x+2(y1​−y0​)y=x12​−x02​+y12​−y02​2(x2​−x0​)x+2(y2​−y0​)y=x22​−x02​+y22​−y02​(2)

如此得到一组二元一次线性方程则,方程有解充要条件是系数矩阵行满秩,容易发现无解当且仅当三点共线,即行列式(同时也是三点形成两个向量的叉积)为0,即

(x1−x0)×(y2−y0)−(x2−x0)×(y1−y0)=0(3)(x_1-x_0)\times(y_2-y_0)-(x_2-x_0)\times(y_1-y_0)=0\tag3(x1​−x0​)×(y2​−y0​)−(x2​−x0​)×(y1​−y0​)=0(3)

其他情况下均有解。方便起见以a,b,c,d,e,f,g来代替原系数,即:

ax+by=cdx+ey=f(4)ax+by=c\\\\dx+ey=f\tag4ax+by=cdx+ey=f(4)

其中:

a=2(x1−x0)b=2(y1−y0)c=x12−x02+y12−y02d=2(x2−x0)e=2(y2−y0)f=x22−x02+y22−y02(5)a=2(x_1-x_0)\\\\b=2(y_1-y_0)\\\\c=x_1^2-x_0^2+y_1^2-y_0^2\\\\d=2(x_2-x_0)\\\\e=2(y_2-y_0)\\\\f=x_2^2-x_0^2+y_2^2-y_0^2\tag5a=2(x1​−x0​)b=2(y1​−y0​)c=x12​−x02​+y12​−y02​d=2(x2​−x0​)e=2(y2​−y0​)f=x22​−x02​+y22​−y02​(5)

在有解情况下,由克拉默法则可得

x=DxD=ce−fbae−dbx = \frac{D_x}{D} = \frac{ce-fb}{ae-db}x=DDx​​=ae−dbce−fb​
y=DyD=af−dcae−bd(6)y = \frac{D_y}{D} = \frac{af-dc}{ae-bd}\tag6y=DDy​​=ae−bdaf−dc​(6)

于是可在 O(1)O(1)O(1) 内求出圆心,从而计算可得半径。

代码实现

node findO(const node &p,const node &q,const node &r){//input should be nonlineardouble a = 2 * (p.x - q.x);double b = 2 * (p.y - q.y);double c = p.x * p.x + p.y * p.y - q.x * q.x - q.y * q.y;double d = 2 * (p.x - r.x);double e = 2 * (p.y - r.y);double f = p.x * p.x + p.y * p.y - r.x * r.x - r.y * r.y;double g = a*e-b*d;return {(c*e-f*b)/g,(a*f-d*c)/g};
}

例题

Geometry Problem
其实本题并不是求圆心模板题,但是考虑到本题去掉思维部分可以被视为2-D版本三点共圆模板题,而且模板题确实难找,故当作模板题放在此处。

高维情况

三维三角形外心

给定三维空间上三个不共线的点A(x0,y0,z0)A(x_0,y_0,z_0)A(x0​,y0​,z0​) , B(x1,y1,z1)B(x_1,y_1,z_1)B(x1​,y1​,z1​) , C(x2,y2,z2)C(x_2,y_2,z_2)C(x2​,y2​,z2​) , 求出他们形成的圆的圆心和半径。

依据数形结合思路,仍要先把几何问题转化为代数问题:
R=(x−x0)2+(y−y0)2+(z−z0)2=(x−x1)2+(y−y1)2+(z−z1)2=(x−x2)2+(y−y2)2+(z−z2)2R = (x-x_0)^2+(y-y_0)^2+(z-z_0)^2\\\\\ \ \ \ = (x-x_1)^2+(y-y_1)^2+(z-z_1)^2\\\\\ \ \ = (x-x_2)^2+(y-y_2)^2+(z-z_2)^2R=(x−x0​)2+(y−y0​)2+(z−z0​)2    =(x−x1​)2+(y−y1​)2+(z−z1​)2   =(x−x2​)2+(y−y2​)2+(z−z2​)2

其中 (x,y,z)(x,y,z)(x,y,z) 为圆心坐标,于是得到三个未知数两个方程。要求解至少还需要一个方程。但是三个点可以确定一张平面,可以通过叉积得到法向量,构造平面方程,如此则转化为三元一次线性方程组,且方程系数比较容易求出。容易利用克拉默法则求三阶行列式分别求出 x,y,zx,y,zx,y,z 的数值。

n维度三角形外心

给定n维空间上三个不共线的点A(x0,y0,z0,...)A(x_0,y_0,z_0,...)A(x0​,y0​,z0​,...) , B(x1,y1,z1,...)B(x_1,y_1,z_1,...)B(x1​,y1​,z1​,...) , C(x2,y2,z2,...)C(x_2,y_2,z_2,...)C(x2​,y2​,z2​,...) , 求出他们形成的圆的圆心和半径。

类推处理二维和三维情况下的方案,设圆心为 O(x,y,z,...)O(x,y,z,...)O(x,y,z,...)。由等距性质得到两个线性方程。在n维空间下,表征一个二维平面平面,需要n-2个线性方程。于是综合上述两组方程得到n元一次线性方程组,高斯消元可以 O(n3)O(n^3)O(n3) 处理得到方程的解。

求三点共圆求圆心半径及其推导(三角形外心)相关推荐

  1. 拟合三点共圆 圆心坐标和半径

    原文链接: 拟合三点共圆 圆心坐标和半径 上一篇: mobilenet_v2_1.4_224 flowers 数据集分类网络 下一篇: 简单 gan 生成手写数字 均方误差 任意给定三个点,找到经过三 ...

  2. 三角形垂点坐标js算法(三点定圆求圆心)

    已知平面三点坐标A(x1, y1).B(x2, y2).C(x3, y3),三点定圆也就是三角形的中垂线交点, //平面三点定位算法 function locate(x1, y1, x2, y2, x ...

  3. python求三个数平均值_python求三个数平均值

    本文收集整理关于python求三个数平均值的相关议题,使用内容导航快速到达. 内容导航: Q1:利用python3.x计算任意数据平均值 l=[1,2,3]def ave(a):print(sum(a ...

  4. 给定两个点的坐标和一个半径,求能组成的圆的圆心坐标

    中文背景: 给定两个点坐标分别为(x1, y1), (x2, y2)和半径r,求出圆心的坐标(a, b). 英文背景: Given the coordinates of two points (x1, ...

  5. 趣题:三角形中的六点共圆

    下面这个有趣的问题来自IMO 2008第一题,题目给出的结论非常美妙.       给定一个锐角三角形△ABC,垂心为H.Ma.Mb.Mc分别为三条边的中点.以Ma为圆心,过点H的圆与线段BC相交于点 ...

  6. 空间3点求三点所在空间圆的圆心空间坐标

    参考:http://blog.sina.com.cn/s/blog_648868460100h2b8.html(这个博主还有很多关于工程测量的知识和空间几何计算的知识) 已知空间三点的坐标为(x1,y ...

  7. javascript解决问题:红白球共25个,白黑球共31个,红黑球共28个,求三种球各有多少?求红白黑球的个数;

    前端入门学习遇到的问题: 刚刚学习了js中的两个循环语句for和while,因为几天前就接触了for循环,自己用起来更加顺手,今天找了几道入门的编程问题,其中有一道遇到了问题,题目如下: 红白球共25 ...

  8. JS有红,白,黑三球若干个,其中红,白球共25个,白黑共31个,红黑共28个,求三种球各多少个。

    题目: 有红,白,黑三球若干个,其中红,白球共25个,白黑共31个,红黑共28个,求三种球各多少个. 小白学js,嘤嘤嘤! 刚开始看这道题,我xx居然去傻傻去解方程,666!(要我动脑,我还要计算机干 ...

  9. c++ 圆上任意点坐标计算_已知圆上任意三点坐标如何编程来计算这个圆的圆心和半径...

    在过去的一周时间里一直在计算师兄交代的任务 ,啥都没学,就一直在干这活.其中呢,我想的一个算法中就用到了本文中的这个小知识(主要就是线性代数和高中的一些知识结合起来).师兄说做的这个东西的内容要保密, ...

  10. 三棱锥之刻(求三棱锥中心球与表面覆盖面积之和)

    https://ac.nowcoder.com/acm/contest/9981/E 思路: 根据r和a的关系一共分4类情况: ①染色面积为0 ②染色面积为4个圆形 ③染色面积为三棱锥的内表面减去12 ...

最新文章

  1. MySQL 笔记9 -- PyMySQL
  2. AI技术在游戏开发中的五种有效尝试
  3. 为什么explorer.exe会占有大量的CPU?
  4. 记住看小电影前一定要检查网址是不是 HTTPS 的,不然…
  5. 猴年猴赛雷,曙光服务器全面升级E5-v4平台
  6. 如何在Mac和Windows PC之间无线共享文件
  7. Echarts实现图表下钻
  8. 计算机控制系统陈振答案,北京理工大学自动化学院导师教师师资介绍简介-董 宁...
  9. 面试PHP的尴尬经历以及今后的职业规划
  10. 电气火灾监控系统在某市新能源有轨电车示范线工程案例
  11. Cocos2dx 安装运行
  12. 阿里DruidDataSource访问RDS安全级别受限问题排查
  13. springboot丽江市旅游服务网站的设计与实现.rar(论文+项目源码)
  14. 什么是PR值?提高PR值有哪些方法?
  15. 吉多·范罗苏姆 --python创始人
  16. 如何使用ftp从Metalink上下载补丁updates.oracle.com
  17. [NOI2005]瑰丽华尔兹
  18. 计算机微课论文参考文献,关于计算机论文范文资料 与微课在高校计算机教学中的应用有关论文参考文献...
  19. 莱阳计算机类专科大学,莱阳市两所高校介绍
  20. 我所知道坦克大战(单机版)之图形化显示生命值、添加功能方块:血包

热门文章

  1. 为什么Redis单线程却能支撑高并发?
  2. 资深程序员和你重学五线谱 - 第一篇
  3. NLP中embeding干了什么事?怎么干的?
  4. ap漫游测试软件,AC+AP方案选择,TP无缝漫游强过UBNT?胖AP如何实现802.11r?
  5. 什么是像素格式(色彩采样、色度抽样)RGB 4:4:4、(Limit)RGB 4:4:4、Ycbcr 4:4:4、Ycbcr 4:2:2、Ycbcr 4:2:0又是什么?
  6. Cadence 16.6快速创建多引脚芯片原理图符号
  7. 计算机主要主机的组成部分包括什么作用,电脑的组成及其作用各是什么
  8. android 清理 app,最好用的五大手机清理APP
  9. springBoot项目使用pagehelper进行多种数据库分页
  10. VC++ 查看系统进程,获取进程关联的DLL列表