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

使用克拉默法则进行三点定圆(二维)

目录

  • 1.二维圆
  • 2.python代码
  • 3.计算结果

在这里插入图片描述

本文由CSDN点云侠原创,爬虫网站请自重。

1.二维圆

  已知不共线的三个点,设其坐标为 ( x 1 , y 1 ) (x_1,y_1) (x1,y1) ( x 2 , y 2 ) (x_2,y_2) (x2,y2) ( x 3 , y 3 ) (x_3,y_3) (x3,y3),圆的一般方程为:
A ( x 2 + y 2 ) + B x + C y + D = 0 (1) A(x^2+y^2)+Bx+Cy+D=0\tag{1} A(x2+y2)+Bx+Cy+D=0(1)
将式(1)变形可得圆的标准方程为:
( x + B 2 A ) 2 + ( y + C 2 A ) 2 = B 2 + C 2 − 4 A D 4 A 2 (2) (x+\frac{B}{2A})^2+(y+\frac{C}{2A})^2=\frac{B^2+C^2-4AD}{4A^2}\tag{2} (x+2AB)2+(y+2AC)2=4A2B2+C24AD(2)
将三个已知点代入式(1),可得关于 A , B , C , D A,B,C,D A,B,C,D的齐次线性方程组:

[ x 2 + y 2 x y 1 x 1 2 + y 1 2 x 1 y 1 1 x 2 2 + y 2 2 x 2 y 2 1 x 3 2 + y 3 2 x 3 y 3 1 ] ⋅ [ A B C D ] = [ 0 0 0 0 ] (3) \left[ \begin{matrix} x^2+y^2 & x & y&1\\ x_1^2+y_1^2 & x_1 & y_1&1 \\ x_2^2+y_2^2 & x_2 & y_2&1 \\ x_3^2+y_3^2 & x_3 & y_3&1 \\ \end{matrix} \right]\cdot \left[ \begin{matrix} A\\ B \\ C \\ D \\ \end{matrix} \right]= \left[ \begin{matrix} 0\\ 0 \\ 0 \\ 0 \\ \end{matrix} \right]\tag{3} x2+y2x12+y12x22+y22x32+y32xx1x2x3yy1y2y31111 ABCD = 0000 (3)
在三点不共线的前提下,该齐次线性方程组有非零解,其等价于系数矩阵不满秩,即有:

∣ x 2 + y 2 x y 1 x 1 2 + y 1 2 x 1 y 1 1 x 2 2 + y 2 2 x 2 y 2 1 x 3 2 + y 3 2 x 3 y 3 1 ∣ = 0 (4) \left| \begin{matrix} x^2+y^2 & x & y&1\\ x_1^2+y_1^2 & x_1 & y_1&1 \\ x_2^2+y_2^2 & x_2 & y_2&1 \\ x_3^2+y_3^2 & x_3 & y_3&1 \\ \end{matrix} \right|=0\tag{4} x2+y2x12+y12x22+y22x32+y32xx1x2x3yy1y2y31111 =0(4)
将式(4)展开,并与式(1)对比可得四个系数:
A = + ∣ x 1 y 1 1 x 2 y 2 1 x 3 y 3 1 ∣ (5) A=+\left| \begin{matrix} x_1 & y_1&1 \\ x_2 & y_2&1 \\ x_3 & y_3&1 \\ \end{matrix} \right|\tag{5} A=+ x1x2x3y1y2y3111 (5)

B = − ∣ x 1 2 + y 1 2 y 1 1 x 2 2 + y 2 2 y 2 1 x 3 2 + y 3 2 y 3 1 ∣ (6) B=-\left| \begin{matrix} x_1^2+y_1^2& y_1&1 \\ x_2^2+y_2^2 & y_2&1 \\ x_3^2+y_3^2 & y_3&1 \\ \end{matrix} \right|\tag{6} B= x12+y12x22+y22x32+y32y1y2y3111 (6)

C = + ∣ x 1 2 + y 1 2 x 1 1 x 2 2 + y 2 2 x 2 1 x 3 2 + y 3 2 x 3 1 ∣ (7) C=+\left| \begin{matrix} x_1^2+y_1^2 & x_1 &1 \\ x_2^2+y_2^2 & x_2 &1 \\ x_3^2+y_3^2 & x_3 &1 \\ \end{matrix} \right|\tag{7} C=+ x12+y12x22+y22x32+y32x1x2x3111 (7)

D = − ∣ x 1 2 + y 1 2 x 1 y 1 x 2 2 + y 2 2 x 2 y 2 x 3 2 + y 3 2 x 3 y 3 ∣ (8) D=-\left| \begin{matrix} x_1^2+y_1^2 & x_1 & y_1 \\ x_2^2+y_2^2 & x_2 & y_2 \\ x_3^2+y_3^2 & x_3 & y_3 \\ \end{matrix} \right|\tag{8} D= x12+y12x22+y22x32+y32x1x2x3y1y2y3 (8)
由式(2)可得圆心坐标 ( x c , y c ) (x_c,y_c) (xc,yc)和半径 r r r,即
{ x c = − B 2 A y c = − C 2 A r = B 2 + C 2 − 4 A D 4 A 2 (9) \begin{cases} x_c=-\frac{B}{2A}\\ y_c=-\frac{C}{2A}\\ r=\sqrt\frac{B^2+C^2-4AD}{4A^2} \end{cases} \tag{9} xc=2AByc=2ACr=4A2B2+C24AD (9)

2.python代码

import numpy as npdef three_points_fit_circle(points):P1 = points[0]P2 = points[1]P3 = points[2]# 共线检查temp01 = P1 - P2temp02 = P3 - P2temp03 = np.cross(temp01, temp02)temp = (temp03 @ temp03) / (temp01 @ temp01) / (temp02 @ temp02)if temp < 10 ** -6:print('\t三点共线, 无法确定圆')return NoneA = np.ones((3, 3))A[0, 0] = P1[0]A[0, 1] = P1[1]A[1, 0] = P2[0]A[1, 1] = P2[1]A[2, 0] = P3[0]A[2, 1] = P3[1]B = np.ones((3, 3))B[0, 0] = P1[0] ** 2 + P1[1] ** 2B[0, 1] = P1[1]B[1, 0] = P2[0] ** 2 + P2[1] ** 2B[1, 1] = P2[1]B[2, 0] = P2[0] ** 2 + P2[1] ** 2B[2, 1] = P3[1]C = np.ones((3, 3))C[0, 0] = P1[0] ** 2 + P1[1] ** 2C[0, 1] = P1[0]C[1, 0] = P2[0] ** 2 + P2[1] ** 2C[1, 1] = P2[0]C[2, 0] = P2[0] ** 2 + P2[1] ** 2C[2, 1] = P3[0]D = np.ones((3, 3))D[0, 0] = P1[0] ** 2 + P1[1] ** 2D[0, 1] = P1[0]D[0, 2] = P1[1]D[1, 0] = P2[0] ** 2 + P2[1] ** 2D[1, 1] = P2[0]D[1, 2] = P2[1]D[2, 0] = P2[0] ** 2 + P2[1] ** 2D[2, 1] = P3[0]D[2, 2] = P3[1]A = +np.linalg.det(A)B = -np.linalg.det(B)C = +np.linalg.det(C)D = -np.linalg.det(D)Xc = -B / (2 * A)Yc = -C / (2 * A)r = np.sqrt((B * B + C * C - 4 * A * D) / (4 * A * A))return Xc, Yc, r

3.计算结果

圆心x坐标:14.558850728542366
圆心y坐标:11.80858513779518
圆半径:22.163390629231692

在这里插入图片描述

http://www.lryc.cn/news/95819.html

相关文章:

  • 【Java】Java多线程编程基础
  • FFmpeg-4.2.4的去logo源码分析
  • 深度学习(一)
  • Stream API将对象中的某一字段取出转换为list或数组
  • 什么是Java中的JVM(Java虚拟机)?
  • springboot + redis + 注解 + 拦截器 实现接口幂等性校验
  • PLC编程:关键在于模拟操作流程和实现控制
  • List的各种排序
  • 在自定义数据集上微调Alpaca和LLaMA
  • Python 实现接口类的两种方式+邮件提醒+动态导入模块+反射(参考Django中间件源码)
  • Solr原理剖析
  • 解决 “无法将 ‘npm‘ 项识别为 cmdlet、函数、脚本文件或可运行程序的名称“ 错误的方法
  • Python 电商API 开发最佳实践
  • JAVA基础-集合(List与Map)
  • 19 QListWidget控件
  • 手动安装docsify
  • yaml语法详解
  • ubuntu下tmux安装
  • ssh打开远程vscode
  • Socket发送数据---winsock库和boost库
  • Qt Core学习日记——第七天QMetaObject(上)
  • 100、用简洁的语言描述一下:TCP的三次握手和四次挥手(不需要长篇大论)
  • 中南大学硕士论文latex版本全指导
  • RFC8470在HTTP中使用早期数据
  • macOS Big Sur 11.7.9 (20G1426) 正式版 ISO、PKG、DMG、IPSW 下载
  • 【LeetCode】62.不同路径
  • 使用序列化和反序列化函数archivedDataWithRootObject和unarchivedObjectOfClasses的使用和遇到问题及解决方案
  • python获取鼠标出颜色
  • Github Flow工作流简单介绍(以部署为中心的开发模式)
  • selenium浏览器驱动下载