空间圆上N点拟合圆的算法

1、实际问题

在空间圆上测量出N个点(如下图)的三维坐标(x,y,z),即平面x,y坐标加上高程z,根据这N组点的坐标求出圆心的坐标和半径。

2、实现方法

利用用最小二乘法拟合出球面方程和平面方程,二者相交即为所求圆曲线。

2.1 球面方程解算

球面方程为:

(x - a)^2  + (y - b)^2 + (z - c)^2 = R^2

即: x^2 + y^2 + z ^2 + a^2 +b^2 +c^2 - 2ax - 2by -2cz = R ^2

令: A = 2a  ; B =2b ; C =2c  D=a^2 +b^2 +c^2 -R^2 

得: x^2 + y^2 + z ^2 - Ax -By - Cz + D =0

即:

Ax +By +Cz -D = x^2 +y^2 +z^2

设N组点的坐标数据为(x1,y1,z1)、(x2,y2,z2)、...(xn,yn,zn)

则用矩阵表示如下:

\begin{bmatrix} x_{1} &y_{1} &z_{1} & -1\\ \vdots & \vdots & \vdots &\vdots \\ x_{n} & y_{n} &z_{n} & -1 \end{bmatrix}\begin{bmatrix} A\\ B\\ C\\ D\\ \end{bmatrix}=\begin{bmatrix} x_{1}^{2}+y_{1}^{2}+z_{1}^{2}\\ \vdots\\ x_{n}^{2}+y_{n}^{2}+z_{n}^{2}\\ \end{bmatrix}

令:

M=\begin{bmatrix} x_{1} & y_{1} & z_{1}& -1\\ x_{2} & y_{2} & z_{2}& -1 \\ \vdots & \vdots& \vdots&\vdots \\ x_{n} & y_{n} & z_{n}& -1 \end{bmatrix}   ,X=\begin{bmatrix} A\\ B\\ C\\ D \end{bmatrix}  ,P=\begin{bmatrix} x_{1}^{2}+y_{1}^{2}+z_{1}^{2}\\x_{2}^{2}+y_{2}^{2}+z_{2}^{2}\\ \vdots\\ x_{n}^{2}+y_{n}^{2}+z_{n}^{2}\\ \end{bmatrix}

则转成:

MX=P

M^{^{T}}MX=M^{^{T}}P

得:

X=\left ( M^{^{T}}M \right )^{-1}M^{^{T}}P

解算出A、B、C、D之后,可得:

a=\frac{A}{2},b=\frac{B}{2},c=\frac{C}{2},R=\sqrt{a^{2}+b^{2}+c^{2}-D}

2.2 平面方程解算

平面方程为: 

Ex + Fy + Gz = 1

用矩阵表示如下:

\begin{bmatrix} x_{1} & y_{1} &z_{1} \\ x_{2} & y_{2} &z_{2} \\ \vdots & \vdots & \vdots\\ x_{n} & y_{n} &z_{n} \end{bmatrix}\begin{bmatrix} E\\ F\\ G \end{bmatrix}=\begin{bmatrix} 1\\ 1\\ \vdots \\ 1 \end{bmatrix}

解算过程同球面方程,可求出E、F、G。

如此便可得到球面方程、球心坐标、球半径和平面方程了。

2.3 拟合圆圆心及半径解算

如下图所示(仅示意):

圆心A为球心O到平面E的垂足

设平面方程为 :

          Ex + Fy + Gz - 1  =0                   ①   

则平面的法向量为 (E,F,G)

球心O的坐标为(a,b,c) ,设垂足即圆心A坐标为 (x', y', z'),因为球心O到圆心A的连线与法向量是平行的,可以得到如下:

(x' -a )/E = (y' -b)/F = (z' - c)/G  = t            ②

由 ②得 x' = Et + a; y' = Ft + b;z' = Gt + c;

带入① 可以得到:

t=\sqrt{\frac{1-Ea-Fb-Gc}{E^{2}+F^{2}+G^{2}}}

即可求出最终拟合圆的圆心坐标(x' , y' , z')

球心O到圆心A的距离可由平面外一点到平面的距离公式求得:

d=abs(Ex' + Fy' + Gz' -1) / sqrt(E^2 + F^2 +G^2)

则拟合圆的半径r为:

r = sqrt(R^2 -d^2)

以上便是解决问题的理论基础,后续便可以用代码来实现了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

测绘极客社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值