【B++】几何图形拟合公式大赏

使用最小二乘法拟合下列各几何图形,假设点云共有n个点,第i个点的坐标为 ( x i , y i , z i ) (x_i,y_i,z_i) (xi,yi,zi),下同。
python里用最小二乘法解方程Ax=b的语句是x=np.linalg.pinv(A).dot(b)

到两线段最近的点/两线段的近似交点

假设线段p的端点坐标为P0和P1,线段q的端点坐标为Q0和Q1,则p上的点可表示为 P = m P 0 + ( 1 − m ) P 1 P=mP_0+(1-m)P_1 P=mP0+(1m)P1,q上的点可表示为 Q = n Q 0 + ( 1 − n ) Q 1 Q=nQ_0+(1-n)Q_1 Q=nQ0+(1n)Q1
尽量使P=Q,则有 m P 0 + ( 1 − m ) P 1 = n Q 0 + ( 1 − n ) Q 1 mP_0+(1-m)P_1=nQ_0+(1-n)Q_1 mP0+(1m)P1=nQ0+(1n)Q1,移项得 m ( P 0 − P 1 ) + n ( Q 1 − Q 0 ) = Q 1 − P 1 m(P_0-P_1)+n(Q_1-Q_0)=Q_1-P_1 m(P0P1)+n(Q1Q0)=Q1P1
于是可得方程组 [ x P 0 − x P 1 x Q 0 − x Q 1 y P 0 − y P 1 z Q 0 − z Q 1 x P 0 − x P 1 x Q 0 − x Q 1 ] [ m n ] = [ x Q 1 − x P 1 y Q 1 − y P 1 z Q 1 − z P 1 ] \begin{bmatrix}x_{P0}-x_{P1}&x_{Q0}-x_{Q1}\\y_{P0}-y_{P1}&z_{Q0}-z_{Q1}\\x_{P0}-x_{P1}&x_{Q0}-x_{Q1}\end{bmatrix}\begin{bmatrix}m\\n\end{bmatrix}=\begin{bmatrix}x_{Q1}-x_{P1}\\y_{Q1}-y_{P1}\\z_{Q1}-z_{P1}\end{bmatrix} xP0xP1yP0yP1xP0xP1xQ0xQ1zQ0zQ1xQ0xQ1 [mn]= xQ1xP1yQ1yP1zQ1zP1 ,由此可解得m和n的近似值。
所以,到两线段最近的点为 1 2 [ m P 0 + ( 1 − m ) P 1 + n Q 0 + ( 1 − n ) Q 1 ] \frac12[mP_0+(1-m)P_1+nQ_0+(1-n)Q_1] 21[mP0+(1m)P1+nQ0+(1n)Q1]。当两线段靠得很近时,可将 m P 0 + ( 1 − m ) P 1 mP_0+(1-m)P_1 mP0+(1m)P1 n Q 0 + ( 1 − n ) Q 1 nQ_0+(1-n)Q_1 nQ0+(1n)Q1作为两线段的近似交点。

二维图形

平面

由点云拟合平面 A x + B y + C z = 1 Ax+By+Cz=1 Ax+By+Cz=1
[ x 1 y 1 z 1 x 2 y 2 z 2 ⋯ x n y n z n ] [ A B C ] = [ 1 1 ⋯ 1 ] → P x = y [ A B C ] = ( P T P ) − 1 P T y \begin{bmatrix}x_1&y_1&z_1\\x_2&y_2&z_2\\&⋯ \\x_n&y_n&z_n\end{bmatrix}\begin{bmatrix}A\\B\\C\end{bmatrix}=\begin{bmatrix}1\\1\\⋯\\1\end{bmatrix}\overset{Px=y}→\begin{bmatrix}A\\B\\C\end{bmatrix}=(P^TP)^{-1}P^Ty x1x2xny1y2ynz1z2zn ABC = 111 Px=y ABC =(PTP)1PTy,由此可解出A、B、C的近似值,其它方程组近似解解法相同。

圆(三个互不重合的圆/直线的公共内/外切圆)

先考虑公共外切圆。假设⊙A=(x1,y1,r1),⊙B=(x2,y2,r2),⊙C=(x3,y3,r3),它们的公共外切圆为⊙P=(x,y,z)。
原问题可表示为:
{ ( x − x 1 ) 2 + ( y − y 1 ) 2 = ( r + r 1 ) 2 ( x − x 2 ) 2 + ( y − y 2 ) 2 = ( r + r 2 ) 2 ( x − x 3 ) 2 + ( y − y 3 ) 2 = ( r + r 3 ) 2 \left\{\begin{matrix}(x-x_1)^2+(y-y_1)^2=(r+r_1)^2\\ (x-x_2)^2+(y-y_2)^2=(r+r_2)^2\\ (x-x_3)^2+(y-y_3)^2=(r+r_3)^2\\\end{matrix}\right. (xx1)2+(yy1)2=(r+r1)2(xx2)2+(yy2)2=(r+r2)2(xx3)2+(yy3)2=(r+r3)2
用(1)式减(2)式,(2)式减(3)式得:
{ − 2 x ( x 1 − x 2 ) + x 1 2 − x 2 2 − 2 y ( y 1 − y 2 ) + y 1 2 − y 2 2 = 2 r ( r 1 − r 2 ) + r 1 2 − r 2 2 − 2 x ( x 2 − x 3 ) + x 2 2 − x 3 2 − 2 y ( y 2 − y 3 ) + y 2 2 − y 3 2 = 2 r ( r 2 − r 3 ) + r 2 2 − r 3 2 ( x − x 3 ) 2 + ( y − y 3 ) 2 = ( r + r 3 ) 2 \left\{\begin{matrix}-2x(x_1-x_2)+x_1^2-x_2^2-2y(y_1-y_2)+y_1^2-y_2^2=2r(r_1-r_2)+r_1^2-r_2^2\\ -2x(x_2-x_3)+x_2^2-x_3^2-2y(y_2-y_3)+y_2^2-y_3^2=2r(r_2-r_3)+r_2^2-r_3^2\\ (x-x_3)^2+(y-y_3)^2=(r+r_3)^2\\\end{matrix}\right. 2x(x1x2)+x12x222y(y1y2)+y12y22=2r(r1r2)+r12r222x(x2x3)+x22x322y(y2y3)+y22y32=2r(r2r3)+r22r32(xx3)2+(yy3)2=(r+r3)2
换元并化简前两式得:
{ a 1 = 2 ( x 1 − x 2 ) , b 1 = 2 ( y 1 − y 2 ) , c 1 = 2 ( r 1 − r 2 ) , d 1 = x 1 2 − x 2 2 + y 1 2 − y 2 2 − r 1 2 + r 2 2 a 2 = 2 ( x 2 − x 3 ) , b 2 = 2 ( y 2 − y 3 ) , c 2 = 2 ( r 2 − r 3 ) , d 2 = x 2 2 − x 3 2 + y 2 2 − y 3 2 − r 2 2 + r 3 2 A 1 = b 1 c 2 − b 2 c 1 a 1 b 2 − a 2 b 1 , B 1 = b 2 d 1 − b 1 d 2 a 1 b 2 − a 2 b 1 , A 2 = a 2 c 1 − a 1 c 2 a 1 b 2 − a 2 b 1 , B 2 = a 1 d 2 − a 2 d 1 a 1 b 2 − a 2 b 1 x = A 1 r + B 1 y = A 2 r + B 2 ( x − x 3 ) 2 + ( y − y 3 ) 2 = ( r + r 3 ) 2 \left\{\begin{matrix} a_1=2(x_1-x_2),b_1=2(y_1-y_2),c_1=2(r_1-r_2),d_1=x_1^2-x_2^2+y_1^2-y_2^2-r_1^2+r_2^2\\ a_2=2(x_2-x_3),b_2=2(y_2-y_3),c_2=2(r_2-r_3),d_2=x_2^2-x_3^2+y_2^2-y_3^2-r_2^2+r_3^2\\ A_1=\frac{b_1c_2-b_2c_1}{a_1b_2-a_2b_1},B_1=\frac{b_2d_1-b_1d_2}{a_1b_2-a_2b_1},A_2=\frac{a_2c_1-a_1c_2}{a_1b_2-a_2b_1},B_2=\frac{a_1d_2-a_2d_1}{a_1b_2-a_2b_1}\\ x=A_1r+B_1\\ y=A_2r+B_2\\ (x-x_3)^2+(y-y_3)^2=(r+r_3)^2\\\end{matrix}\right. a1=2(x1x2),b1=2(y1y2),c1=2(r1r2),d1=x12x22+y12y22r12+r22a2=2(x2x3),b2=2(y2y3),c2=2(r2r3),d2=x22x32+y22y32r22+r32A1=a1b2a2b1b1c2b2c1,B1=a1b2a2b1b2d1b1d2,A2=a1b2a2b1a2c1a1c2,B2=a1b2a2b1a1d2a2d1x=A1r+B1y=A2r+B2(xx3)2+(yy3)2=(r+r3)2
最后一式可看做以r为变量的一元二次方程,直接套用求根公式可得:
{ a 1 = 2 ( x 1 − x 2 ) , b 1 = 2 ( y 1 − y 2 ) , c 1 = 2 ( r 1 − r 2 ) , d 1 = x 1 2 − x 2 2 + y 1 2 − y 2 2 − r 1 2 + r 2 2 a 2 = 2 ( x 2 − x 3 ) , b 2 = 2 ( y 2 − y 3 ) , c 2 = 2 ( r 2 − r 3 ) , d 2 = x 2 2 − x 3 2 + y 2 2 − y 3 2 − r 2 2 + r 3 2 d = a 1 b 2 − a 2 b 1 A 1 = 1 d ( b 1 c 2 − b 2 c 1 ) , B 1 = 1 d ( b 2 d 1 − b 1 d 2 ) , A 2 = 1 d ( a 2 c 1 − a 1 c 2 ) , B 2 = 1 d ( a 1 d 2 − a 2 d 1 ) C 1 = B 1 − x 3 , C 2 = B 2 − y 3 A = A 1 2 + A 2 2 − 1 , B = 2 ( A 1 C 1 + A 2 C 2 − r 3 ) , C = C 1 2 + C 2 2 − r 3 2 r = − B − B 2 − 4 A C 2 A , x = A 1 r + B 1 , y = A 2 r + B 2 \left\{\begin{matrix} a_1=2(x_1-x_2),b_1=2(y_1-y_2),c_1=2(r_1-r_2),d_1=x_1^2-x_2^2+y_1^2-y_2^2-r_1^2+r_2^2\\ a_2=2(x_2-x_3),b_2=2(y_2-y_3),c_2=2(r_2-r_3),d_2=x_2^2-x_3^2+y_2^2-y_3^2-r_2^2+r_3^2\\ d=a_1b_2-a_2b_1\\ A_1=\frac1d(b_1c_2-b_2c_1),B_1=\frac1d(b_2d_1-b_1d_2),A_2=\frac1d(a_2c_1-a_1c_2),B_2=\frac1d(a_1d_2-a_2d_1)\\ C_1=B_1-x_3,C_2=B_2-y_3\\ A=A_1^2+A_2^2-1,B=2(A_1C_1+A_2C_2-r_3),C=C_1^2+C_2^2-r_3^2\\ r=\frac{-B-\sqrt{B^2-4AC}}{2A},x=A_1r+B_1,y=A_2r+B_2\end{matrix}\right. a1=2(x1x2),b1=2(y1y2),c1=2(r1r2),d1=x12x22+y12y22r12+r22a2=2(x2x3),b2=2(y2y3),c2=2(r2r3),d2=x22x32+y22y32r22+r32d=a1b2a2b1A1=d1(b1c2b2c1),B1=d1(b2d1b1d2),A2=d1(a2c1a1c2),B2=d1(a1d2a2d1)C1=B1x3,C2=B2y3A=A12+A221,B=2(A1C1+A2C2r3),C=C12+C22r32r=2ABB24AC ,x=A1r+B1,y=A2r+B2
若与某个圆内切,则将相应的圆的半径变号。若为过某定点,则相应的半径变为0。
一元二次方程有两个解,上述解为主解。若副解 r = − B + B 2 − 4 A C 2 A r=\frac{-B+\sqrt{B^2-4AC}}{2A} r=2AB+B24AC 为正,则主副解同时成立,圆有两个解。此时,该圆与三个已知圆不全为外切或内切,且三个圆的圆心近似共线。

直线

由点云拟合直线 x = x 0 + A t , y = y 0 + B t , z = z 0 + C t x=x_0+At,y=y_0+Bt,z=z_0+Ct x=x0+At,y=y0+Bt,z=z0+Ct
将其变形为 C A ( x − x 0 ) = z − z 0 , C B ( y − y 0 ) = z − z 0 \frac CA(x-x_0)=z-z_0,\frac CB(y-y_0)=z-z_0 AC(xx0)=zz0,BC(yy0)=zz0,两式相加得 C A ( x − x 0 ) + C B ( y − y 0 ) = 2 ( z − z 0 ) \frac CA(x-x_0)+\frac CB(y-y_0)=2(z-z_0) AC(xx0)+BC(yy0)=2(zz0),可得方程组
[ x 1 − x 0 y 1 − y 0 x 2 − x 0 y 2 − y 0 ⋯ x n − x 0 y n − y 0 ] [ C A C B ] = 2 [ z 1 − z 0 z 2 − z 0 ⋯ z n − z 0 ] \begin{bmatrix}x_1-x_0&y_1-y_0\\x_2-x_0&y_2-y_0\\⋯ \\x_n-x_0&y_n-y_0\end{bmatrix}\begin{bmatrix}\frac CA\\\frac CB\end{bmatrix}=2\begin{bmatrix}z_1-z_0\\z_2-z_0\\⋯\\z_n-z_0\end{bmatrix} x1x0x2x0xnx0y1y0y2y0yny0 [ACBC]=2 z1z0z2z0znz0 ,由此可解得 C A \frac CA AC C B \frac CB BC的近似值,设定C可得A和B。

三维图形

由点云拟合球 ( x − a ) 2 + ( y − b ) 2 + ( z − c ) 2 = R 2 (x-a)^2+(y-b)^2+(z-c)^2=R^2 (xa)2+(yb)2+(zc)2=R2
先将其变形为 2 a x + 2 b y + 2 c z + R 2 − a 2 − b 2 − c 2 = x 2 + y 2 + z 2 2ax+2by+2cz+R^2-a^2-b^2-c^2=x^2+y^2+z^2 2ax+2by+2cz+R2a2b2c2=x2+y2+z2,可得方程组
[ 2 x 1 2 y 1 2 z 1 1 2 x 2 2 y 2 2 z 2 1 ⋯ 2 x n 2 y n 2 z n 1 ] [ a b c R 2 − a 2 − b 2 − c 2 ] = [ x 1 2 + y 1 2 + z 1 2 x 2 2 + y 2 2 + z 2 2 ⋯ x n 2 + y n 2 + z n 2 ] \begin{bmatrix}2x_1&2y_1&2z_1&1\\2x_2&2y_2&2z_2&1\\⋯ \\2x_n&2y_n&2z_n&1\end{bmatrix}\begin{bmatrix}a\\b\\c\\R^2-a^2-b^2-c^2\end{bmatrix}=\begin{bmatrix}x_1^2+y_1^2+z_1^2\\x_2^2+y_2^2+z_2^2\\⋯\\x_n^2+y_n^2+z_n^2\end{bmatrix} 2x12x22xn2y12y22yn2z12z22zn111 abcR2a2b2c2 = x12+y12+z12x22+y22+z22xn2+yn2+zn2 ,解就行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值