当前位置: 首页 > news >正文

三点确定圆心算法推导

已知a,b,c三点求过这三点的圆心坐标

a ( x 1 , y 1 ) a(x_1, y_1) a(x1,y1) b ( x 2 , y 2 ) b(x_2, y_2) b(x2,y2) c ( x 3 , y 3 ) c(x_3, y_3) c(x3,y3)

确认三点是否共线

叉积计算方式
v → ( X 1 , Y 1 ) × u → ( X 2 , Y 2 ) = X 1 Y 2 − X 2 Y 1 \overrightarrow{v}(X_1, Y_1) \times \overrightarrow{u}(X_2, Y_2) = X_1Y_2 - X_2Y_1 v (X1,Y1)×u (X2,Y2)=X1Y2X2Y1
使用叉积判断三个点是否共线
a b → = ( ( x 2 − x 1 ) , ( y 2 − y 1 ) ) a c → = ( ( x 3 − x 1 ) , ( y 3 − y 1 ) ) \overrightarrow{ab} = ((x_2- x_1) , (y_2- y_1)) \\ \overrightarrow{ac} = ((x_3- x_1) , (y_3- y_1)) ab =((x2x1),(y2y1))ac =((x3x1),(y3y1))
带入上方可到的:
v a l u e = ( x 2 − x 1 ) ( y 3 − y 1 ) − ( x 3 − x 1 ) ( y 2 − y 1 ) v a l u e = x 2 y 3 − x 2 y 1 − x 1 y 3 + x 1 y 1 − x 3 y 2 + x 3 y 1 + x 1 y 2 − x 1 y 1 \begin{aligned} value &= (x_2 - x_1)(y_3 - y_1) - (x_3 - x_1)(y_2 - y_1) \\ value &= x_2y_3 - x_2y_1-x_1y_3+x_1y_1-x_3y_2+x_3y_1+x_1y_2-x_1y_1 \\ \end{aligned} valuevalue=(x2x1)(y3y1)(x3x1)(y2y1)=x2y3x2y1x1y3+x1y1x3y2+x3y1+x1y2x1y1
整合后得到
v a l u e = x 1 ( y 2 − y 3 ) + x 2 ( y 3 − y 1 ) + x 3 ( y 1 − y 2 ) value = x_1(y_2-y_3)+x_2(y_3-y_1)+x_3(y_1-y_2) value=x1(y2y3)+x2(y3y1)+x3(y1y2)
{ v a l u e < 0 点 b 在 a c → 右边 v a l u e > 0 点 b 在 a c → 左边 v a l u e = 0 三点共线 \begin{cases} value & < 0 &点b在\overrightarrow{ac}右边\\ value & > 0 &点b在\overrightarrow{ac}左边\\ value & = 0 &三点共线 \\ \end{cases} valuevaluevalue<0>0=0bac 右边bac 左边三点共线

不共线的三点才可以确认一个圆

三点求解圆心

已知圆的方程为
( x − x 0 ) 2 + ( y − y 0 ) 2 = r 2 (x-x_0)^2+(y-y_0)^2=r^2 (xx0)2+(yy0)2=r2

假设圆心坐标为 O ( a , b ) O(a,b) O(a,b)带入三点可以得到下列方程
{ ( x 1 − a ) 2 + ( y 1 − b ) 2 = r 2 ① ( x 2 − a ) 2 + ( y 2 − b ) 2 = r 2 ② ( x 3 − a ) 2 + ( y 3 − b ) 2 = r 2 ③ \begin{cases} (x_1 - a)^2+(y_1 - b)^2=r^2 &①\\ (x_2 - a)^2+(y_2 - b)^2=r^2 &②\\ (x_3 - a)^2+(y_3 - b)^2=r^2 &③\\ \end{cases} (x1a)2+(y1b)2=r2(x2a)2+(y2b)2=r2(x3a)2+(y3b)2=r2
拆解后可得
{ x 1 2 − 2 x 1 a + a 2 + y 1 2 − 2 y 1 b + b 2 = r 2 ① x 2 2 − 2 x 2 a + a 2 + y 2 2 − 2 y 2 b + b 2 = r 2 ② x 3 2 − 2 x 3 a + a 2 + y 3 2 − 2 y 3 b + b 2 = r 2 ③ \begin{cases} x_1^2 - 2x_1a+a^2 + y_1^2-2y_1b+b^2=r^2 &①\\ x_2^2 - 2x_2a+a^2 + y_2^2-2y_2b+b^2=r^2 &②\\ x_3^2 - 2x_3a+a^2 + y_3^2-2y_3b+b^2=r^2 &③\\ \end{cases} x122x1a+a2+y122y1b+b2=r2x222x2a+a2+y222y2b+b2=r2x322x3a+a2+y322y3b+b2=r2
使用①-②②-③。构造两个方程组
{ a ( x 2 − x 1 ) + b ( y 2 − y 1 ) = ( x 2 2 + y 2 2 ) − ( x 1 2 + y 1 2 ) 2 ① − ② a ( x 3 − x 2 ) + b ( y 3 − y 2 ) = ( x 3 2 + y 3 2 ) − ( x 2 2 + y 2 2 ) 2 ② − ③ \begin{cases} a(x_2-x_1)+b(y_2-y_1)=\frac{(x_2^2+y_2^2)-(x_1^2+y_1^2)}{2} &①-②\\ a(x_3-x_2)+b(y_3-y_2)=\frac{(x_3^2+y_3^2)-(x_2^2+y_2^2)}{2} &②-③\\ \end{cases} {a(x2x1)+b(y2y1)=2(x22+y22)(x12+y12)a(x3x2)+b(y3y2)=2(x32+y32)(x22+y22)

我们可以给计算方程简化一下
A 1 = x 2 − x 1 B 1 = y 2 − y 1 A 2 = x 3 − x 2 B 2 = y 3 − y 2 C 1 = ( x 2 2 + y 2 2 ) − ( x 1 2 + y 1 2 ) 2 C 2 = ( x 3 2 + y 3 2 ) − ( x 2 2 + y 2 2 ) 2 \begin{aligned} A_1 &= x_2-x_1 \\ B_1 &= y_2-y_1 \\ A_2 &= x_3-x_2 \\ B_2 &= y_3-y_2 \\ C_1 &= \frac{(x_2^2+y_2^2)-(x_1^2+y_1^2)}{2} \\ C_2 &= \frac{(x_3^2+y_3^2)-(x_2^2+y_2^2)}{2} \\ \end{aligned} A1B1A2B2C1C2=x2x1=y2y1=x3x2=y3y2=2(x22+y22)(x12+y12)=2(x32+y32)(x22+y22)
则可的方程组
A 1 a + B 1 b = C 1 A 2 a + B 2 b = C 2 A_1a+B_1b=C_1 \\ A_2a+B_2b=C_2 \\ A1a+B1b=C1A2a+B2b=C2
使用矩阵求解这个方程组
( A 1 B 1 A 2 B 2 ) ( a b ) = ( C 1 C 2 ) \begin{pmatrix} A_1 & B_1 \\ A_2 & B_2 \\ \end{pmatrix} \begin{pmatrix} a \\ b \\ \end{pmatrix} = \begin{pmatrix} C_1 \\ C_2 \\ \end{pmatrix} (A1A2B1B2)(ab)=(C1C2)
可得
( a b ) = 1 A 1 B 2 − A 2 B 1 ( B 2 − B 1 − A 2 A 1 ) ( C 1 C 2 ) \begin{pmatrix} a \\ b \\ \end{pmatrix} = \frac{1}{ A_1B_2-A_2B_1 } \begin{pmatrix} B_2 & -B_1 \\ -A_2 & A_1 \\ \end{pmatrix} \begin{pmatrix} C_1 \\ C_2 \\ \end{pmatrix} (ab)=A1B2A2B11(B2A2B1A1)(C1C2)

( a b ) = ( B 2 A 1 B 2 − A 2 B 1 − B 1 A 1 B 2 − A 2 B 1 − A 2 A 1 B 2 − A 2 B 1 A 1 A 1 B 2 − A 2 B 1 ) ( C 1 C 2 ) = ( B 2 C 1 − B 1 C 2 A 1 B 2 − A 2 B 1 A 1 C 2 − A 2 C 1 A 1 B 2 − A 2 B 1 ) \begin{pmatrix} a \\ b \\ \end{pmatrix} = \begin{pmatrix} \frac{B_2}{A_1B_2-A_2B_1} & \frac{-B_1}{A_1B_2-A_2B_1} \\ \frac{-A_2}{A_1B_2-A_2B_1} & \frac{A_1}{A_1B_2-A_2B_1} \\ \end{pmatrix} \begin{pmatrix} C_1 \\ C_2 \\ \end{pmatrix} = \begin{pmatrix} \frac{B_2C_1-B_1C_2}{A_1B_2-A_2B_1}\\ \frac{A_1C_2-A_2C_1}{A_1B_2-A_2B_1}\\ \end{pmatrix} (ab)=(A1B2A2B1B2A1B2A2B1A2A1B2A2B1B1A1B2A2B1A1)(C1C2)=(A1B2A2B1B2C1B1C2A1B2A2B1A1C2A2C1)

这样我们就得到了圆心 O ( a , b ) O(a,b) O(a,b)的坐标,同时我们也发现了一个很奇特的现象
上面再做共线条判断的时候我们求了叉积
v a l u e = x 1 ( y 2 − y 3 ) + x 2 ( y 3 − y 1 ) + x 3 ( y 1 − y 2 ) value = x_1(y_2-y_3)+x_2(y_3-y_1)+x_3(y_1-y_2) value=x1(y2y3)+x2(y3y1)+x3(y1y2)
而我们求解的a,b的分母我带入后会发现
A 1 B 2 − A 2 B 1 = x 1 ( y 2 − y 3 ) + x 2 ( y 3 − y 1 ) + x 3 ( y 1 − y 2 ) A_1B_2-A_2B_1 = x_1(y_2-y_3)+x_2(y_3-y_1)+x_3(y_1-y_2) A1B2A2B1=x1(y2y3)+x2(y3y1)+x3(y1y2)

是不是很玄学hhhhh,有知道原理的大佬欢迎评论区解答。

代码实现

typedef struct _GL2_fPoint {float x;float y;
} GL2_fPoint;// 计算通过三点的圆的圆心和半径
bool circle_from_three_points(const GL2_fPoint& p1, const GL2_fPoint& p2, const GL2_fPoint& p3, float& cx, float& cy, float& r) {float x1 = p1.x, y1 = p1.y;float x2 = p2.x, y2 = p2.y;float x3 = p3.x, y3 = p3.y;float A = x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2);if (std::abs(A) < 1e-6f) {return false;}float B = (x1 * x1 + y1 * y1) * (y3 - y2) + (x2 * x2 + y2 * y2) * (y1 - y3) + (x3 * x3 + y3 * y3) * (y2 - y1);float C = (x1 * x1 + y1 * y1) * (x2 - x3) + (x2 * x2 + y2 * y2) * (x3 - x1) + (x3 * x3 + y3 * y3) * (x1 - x2);float D = (x1 * x1 + y1 * y1) * (x3 * y2 - x2 * y3) + (x2 * x2 + y2 * y2) * (x1 * y3 - x3 * y1) + (x3 * x3 + y3 * y3) * (x2 * y1 - x1 * y2);cx = -B / (2 * A);cy = -C / (2 * A);r = std::sqrt((x1 - cx) * (x1 - cx) + (y1 - cy) * (y1 - cy));return true;
}

相关文章:

三点确定圆心算法推导

已知a,b,c三点求过这三点的圆心坐标 a ( x 1 , y 1 ) a(x_1, y_1) a(x1​,y1​) 、 b ( x 2 , y 2 ) b(x_2, y_2) b(x2​,y2​) 、 c ( x 3 , y 3 ) c(x_3, y_3) c(x3​,y3​) 确认三点是否共线 叉积计算方式 v → ( X 1 , Y 1 ) u → ( X 2 , Y 2 ) X 1 Y 2 − X 2 Y 1 \…...

神经网络 (NN) TensorFlow Playground在线应用程序

神经网络 (NN) 历史上最重要的发现之一是神经网络 (NN) 的强大功能。 在神经网络中&#xff0c;称为神经元的许多数据层被添加在一起或相互堆叠以计算新的数据级别。 常用的简称&#xff1a; DNN 深度神经网络CNN 卷积神经网络RNN 循环神经网络 神经元 科学家一致认为&am…...

腾讯课堂 离线m3u8.sqlite转成视频

为了广大腾讯课堂用户对于购买的课程不能正常离线播放&#xff0c;构成知识付费损失&#xff0c;故出此文档。 重点&#xff1a;完全免费&#xff01;&#xff01;&#xff01;完全免费&#xff01;&#xff01;&#xff01;完全免费&#xff01;&#xff01;&#xff01; 怎么…...

Linux多路转接

文章目录 IO模型多路转接select 和 pollepoll IO模型 在还在学习语言的阶段&#xff0c;C里使用cin&#xff0c;或者是C使用scanf的时候&#xff0c;总是要等着我们输入数据才执行&#xff0c;这种IO是阻塞IO。下面是比较正式的说法。 阻塞IO: 在内核将数据准备好之前&#xf…...

IDEA导入Maven项目的流程配置以常见问题解决

1. 前言 本文主要围绕着在IDEA中导入新Maven项目后的配置及常见问题解决来展开说说。相关的部分软件如下&#xff1a; IntelliJ IDEA 2021.1JDK 1.8Window 2. 导入Maven项目及配置 2.1 导入Maven项目 下面介绍了直接打开本地项目和导入git上的项目两种导入Maven方式。 1…...

【数据分析---- Pandas进阶指南:核心计算方法、缺失值处理及数据类型管理】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;本阶段和大家一起分享和探索数据分析&#xff0c;本篇文章主要讲述了&#xff1a;Pandas进阶指南&#xff1a;核心计算方法、缺失值处理及数据类型管理等等。欢迎大家一起探索讨论&#x…...

2024世界机器人大会将于8月21日至25日在京举行

2024年的世界机器人大会预定于8月21日至25日&#xff0c;在北京经济技术开发区的北人亦创国际会展中心隆重举办。 本届大会以“共育新质生产力 共享智能新未来”为核心主题&#xff0c;将汇聚来自全球超过300位的机器人行业专家、国际组织代表、杰出科学家以及企业家&#xff0…...

【Linux】lvm被删除或者lvm丢失了怎么办

模拟案例 接下来模拟lvm误删除如何恢复的案例&#xff1a; 模拟删除&#xff1a; 查看vg名&#xff1a; vgdisplayvgcfgrestore --list uniontechos #查看之前的操作 例如我删除的&#xff0c;现场没有删除就用最近的操作文件&#xff1a; 还原&#xff1a; vgcfgrestore…...

疫情防控管理系统

摘 要 由于当前疫情防控形势复杂&#xff0c;为做好学校疫情防控管理措施&#xff0c;根据上级防疫部门要求&#xff0c;为了学生的生命安全&#xff0c;要求学校加强疫情防控的管理。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#x…...

永久删除的Android 文件去哪了?在Android上恢复误删除的消息和照片方法?

丢失重要消息和照片可能是一种令人沮丧的经历&#xff0c;尤其是在您没有备份的情况下。但别担心&#xff0c;在本教程中&#xff0c;我们将指导您完成在Android设备上恢复已删除消息和照片的步骤。无论您是不小心删除了它们还是由于软件问题而消失了&#xff0c;这些步骤都可以…...

宠物服务小程序多生态转化

宠物服务如美容造型、医疗、看护寄养等有着不少需求&#xff0c;尤其是年轻人从宠物生活到饮食起居等面面俱到&#xff0c;往往不惜金钱给到较好的环境&#xff0c;如定时除虫、优质食物、玩具、检查身体、服饰&#xff1b; 近些年宠物服务店新开数量也较多&#xff0c;同行竞…...

今天细说一下工业制造行业MES系统

文章目录 前言什么是MES&#xff1f; 前言 最近几个月在做制造行业的MES系统开发&#xff0c;这类面向制造业的系统是今年做的第三个系统了&#xff0c;也算是了解较深的了&#xff0c;和一个之前转行做这一块的朋友聊了聊&#xff0c;他们集团要扩大规模&#xff0c;准备招ME…...

C++ 知识点(长期更新)

C++ 知识点 C/C++1. `cin`, `cin.get()`, `getchar()`, `getline()`, 和 `cin.getline()`的区别。2. 有关 cin >>3. 定义和声明的区别4. `union`、`struct`和`class`的区别5. 深拷贝 vs 浅拷贝6. new 和 malloc 的区别7. 被free回收的内存是立即返还给操作系统吗?为什么…...

Spring AI + 通义千问 入门学习

Spring AI 通义千问 入门学习 文章目录 Spring AI 通义千问 入门学习一&#xff0c;开发环境配置二&#xff0c;项目搭建2.1 pom文件2.2 配置文件 三&#xff0c;AI使用3.1 对话问答3.1.1 普通方式3.1.2 流方式 3.2 文字生成图片 最近AI很火&#xff0c;而Spring也出了Spring…...

38.【C语言】指针(重难点)(C)

目录: 8.const 修饰指针 *修饰普通变量 *修饰指针变量 9.指针运算 *指针或-整数 *指针-指针 *指针关系运算 往期推荐 承接上篇37.【C语言】指针&#xff08;重难点&#xff09;&#xff08;B&#xff09; 8.const 修饰指针 const 全称 constant adj.不变的 *修饰普通变量 #…...

Vue-05.指令-v-for

v-for 列表渲染&#xff0c;遍历容器的元素或者对象的属性 v-for“列表元素名 in 列表名” <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wi…...

自动驾驶的一些大白话讲解

无人驾驶牛逼吗&#xff1f;我来帮你祛魅【原理缺陷解析】_哔哩哔哩_bilibili 5分钟讲明白自动驾驶端到端&#xff0c;解释为什么华为智驾并不是遥遥领先 到底什么是端到端自动驾驶系统&#xff1f;为何我会说这是智能驾驶的弯道超车机会&#xff1f;我希望今天用5分钟的时间&…...

Python学习笔记--参数

目录 实参与形参 不定长参数 拆分参数列表 返回值 实参与形参 1. 定义函数时&#xff0c;带默认值的形参必须放在不带默认值的形参后面 下面程序的输出结果是&#xff08; &#xff09;。 def StudentInfo(country中国,name): print(%s&#xff0c;%s%(name,country)…...

刷题——大数加法

大数加法_牛客题霸_牛客网 string solve(string s, string t) {if(s.size() < t.size()) return solve(t, s);reverse(s.begin(), s.end());reverse(t.begin(), t.end());string ans;int d 0;//进位制for(int i0; i < s.size(); i){d s[i] - 0;//取得数字值if(i < …...

Pytorch人体姿态骨架生成图像

ControlNet是一个稳定扩散模型&#xff0c;可以复制构图和人体姿势。ControlNet解决了生成想要的确切姿势困难的问题。 Human Pose使用OpenPose检测关键点&#xff0c;如头部、肩膀、手的位置等。它适用于复制人类姿势&#xff0c;但不适用于其他细节&#xff0c;如服装、发型和…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

Java + Spring Boot + Mybatis 实现批量插入

在 Java 中使用 Spring Boot 和 MyBatis 实现批量插入可以通过以下步骤完成。这里提供两种常用方法&#xff1a;使用 MyBatis 的 <foreach> 标签和批处理模式&#xff08;ExecutorType.BATCH&#xff09;。 方法一&#xff1a;使用 XML 的 <foreach> 标签&#xff…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

宇树科技,改名了!

提到国内具身智能和机器人领域的代表企业&#xff0c;那宇树科技&#xff08;Unitree&#xff09;必须名列其榜。 最近&#xff0c;宇树科技的一项新变动消息在业界引发了不少关注和讨论&#xff0c;即&#xff1a; 宇树向其合作伙伴发布了一封公司名称变更函称&#xff0c;因…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

Monorepo架构: Nx Cloud 扩展能力与缓存加速

借助 Nx Cloud 实现项目协同与加速构建 1 &#xff09; 缓存工作原理分析 在了解了本地缓存和远程缓存之后&#xff0c;我们来探究缓存是如何工作的。以计算文件的哈希串为例&#xff0c;若后续运行任务时文件哈希串未变&#xff0c;系统会直接使用对应的输出和制品文件。 2 …...

深入解析光敏传感技术:嵌入式仿真平台如何重塑电子工程教学

一、光敏传感技术的物理本质与系统级实现挑战 光敏电阻作为经典的光电传感器件&#xff0c;其工作原理根植于半导体材料的光电导效应。当入射光子能量超过材料带隙宽度时&#xff0c;价带电子受激发跃迁至导带&#xff0c;形成电子-空穴对&#xff0c;导致材料电导率显著提升。…...

STL 2迭代器

文章目录 1.迭代器2.输入迭代器3.输出迭代器1.插入迭代器 4.前向迭代器5.双向迭代器6.随机访问迭代器7.不同容器返回的迭代器类型1.输入 / 输出迭代器2.前向迭代器3.双向迭代器4.随机访问迭代器5.特殊迭代器适配器6.为什么 unordered_set 只提供前向迭代器&#xff1f; 1.迭代器…...

记一次spark在docker本地启动报错

1&#xff0c;背景 在docker中部署spark服务和调用spark服务的微服务&#xff0c;微服务之间通过fegin调用 2&#xff0c;问题&#xff0c;docker容器中服务器来后&#xff0c;注册中心都有&#xff0c;调用服务也正常&#xff0c;但是调用spark启动任务后报错&#xff0c;报错…...