哈哈哈看到一个很有意思的想法,顺手写了一下:
怎样快速求圆形或球形的隐函数方程、中心、半径
先从四点定球开始:

四点定球

实际上是看到李扬老师的视频哈哈哈

求通过不共面四点M1(x1,y1,z1)M_{1}\left(x_{1}, y_{1},z_{1}\right)M1​(x1​,y1​,z1​),M2(x2,y2,z2)M_{2}\left(x_{2}, y_{2}, z_{2}\right)M2​(x2​,y2​,z2​), M3(x3,y3,z3)M_{3}\left(x_{3}, y_{3}, z_{3}\right)M3​(x3​,y3​,z3​), M4(x4,y4,z4)M_{4}\left(x_{4}, y_{4}, z_{4}\right)M4​(x4​,y4​,z4​)的球面方程

我们设球面方程为:
a(x2+y2+z2)+bx+cy+dz+e=0a\left(x^{2}+y^{2}+z^{2}\right)+b x+c y+d z+e=0 a(x2+y2+z2)+bx+cy+dz+e=0

那么球面上的任意点及已知四点满足如下方程组:

{a(x2+y2+z2)+bx+cy+dz+e=0a(x12+y12+z12)+bx1+cy1+dz1+e=0a(x22+y22+z22)+bx2+cy2+dz2+e=0a(x32+y32+z32)+bx3+cy3+dz3+e=0a(x42+y42+z42)+bx4+cy4+dz4+e=0\left\{\begin{array}{l} a\left(x^{2}+y^{2}+z^{2}\right)+b x+c y+d z+e=0 \\ a\left(x_{1}^{2}+y_{1}^{2}+z_{1}^{2}\right)+b x_{1}+c y_{1}+d z_{1}+e=0 \\ a\left(x_{2}^{2}+y_{2}^{2}+z_{2}^{2}\right)+b x_{2}+c y_{2}+d z_{2}+e=0 \\ a\left(x_{3}^{2}+y_{3}^{2}+z_{3}^{2}\right)+b x_{3}+c y_{3}+d z_{3}+e=0 \\ a\left(x_{4}^{2}+y_{4}^{2}+z_{4}^{2}\right)+b x_{4}+c y_{4}+d z_{4}+e=0 \end{array}\right. ⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​a(x2+y2+z2)+bx+cy+dz+e=0a(x12​+y12​+z12​)+bx1​+cy1​+dz1​+e=0a(x22​+y22​+z22​)+bx2​+cy2​+dz2​+e=0a(x32​+y32​+z32​)+bx3​+cy3​+dz3​+e=0a(x42​+y42​+z42​)+bx4​+cy4​+dz4​+e=0​

要使方程组有非零解则要求系数行列式为0,即:
D(x,y,z)=∣x2+y2+z2xyz1x12+y12+z12x1y1z11x22+y22+z22x2y2z21x32+y32+z32x3y3z31x42+y42+z42x4y4z41∣=0D(x, y, z)=\left|\begin{array}{lllll} x^{2}+y^{2}+z^{2} & x & y & z & 1 \\ x_{1}^{2}+y_{1}^{2}+z_{1}^{2} & x_{1} & y_{1} & z_{1} & 1 \\ x_{2}^{2}+y_{2}^{2}+z_{2}^{2} & x_{2} & y_{2} & z_{2} & 1 \\ x_{3}^{2}+y_{3}^{2}+z_{3}^{2} & x_{3} & y_{3} & z_{3} & 1 \\ x_{4}^{2}+y_{4}^{2}+z_{4}^{2} & x_{4} & y_{4} & z_{4} & 1 \end{array}\right|=0 D(x,y,z)=∣∣∣∣∣∣∣∣∣∣​x2+y2+z2x12​+y12​+z12​x22​+y22​+z22​x32​+y32​+z32​x42​+y42​+z42​​xx1​x2​x3​x4​​yy1​y2​y3​y4​​zz1​z2​z3​z4​​11111​∣∣∣∣∣∣∣∣∣∣​=0

这时候我们发现约束条件D(x,y,z)=0D(x, y, z)=0D(x,y,z)=0是关于x,y,z的隐函数,且由x,y,z的任意性,得出D(x,y,z)=0D(x, y, z)=0D(x,y,z)=0正是我们所要求的球面方程。

当然我们要是想单独求某个系数也非常简单,例如求b只需要求如下行列式:
∣01000x12+y12+z12x1y1z11x22+y22+z22x2y2z21x32+y32+z32x3y3z31x42+y42+z42x4y4z41∣\left|\begin{array}{lllll} 0 & 1 & 0 & 0 & 0 \\ x_{1}^{2}+y_{1}^{2}+z_{1}^{2} & x_{1} & y_{1} & z_{1} & 1 \\ x_{2}^{2}+y_{2}^{2}+z_{2}^{2} & x_{2} & y_{2} & z_{2} & 1 \\ x_{3}^{2}+y_{3}^{2}+z_{3}^{2} & x_{3} & y_{3} & z_{3} & 1 \\ x_{4}^{2}+y_{4}^{2}+z_{4}^{2} & x_{4} & y_{4} & z_{4} & 1 \end{array}\right| ∣∣∣∣∣∣∣∣∣∣​0x12​+y12​+z12​x22​+y22​+z22​x32​+y32​+z32​x42​+y42​+z42​​1x1​x2​x3​x4​​0y1​y2​y3​y4​​0z1​z2​z3​z4​​01111​∣∣∣∣∣∣∣∣∣∣​

结论成立实践开始,我们编写如下方程:

function [Func,Mu,R]=getBall(X,Y,Z)
syms x y z
symMat=[x.^2+y.^2+z.^2,x,y,z,1];
varMat=[X(1).^2+Y(1).^2+Z(1).^2,X(1),Y(1),Z(1),1;X(2).^2+Y(2).^2+Z(2).^2,X(2),Y(2),Z(2),1;X(3).^2+Y(3).^2+Z(3).^2,X(3),Y(3),Z(3),1;X(4).^2+Y(4).^2+Z(4).^2,X(4),Y(4),Z(4),1];% 计算球隐函数
Func=matlabFunction(det([symMat;varMat]));% 计算各个参数
a=det([1 0 0 0 0;varMat]);
b=det([0 1 0 0 0;varMat]);
c=det([0 0 1 0 0;varMat]);
d=det([0 0 0 1 0;varMat]);
e=det([0 0 0 0 1;varMat]);% 计算球心,半径等信息
Mu=-[b,c,d]./a./2;
R=sqrt(sum(Mu.^2)-e./a);
end

其中返回值Func为球面隐函数,Mu为球心,R为半径

使用实例:

pnt=[0,0,1;1,1,6;1,3,4;9,6,11];
scatter3(pnt(:,1),pnt(:,2),pnt(:,3),'filled')
hold on[~,Mu,R]=getBall(pnt(:,1),pnt(:,2),pnt(:,3));
[X,Y,Z]=sphere(40);
mesh(X.*R+Mu(1),Y.*R+Mu(2),Z.*R+Mu(3),'FaceColor','none')

三点定圆

原理一模一样只不过少了个z而已:

function [Func,Mu,R]=getCircle(X,Y)
syms x y
symMat=[x.^2+y.^2,x,y,1];
varMat=[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];% 计算圆隐函数
Func=matlabFunction(det([symMat;varMat]));% 计算各个参数
a=det([1 0 0 0;varMat]);
b=det([0 1 0 0;varMat]);
c=det([0 0 1 0;varMat]);
d=det([0 0 0 1;varMat]);% 计算圆心,半径等信息
Mu=-[b,c]./a./2;
R=sqrt(sum(Mu.^2)-d./a);
end

使用实例:

pnt=[1 2;3 4;7 5];
scatter(pnt(:,1),pnt(:,2),'filled')
hold on[~,Mu,R]=getCircle(pnt(:,1),pnt(:,2));
t=linspace(0,2*pi,50);
plot(cos(t).*R+Mu(1),sin(t).*R+Mu(2))


当然这种方法也同样适合很多其他情况,例如两点共线,或者求一些其他曲面的参数之类的,可以自行探索一下。

MATLAB 四点定球及三点定圆(完整代码)相关推荐

  1. CV项目肢体动作识别(三)内附完整代码和详细讲解

    CV项目肢体动作识别(三)内附完整代码和详细讲解 首先我还是给出完整的代码,然后再进行详细的讲解.这一次我们用模块化的思想,把一个功能模块化(moudle),这种思想在工程中非常常见,在分工中你需要做 ...

  2. Matlab计算波形的总谐波失真--THD(附完整代码)

    一.实现功能 1.读取ADC采集的数字量,显示时域波形. 2.计算波形总谐波失真. 二.代码 废话少说,直接上代码(博主使用的是Matlab 2014b): %author:Meng %date:20 ...

  3. 基于MATLAB的数论运算与编写函数(附完整代码)

    目录 一. 基本数论运算 例题1 例题2 例题3 例题4 二. 循环结构 2.1 for 结构 2.2 while结构 例题5 例题6 例题7 三. 转移结构 例题8 四. 开关结构与试探结构 4.1 ...

  4. 基于MATLAB的逆矩阵、相似矩阵、正交矩阵(附完整代码)

    一. 符号多项式与数值多项式的转换 向量,可以利用MATLAB将此向量转换为多项式表示,格式如下: f=poly2sym(P) 当然,反过来也可以将符号多项式转换为向量,格式如下: P=sym2pol ...

  5. 交换两个变量的值(三种方式、完整代码)

    第一种:建立一个变量 temp,通过temp进行交换(需要建立一个新的变量) 第二种:位运算符(异或^)    (不需要新建立新的变量) 第三种:a=a+b    (不需要新建立新的变量) 例如: i ...

  6. java swing 大球吃小球游戏 功能完善 完整代码 下载即可以运行

    今天天气不错,利用一段时间给大家分享一个大球吃小球的游戏,该游戏也属于一个比较优秀的作品.整个系统界面漂亮,有完整得源码,希望大家可以喜欢.喜欢的帮忙点赞和关注.一起编程.一起进步!! 开发环境 开发 ...

  7. 5、matlab中求函数的一阶和二阶导数(完整代码)

    使用matlab内置的函数diff来求解函数的一阶和二阶导数. 以下是一个示例代码: syms x f(x) = x^3 + 2*x^2 + 3*x + 4; % 定义一个函数 f1(x) = dif ...

  8. Pygame(三)画圆

    Pygame(三)画圆 作业代码 画一个矩形:要求,左上角在(100,100), 宽为200, 高为60,边框颜色为蓝色 作业代码: def homework01():'''画一个矩形''''''要求 ...

  9. matlab watershed函数简单实现_薛定宇教授大讲堂(卷):MATLAB程序设计|文末赠书...

    00作者简介 薛定宇 分别在沈阳工业大学.东北大学和英国Sussex大学获得学士(1985年).硕士(1988年)和博士学位(1992年),1997年任东北大学信息学院教授.深耕于计算机在数学与自动控 ...

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

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

最新文章

  1. 首个镜子分割网络问世,大连理工、鹏城实验室、香港城大出品 | ICCV 2019
  2. aix oracle 登录用户,AIX 系统及 Oracle 数据库用户权限管理
  3. c语言 宏 变长参数,科学网—C/C++中处理变长参数函数(Variadic Function)的几个宏 - 彭彬的博文...
  4. 在SAP CRM webclient ui右上角显示系统时间
  5. python处理中文字符串_处理python字符串中的中文字符
  6. 山峰和山谷(信息学奥赛一本通-T1454)
  7. js获取jsp上下文地址
  8. 【机器人】机械臂与动捕Nokov的深入了解
  9. LayaAir 快捷键设置与资源命名规则
  10. 2022年五一数学建模竞赛C题
  11. 微信小程序SEO优化策略
  12. 网站服务器日志包含什么,查看网站日志有什么作用?
  13. 考研和计算机三级,考研考计算机与考软件有什么区别吗
  14. 多重继承--读松本行弘的程序世界
  15. iOS 当使用DES解密遇到和解密不一致或者为空的时候问题
  16. 休闲“农家乐”agritainment
  17. 江苏大学的计算机,毛启容-江苏大学计算机科学与通信工程学院
  18. hpet 定时器中断 8259 linux,[OSDEV]编程高精度定时器(HPET)
  19. HDU-4037-线段树-区间开根号
  20. BADI 和BAPI 的区别

热门文章

  1. 计算机存储数据时2的20次方,2的20次方是多少
  2. 093 一个人的固执里,藏着低水平的认知
  3. python输入整数反转输出_Python反转输出正整数
  4. python整数因式分解
  5. 怎么在Excel里输入可以打钩的选择框?
  6. 关于Ajax回调函数返回值判断的问题
  7. 基因定相(Phasing) 与 SHAPEIT 原理简介
  8. 【浏览器书签】浏览器书签解析,导入
  9. 打印机驱动兼容问题导致打印乱码
  10. IPS(入侵防御系统)技术