使用最小二乘法拟合下列各几何图形,假设点云共有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+(1−m)P1,q上的点可表示为
Q
=
n
Q
0
+
(
1
−
n
)
Q
1
Q=nQ_0+(1-n)Q_1
Q=nQ0+(1−n)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+(1−m)P1=nQ0+(1−n)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(P0−P1)+n(Q1−Q0)=Q1−P1。
于是可得方程组
[
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}
xP0−xP1yP0−yP1xP0−xP1xQ0−xQ1zQ0−zQ1xQ0−xQ1
[mn]=
xQ1−xP1yQ1−yP1zQ1−zP1
,由此可解得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+(1−m)P1+nQ0+(1−n)Q1]。当两线段靠得很近时,可将
m
P
0
+
(
1
−
m
)
P
1
mP_0+(1-m)P_1
mP0+(1−m)P1或
n
Q
0
+
(
1
−
n
)
Q
1
nQ_0+(1-n)Q_1
nQ0+(1−n)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
x1x2xny1y2⋯ynz1z2zn
ABC
=
11⋯1
→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.
⎩
⎨
⎧(x−x1)2+(y−y1)2=(r+r1)2(x−x2)2+(y−y2)2=(r+r2)2(x−x3)2+(y−y3)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(x1−x2)+x12−x22−2y(y1−y2)+y12−y22=2r(r1−r2)+r12−r22−2x(x2−x3)+x22−x32−2y(y2−y3)+y22−y32=2r(r2−r3)+r22−r32(x−x3)2+(y−y3)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(x1−x2),b1=2(y1−y2),c1=2(r1−r2),d1=x12−x22+y12−y22−r12+r22a2=2(x2−x3),b2=2(y2−y3),c2=2(r2−r3),d2=x22−x32+y22−y32−r22+r32A1=a1b2−a2b1b1c2−b2c1,B1=a1b2−a2b1b2d1−b1d2,A2=a1b2−a2b1a2c1−a1c2,B2=a1b2−a2b1a1d2−a2d1x=A1r+B1y=A2r+B2(x−x3)2+(y−y3)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(x1−x2),b1=2(y1−y2),c1=2(r1−r2),d1=x12−x22+y12−y22−r12+r22a2=2(x2−x3),b2=2(y2−y3),c2=2(r2−r3),d2=x22−x32+y22−y32−r22+r32d=a1b2−a2b1A1=d1(b1c2−b2c1),B1=d1(b2d1−b1d2),A2=d1(a2c1−a1c2),B2=d1(a1d2−a2d1)C1=B1−x3,C2=B2−y3A=A12+A22−1,B=2(A1C1+A2C2−r3),C=C12+C22−r32r=2A−B−B2−4AC,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=2A−B+B2−4AC为正,则主副解同时成立,圆有两个解。此时,该圆与三个已知圆不全为外切或内切,且三个圆的圆心近似共线。
直线
由点云拟合直线
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(x−x0)=z−z0,BC(y−y0)=z−z0,两式相加得
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(x−x0)+BC(y−y0)=2(z−z0),可得方程组
[
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}
x1−x0x2−x0⋯xn−x0y1−y0y2−y0yn−y0
[ACBC]=2
z1−z0z2−z0⋯zn−z0
,由此可解得
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
(x−a)2+(y−b)2+(z−c)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+R2−a2−b2−c2=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}
2x12x2⋯2xn2y12y22yn2z12z22zn111
abcR2−a2−b2−c2
=
x12+y12+z12x22+y22+z22⋯xn2+yn2+zn2
,解就行了。