隧道空间圆拟合方法研究及程序实现

编程入门 行业动态 更新时间:2024-10-10 01:17:00

<a href=https://www.elefans.com/category/jswz/34/1762894.html style=隧道空间圆拟合方法研究及程序实现"/>

隧道空间圆拟合方法研究及程序实现

在地铁隧道洞口测量中,经常要对空间圆形物体进行检测测量,通过洞口测量得到的多个点的三维坐标拟合出洞口的圆心坐标、洞口半径以及洞口平面的法向量等参数,最后通过拟合得到的这些参数与设计数据进行对比,检验隧道的施工误差是否满足设计的限差要求。

小博参考李英硕等人在文献《空间圆形拟合检测新方法》提出的一种实用的空间圆形拟合检测新方法: “根据空间圆中任意两条弦所对应的中垂面与空间圆所处 的平面必然相交且交点即为圆心这一空间圆特性,利用空间向量按照最小二乘法推导出圆心计算方程,按照附有 条件的间接平差求解圆心坐标,进而反算出空间圆半径。”小博参考该文献的数学模型做了一个适用于隧道洞口圆拟合的APP,本软件可以通过导入地铁洞口测量数据,快速拟合出洞口圆心坐标、半径和洞口平面的法向量。该App的效果图如图所示:

先给大家分享该APP的下载地址:点击下载

计算过程:

根据李英硕等人的文献《空间圆形拟合检测新方法》的研究得到空间圆形物体拟合的过程为:

 

 

 

 核心代码实现:

package com.example.administrator.circlefitting;public class CircleFit {private double r,x,y,z;private double A,B,C;//法向量public CircleFit(Matrix xyz){int row=xyz.getRow();Matrix B=new Matrix(row-1,3);Matrix L=new Matrix(row-1,1);Matrix BB=new Matrix(row,3);Matrix LL=new Matrix(row,1);double x,y,z,_X,_Y,_Z;for(int i=1;i<row;i++){x=xyz.getElem(i-1,0);y=xyz.getElem(i-1,1);z=xyz.getElem(i-1,2);_X=xyz.getElem(i,0);_Y=xyz.getElem(i,1);_Z=xyz.getElem(i,2);B.setElem(i-1,0,_X-x);B.setElem(i-1,1,_Y-y);B.setElem(i-1,2,_Z-z);L.setElem(i-1,0,((_X*_X+_Y*_Y+_Z*_Z)-(x*x+y*y+z*z))/2);}for(int i=0;i<row;i++){x=xyz.getElem(i,0);y=xyz.getElem(i,1);z=xyz.getElem(i,2);BB.setElem(i,0,x);BB.setElem(i,1,y);BB.setElem(i,2,z);LL.setElem(i,0,1);}Matrix _B=B.transform();Matrix X=_B.mult(B).inverse().mult(_B).mult(L);Matrix _BB=BB.transform();Matrix XX=_BB.mult(BB).inverse().mult(_BB).mult(LL);this.A=XX.getElem(0,0);this.B=XX.getElem(1,0);this.C=XX.getElem(2,0);Matrix C=new Matrix(1,3);C.setElem(0,0,this.A);C.setElem(0,1,this.B);C.setElem(0,2,this.C);Matrix Nb=B.transform().mult(B);Matrix W=B.transform().mult(L);Matrix N=new Matrix(Nb.getRow()+1,Nb.getCol()+1,0);for (int i=0;i<Nb.getRow();i++){for (int j=0;j<Nb.getCol();j++){N.setElem(i,j,Nb.getElem(i,j));}}for (int i=0;i<Nb.getCol();i++) {N.setElem(Nb.getRow(), i, C.getElem(0, i));N.setElem(i,Nb.getCol(),C.getElem(0,i));}Matrix NL=new Matrix(W.getRow()+1,1,1);for(int i=0;i<W.getRow();i++)NL.setElem(i,0,W.getElem(i,0));Matrix R=N.inverse().mult(NL);this.x=R.getElem(0,0);this.y=R.getElem(1,0);this.z=R.getElem(2,0);double sum_r=0,r;for(int i=0;i<row;i++){x=xyz.getElem(i,0);y=xyz.getElem(i,1);z=xyz.getElem(i,2);r=Math.sqrt(Math.pow(x-this.x,2)+Math.pow(y-this.y,2)+Math.pow(z-this.z,2));sum_r+=r;}this.r=sum_r/row;}public double getR(){return r;}public double getX(){return x;}public double getY() {return y;}public double getZ() {return z;}public double getA() {return A;}public double getB() {return B;}public double getC() {return C;}
}

 最后要注意的是该APP需要打开文件读写权限才能实现数据的读取功能。

 

更多推荐

隧道空间圆拟合方法研究及程序实现

本文发布于:2024-02-14 09:35:18,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1762965.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:隧道   程序   方法   空间

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!