SE3在2D平面上的约束

1 问题
有时,我们需要将一个3D空间的SE3变量映射到指定的2D平面,然后再加以求解。

为了方便说明,这里假设一个SE3的表现形式为\(T\), 假设\(T\) 以如下值来表示

(1)
$$
T_1 =\begin{bmatrix}
-0.69492055764131 & 0.71352099052778 & 0.08929285886191    & 4
\\
 -0.19200697279199 & -0.30378504433947 &  0.93319235382364
& 5
 \\
  0.69297816774177 &   0.63134969938371 &   0.34810747783026 & 8
  \\
  0 & 0 & 0 & 1
\end{bmatrix}
$$
1.1 x-y平面
为了取出x-y对应的旋转部分分量,这里定义如下变换矩阵  
(2)
$$
T_{xy1} =\begin{bmatrix}
1 & 0 & 0 & 0
\\
0 & 1 & 0 & 0
\\
0 & 0 & 0 & 0
\\
0 & 0 & 0 & 0
\end{bmatrix}
$$
则经过 \(T_{xy1}TT_{xy1}\)可以取到\(T\)中2*2旋转部分,执行后得到类似如下结果  
(3)
$$
T_{xy1}TT_{xy1} =\begin{bmatrix}
-0.69492055764131 & 0.71352099052778 & 0 & 0
\\
 -0.19200697279199 & -0.30378504433947 & 0 & 0
 \\
  0 & 0 & 0 & 0
 \\
 0 & 0 & 0 & 0
 \end{bmatrix}
$$
为了取出x-y偏移部分,这里定义如下矩阵  
(4)
$$
T_2 =\begin{bmatrix}
0 & 0 & 0 & 0
\\
0 & 0 & 0 & 0
\\
0 & 0 & 0 & 0
\\
0 & 0 & 0 & 1
\end{bmatrix}
$$
则经过 \(T_{xy1}TT_2\)可以取到\(T\)中2*1偏移部分,执行后得到类似如下结果  
(5)
$$
T_{xy1}TT_2 =\begin{bmatrix}
0 & 0 & 0 & 4
\\
0 & 0 & 0 & 5
 \\
  0 & 0 & 0 & 0
 \\
 0 & 0 & 0 & 0
 \end{bmatrix}
$$

这里定义矩阵  
(6)
$$
\begin{aligned}
T_{xy3}=T_{xy1}+T_2&=
\begin{bmatrix}
1 & 0 & 0 & 0
\\
0 & 1 & 0 & 0
\\
0 & 0 & 0 & 0
\\
0 & 0 & 0 & 1
\end{bmatrix}
\\
\\
T_{xy4} &=\begin{bmatrix}
0 & 0 & 0 & 0
\\
0 & 0 & 0 & 0
\\
0 & 0 & 1 & 0
\\
0 & 0 & 0 & 1
\end{bmatrix}
\end{aligned}
$$
最终可以按如下方式得到我们想要的矩阵  
(7)
$$
T_{xy}'=T_{xy1}TT_{xy3}+T_{xy4}=\begin{bmatrix}
-0.69492055764131 & 0.71352099052778 & 0 & 4
\\
-0.19200697279199 & -0.30378504433947 & 0
& 5
 \\
 0 &   0 &  1 & 0
  \\
  0 & 0 & 0 & 1
\end{bmatrix}
$$
因此,对于一个SE3\(T\),通过公式(7)取出了x-y平面的变换量。

同样,对于一个3D点\(\mathbf{p}\)可以通过如下变换矩阵得到x-y部分分量。  
(8)
$$
\mathbf{p}'_{xy} = T_{xy1}\mathbf{p}+\mathbf{c}
$$

上面的向量\(\mathbf{c}\)为如下向量

(9)

$$
\mathbf{c} = \begin{bmatrix}0\\0\\0\\1\end{bmatrix}
$$

1.2 x-z平面
为了取出x-z对应的旋转部分分量,这里定义如下变换矩阵  
(10)
$$
T_{xz1} =\begin{bmatrix}
1 & 0 & 0 & 0
\\
0 & 0 & 0 & 0
\\
0 & 0 & 1 & 0
\\
0 & 0 & 0 & 0
\end{bmatrix}
$$
则经过 \(T_{xz1}TT_{xz1}\)可以取到\(T\)中2*2旋转部分,执行后得到类似如下结果  
(11)
$$
T_{xz1}TT_{xz1} =\begin{bmatrix}
-0.69492055764131 & 0 & 0.08929285886191 & 0
\\
0 & 0 & 0 & 0
\\
0.69297816774177 & 0 & 0.34810747783026 & 0
\\
0 & 0 & 0 & 0 & 
 \end{bmatrix}
$$
则经过 \(T_{xz1}TT_2\)可以取到T中2*1偏移部分,执行后得到类似如下结果  
(12)
$$
T_{xz1}TT_2 =\begin{bmatrix}
0 & 0 & 0 & 4
\\
0 & 0 & 0 & 0
 \\
  0 & 0 & 0 & 8
 \\
 0 & 0 & 0 & 0
 \end{bmatrix}
$$

这里定义矩阵  
(13)
$$
\begin{aligned}
T_{xz3}=T_{xz1}+T_2&=
\begin{bmatrix}
1 & 0 & 0 & 0
\\
0 & 0 & 0 & 0
\\
0 & 0 & 1 & 0
\\
0 & 0 & 0 & 1
\end{bmatrix}
\\
\\
T_{xz4} &=\begin{bmatrix}
0 & 0 & 0 & 0
\\
0 & 1 & 0 & 0
\\
0 & 0 & 0 & 0
\\
0 & 0 & 0 & 1
\end{bmatrix}
\end{aligned}
$$
最终可以按如下方式得到我们想要的矩阵  
(14)
$$
T_{xz}'=T_{xz1}TT_{xz3}+T_{xz4}=\begin{bmatrix}
-0.69492055764131 & 0 & 0.08929285886191 & 4
\\
 0 & 1 & 0 & 0
 \\
 0.69297816774177 & 0 & 0.34810747783026 & 8
 \\
 0 & 0 & 0 & 1
\end{bmatrix}
$$
因此,对于一个SE3\(T\),通过公式(13)取出了x-z平面的变换量。

同样,对于一个3D点\(\mathbf{p}\)可以通过如下变换矩阵得到x-z部分分量。  
(15)
$$
\mathbf{p}'_{xz} = T_{xz1}\mathbf{p}+\mathbf{c}
$$

1.3 y-z平面
为了取出y-z对应的旋转部分分量,这里定义如下变换矩阵  
(16)
$$
T_{xz1} =\begin{bmatrix}
0 & 0 & 0 & 0
\\
0 & 1 & 0 & 0
\\
0 & 0 & 1 & 0
\\
0 & 0 & 0 & 0
\end{bmatrix}
$$
则经过 \(T_{yz1}TT_{yz1}\)可以取到\(T\)中2*2旋转部分,执行后得到类似如下结果  
(17)
$$
T_{yz1}TT_{yz1} =\begin{bmatrix}
0 & 0 & 0 & 0
\\
0 & -0.30378504433947 & 0.93319235382364 & 0
\\
0 & 0.63134969938371 & 0.34810747783026 & 0
\\
0 & 0 & 0 & 0
\end{bmatrix}
$$
则经过 \(T_{yz1}TT_2\)可以取到\(T\)中2*1偏移部分,执行后得到类似如下结果  
(18)
$$
T_{yz1}TT_2 =\begin{bmatrix}
0 & 0 & 0 & 0
\\0 & 0 & 0 & 5
\\0 & 0 & 0 & 8
\\0 & 0 & 0 & 0
 \end{bmatrix}
$$

这里定义矩阵  
(19)
$$
\begin{aligned}
T_{yz3}=T_{yz1}+T_2&=
\begin{bmatrix}
0 & 0 & 0 & 0
\\
0 & 1 & 0 & 0
\\
0 & 0 & 1 & 0
\\
0 & 0 & 0 & 1
\end{bmatrix}
\\
\\
T_{yz4} &=\begin{bmatrix}
1 & 0 & 0 & 0
\\
0 & 0 & 0 & 0
\\
0 & 0 & 0 & 0
\\
0 & 0 & 0 & 1
\end{bmatrix}
\end{aligned}
$$
最终可以按如下方式得到我们想要的矩阵  
(20)
$$
T_{yz}'=T_{yz1}TT_{yz3}+T_{yz4}=\begin{bmatrix}
1 & 0 & 0 & 0
\\ 0 & -0.30378504433947 & 0.93319235382364 & 5
\\ 0 & 0.63134969938371 & 0.34810747783026 & 8
\\ 0 & 0 & 0 & 1 \end{bmatrix}
$$
因此,对于一个SE3\(T\),通过公式(19)取出了y-z平面的变换量。

同样,对于一个3D点\(\mathbf{p}\)可以通过如下变换矩阵得到y-z部分分量。  
(21)
$$
\mathbf{p}'_{yz} = T_{yz1}\mathbf{p}+\mathbf{c}
$$

2 结论
1. 对于x-y平面映射,位姿或者变换矩阵使用公式(7)进行转换、空间点使用(8)进行转换。
2. 对于x-z平面映射,位姿或者变换矩阵使用公式(13)进行转换、空间点使用(14)进行转换。
3. 对于y-z平面映射,位姿或者变换矩阵使用公式(19)进行转换、空间点使用(20)进行转换。


3 案例
3.1 问题

空间中有一个射线A(其表示位姿为\(T_A\))、与射线B(其表示位姿为\(T_B\)),将射线A通过某个变换\(T\)可以使得射线A与射线B在x-y平面完全重合。现在想建立\(T_A\)、\(T_B\),以及变换\(T\)的关系式。

3.2 求解
实际可以使用如下公式构建求解目标
(22)
$$
F=T_{xy1}(T_AT^{-1}-T_B)T_{xy3}=\mathbf{0}_{4\times4}
$$
为了方便李代数计算,分别取出第1、2、4列数据作为误差项,使用如下方式等效(21)的方程  
(23)
$$
\begin{cases}
\mathbf{e}_1=F\mathbf{a}=T_{xy1}(T_AT^{-1}-T_B)T_{xy3}\mathbf{a}=\mathbf{0}
\\
\mathbf{e}_2=F\mathbf{b}=T_{xy1}(T_AT^{-1}-T_B)T_{xy3}\mathbf{b}=\mathbf{0}
\\
\mathbf{e}_3=F\mathbf{c}=T_{xy1}(T_AT^{-1}-T_B)T_{xy3}\mathbf{c}=\mathbf{0}
\end{cases}
$$ 
或者取出第1、2行数据作为误差项,使用如下方式等效(22)的方程  
(24)
$$
\begin{cases}
\mathbf{e}_1=F^T\mathbf{a}=T_{xy3}^T((T^{-1})^T T_A^T-T_B^T)T_{xy1}^T\mathbf{a}=\mathbf{0}
\\
\mathbf{e}_2=F^T\mathbf{b}=T_{xy3}^T((T^{-1})^TT_A^T-T_B^T)T_{xy1}^T\mathbf{b}=\mathbf{0}
\end{cases}
$$ 

上面的\(\mathbf{a},\mathbf{b}\)定义如下  
(25)
$$
\mathbf{a}=[1,0,0,0]^T
\\
\mathbf{b}=[0,1,0,0]^T
$$
因此最终可以使用(23)或(24)算式来进行求解。

空间直线匹配建立相关约束

1 空间中两条直线匹配建立关系
现在已知空间直线A方程为  
(1)
$$
\mathbf{p}_1 = \mathbf{n}_1\alpha + \mathbf{p}_1'
$$

现在已知空间直线B方程为  
(2)
$$
\mathbf{p}_2 = \mathbf{n}_2\beta + \mathbf{p}_2'
$$

上面公式中\(\mathbf{n}_1\)为直线A单位方向向量,\(\mathbf{n}_2\)为直线B单位方向向量。现在将直线A进行(\(R,\mathbf{t}\))变换后,能与直线B完全重合。现在想建立直线A、B、以及(\(R,\mathbf{t}\))的关系。

构建关系有多种方式,比如将线上变换后的点到目标线的距离作为约束;另一种法方式是将变换后的点投到目标线参数方程上, 如果点在线上,则满足参数方程约束。本文建立关系则基于后一种方式。

1.1 考虑方向向量匹配
有时,我们能够确定直线A与直线B在A通过(\(R,\mathbf{t}\))变换后,其变换后的直线与直线B完全重合,并且表示直线的单位方向向量也完全重合, 则这时必有如下关系成立  
(3)
$$
\mathbf{n}_2 = R\mathbf{n}_1
$$
根据直线变换后完全重合的条件有  
(4)
$$
\begin{aligned}
R\mathbf{p}_1+\mathbf{t}&= R(\mathbf{n}_1\alpha + \mathbf{p}_1')+\mathbf{t}
\\
&=\mathbf{p}_2
\\
&= \mathbf{n}_2\beta + \mathbf{p}_2'
\\
&= R\mathbf{n}_1\beta+\mathbf{p}_2'
\\
&\Downarrow
\\
R\mathbf{n}_1(\beta-\alpha)&=R\mathbf{p}_1'+\mathbf{t} – \mathbf{p}_2'
\\
&\Downarrow
\\
(\beta-\alpha)\mathbf{a} &= \mathbf{b}
\end{aligned}
$$
上面的中间变量\(\mathbf{a}\)与 \(\mathbf{b}\)定义如下 
(5)
$$
\begin{aligned}
\mathbf{a} &= R \mathbf{n}_1
\\
\mathbf{b} &= R\mathbf{p}_1'+\mathbf{t} – \mathbf{p}_2'
\end{aligned}
$$
在公式(4)中,任意取一个\(\beta\)均有一个唯一对应的\(\alpha\).即个\(\beta-\alpha\)为一个常量,由于个\(\beta\)的任意性,很明显个\(\mathbf{a}\)与个\(\mathbf{b}\)满足如下关系  
(6)
$$
\dfrac{1}{|\mathbf{a}|}\mathbf{a}=\dfrac{1}{|\mathbf{b}|}\mathbf{b}
$$
虽然上面公式(6)可以直接构建约束,但由于涉及到向量取模,一种等效的方式是使用如下方程来约束  
(7)
$$
\begin{cases}
a_0b_1=a_1b_0
\\
a_0b_2=a_2b_0
\\
a_1b_2=a_2b_1
\end{cases}
$$
公式(7)中有效约束实际为2个方程,实际使用时,可以任意选则两个方程进行构建。很明显,公式(7)的计算量比公式(6)小了很多,因此实际情况下可使用公式(7)来构建约束。

另一种方式是使用如下方式构建,针对公式(4)有  
(8)
$$\begin{aligned}
R\mathbf{n}_1(\beta-\alpha)&=R\mathbf{p}_1'+\mathbf{t} – \mathbf{p}_2'
\\
&\Downarrow
\\
\mathbf{p}_2'^\wedge R\mathbf{n}_1(\beta-\alpha) &= \mathbf{p}_2'^\wedge (R\mathbf{p}_1'+\mathbf{t})
\\
&\Downarrow
\\
0 = (R\mathbf{n}_1)^T \mathbf{p}_2'^\wedge R\mathbf{n}_1(\beta-\alpha) &= (R\mathbf{n}_1)^T \mathbf{p}_2'^\wedge (R\mathbf{p}_1'+\mathbf{t}) \end{aligned}$$
同理,可以得到如下约束表达式  
(9)
$$
\begin{cases}
(R\mathbf{n}_1)^T \mathbf{p}_2'^\wedge (R\mathbf{p}_1'+\mathbf{t}) = 0
\\
(R\mathbf{n}_1)^T \mathbf{t}^\wedge (R\mathbf{p}_1'-\mathbf{p}_2')=0
\end{cases}
$$

因此最终可以使用公式(3)与(7)来构建约束方程或者 (3)与(9)来构建约束方程

1.2 不考虑方向向量匹配
有的情况下,我们无法保证提供的两个直线方向向量在变换后是否一致,这时,我们基于的理论是:A直线上的点变换后,一定在B直线上。则根据变换条件有  
(10)
$$
\begin{aligned}
R\mathbf{p}_1+\mathbf{t}&= R(\mathbf{n}_1\alpha + \mathbf{p}_1')+\mathbf{t}
\\
&=\mathbf{p}_2
\\
&= \mathbf{n}_2\beta + \mathbf{p}_2'
\\
&\Downarrow
\\
\mathbf{n}_2\beta&=\alpha R\mathbf{n}_1+R\mathbf{p}_1'+\mathbf{t} – \mathbf{p}_2'
\\
&\Downarrow
\\
\beta\mathbf{n}_2&=\alpha \mathbf{a} + \mathbf{b}
\\
&\Downarrow
\\
\beta \mathbf{b}^\wedge \mathbf{n}_2 &= \alpha \mathbf{b}^\wedge \mathbf{a}
\\
&\Downarrow
\\
\beta \mathbf{n}_2^T \mathbf{b}^\wedge \mathbf{n}_2 &= \alpha \mathbf{n}_2^T \mathbf{b}^\wedge \mathbf{a}
\\
&\Downarrow
\\
\mathbf{n}_2^T \mathbf{b}^\wedge \mathbf{a} &= 0
\end{aligned}
$$
即从(10)中我们可以得到一个约束  
(11)
$$
\mathbf{n}_2^T \mathbf{b}^\wedge \mathbf{a} = 0
$$
虽然(11)算式反应了两条直线匹配的关系,但是还有一个隐藏约束没有用到,即两条直线上的点一一对应。即,每个\(\beta\)对应着一个唯一的 \(\alpha\),上面公式在约去\(\beta\)的过程中,并没有反映其一一对应性,为了进一步找出约束关系,这里设  
(12)
$$
\mathbf{n}_2=\begin{bmatrix}
x
\\
y
\\
z
\end{bmatrix}
$$

1.2.1 消去x
当\(\mathbf{n}_2\)中绝对值元素最大的值为\(x\),则消去(10)中的\(\beta\)有  
(13)
$$
\begin{aligned}
\begin{bmatrix}
\dfrac{y}{x}
\\
\\
\dfrac{z}{x}
\end{bmatrix}&=
\begin{bmatrix}
\dfrac{\alpha a_1+b_1}{\alpha a_0 + b_0}
\\
\\
\dfrac{\alpha a_2+b_2}{\alpha a_0 + b_0}
\end{bmatrix}
\\
&\Downarrow
\\
&\begin{cases}
\alpha(a_0y-a_1x)+(b_0y-b_1x)=0
\\
\alpha(a_0z-a_2x) +(b_0z-b_2x)=0
\end{cases}
\end{aligned}
$$
由于每个\(\beta\)对应着唯一的\(\alpha\), 当\(\beta\)取任意值时,\(\alpha\)也可以看成可取任意值.由于\(\beta\)取任意值均需要满足上面表达式,则可以得到如下约束方程  
(14)
$$
\begin{cases}
a_0y=a_1x
\\
b_0y=b_1x
\\
a_0z=a_2x
\\
b_0z=b_2x
\end{cases}
$$
上面公式中隐含了 \(a_0b_1=a_1b_0\)与 \(a_0b_2=a_2b_0\)。因此最终使用(14)算式构建约束

1.2.2 消去y
当\(\mathbf{n}_2\)中绝对值元素最大的值为\(y\),则消去(10)中的\(\beta\)有  
(15)
$$
\begin{aligned}
\begin{bmatrix}
\dfrac{x}{y}
\\
\\
\dfrac{z}{y}
\end{bmatrix}&=
\begin{bmatrix}
\dfrac{\alpha a_0+b_0}{\alpha a_1 + b_1}
\\
\\
\dfrac{\alpha a_2+b_2}{\alpha a_1 + b_1}
\end{bmatrix}
\\
&\Downarrow
\\
&\begin{cases}
\alpha(a_1x-a_0y)+(b_1x-b_0y)=0
\\
\alpha(a_1z-a_2y) +(b_1z-b_2y)=0
\end{cases}
\end{aligned}
$$
由于每个\(\beta\)对应着一个\(\alpha\), 当\(\beta\)取任意值时,\(\alpha\)也可以看成可取任意值.由于\(\beta\)取任意值均需要满足上面表达式,则可以得到如下约束方程  
(16)
$$
\begin{cases}
a_1x=a_0y
\\
b_1x=b_0y
\\
a_1z=a_2y
\\
b_1z=b_2y
\end{cases}
$$
上面公式中隐含了 \(a_0b_1=a_1b_0\)与 \(a_1b_2=a_2b_1\)。因此最终使用(16)算式构建约束

1.2.3 消去z
当\(\mathbf{n}_2\)中绝对值元素最大的值为\(z\),则消去(10)中的\(\beta\)有  
(17)
$$
\begin{aligned}
\begin{bmatrix}
\dfrac{x}{z}
\\
\\
\dfrac{y}{z}
\end{bmatrix}&=
\begin{bmatrix}
\dfrac{\alpha a_0+b_0}{\alpha a_2 + b_2}
\\
\\
\dfrac{\alpha a_1+b_1}{\alpha a_2 + b_2}
\end{bmatrix}
\\
&\Downarrow
\\
&\begin{cases}
\alpha(a_2x-a_0z)+(b_2x-b_0z)=0
\\
\alpha(a_2y-a_1z) +(b_2y-b_1z)=0
\end{cases}
\end{aligned}
$$
由于每个\(\beta\)对应着一个\(\alpha\), 当\(\beta\)取任意值时,\(\alpha\)也可以看成可取任意值.由于\(\beta\)取任意值均需要满足上面表达式,则可以得到如下约束方程  
(18)
$$
\begin{cases}
a_2x=a_0z
\\
b_2x=b_0z
\\
a_2y=a_1z
\\
b_2y=b_1z
\end{cases}
$$
上面公式中隐含了 \(a_0b_2=a_2b_0\)与 \(a_1b_2=a_2b_1\)。因此最终使用(18)算式构建约束

平面匹配间的变换约束

1 约定

这里约定两个同纬度向量矩阵乘之后为1\(\times\)1大小时为一个数字。

2 空间中两个平面匹配建立关系
在空间中有平面A(\(\mathbf{n}_1,d_1\))与平面B(\(\mathbf{n}_2,d_2\)),这里\(\mathbf{n}_1\)为平面A的单位法向量,\(\mathbf{n}_2\)为平面B的单位法向量。

现在已知,平面A经过(\(R,\mathbf{t}\))变换后与平面B完全重合。对于一个平面的方向向量,在经过变换后必然满足如下(1)与(2)之一的关系(可以通过点的变换推导出来)  
(1)$$
\mathbf{n}_2=R\mathbf{n}_1
$$
或者  
(2)$$
\mathbf{n}_2=-R\mathbf{n}_1$$

现在平面A上取一个点\(\mathbf{p}\),则根据A平面方程有  
(3)$$
\mathbf{n}_1^T\mathbf{p}+d_1=0
$$
同样地,\(\mathbf{p}\)经过变换后,必在平面B上,即  
(4)$$
\mathbf{n}_2^T(R\mathbf{p}+\mathbf{t})+d_2=0
$$
将(1)(3)代入(4)有  
(5)$$
\mathbf{n}_2^T\mathbf{t}=d_1-d_2
$$
将(2)(3)代入(4)有  
(6)$$
\mathbf{n}_2^T\mathbf{t}=-d_1-d_2
$$
因此,对于匹配的两个平面,其相对测量有如下关系

2.1 法向严格一致
如果要求匹配的平面,法向严格一致,则使用如下约束  
(7)$$
\begin{aligned}
\mathbf{n}_2&=R\mathbf{n}_1
\\
\mathbf{n}_2^T\mathbf{t}&=d_1-d_2
\end{aligned}$$

2.2 法向严格相反
如果要求匹配的平面,法向严格相反,则使用如下约束  
(8)$$
\begin{aligned}
\mathbf{n}_2&=-R\mathbf{n}_1
\\
\mathbf{n}_2^T\mathbf{t}&=-d_1-d_2
\end{aligned}$$

2.3 任意平面匹配
有时,我们构建了平面,提供了平面法向参数,但是我们无法确定两个平面法向的一致性(对于同一个平面,不同使用者构建的平面参数的法向量可能完全相反),这时我们只要求平面完全重合(即,在一个平面上任意取一点,经过变换后的点位,一定落在另一个平面上),这时依据此来建立约束。

这里建立约束主要使用下面(15)或(19)或(23)的约束方程来建立。

这里展开公式(4)有  
(9)$$
\begin{aligned}
0&=\mathbf{n}_2^T(R\mathbf{p}+\mathbf{t})+d_2
\\
&=(R^T\mathbf{n}_2)^T\mathbf{p}+\mathbf{n}_2^T\mathbf{t}+d_2
\end{aligned}
$$
这里设置如下中间变量  
(10)$$
\begin{aligned}
\mathbf{h}&=R^T\mathbf{n}_2
\\
g&=\mathbf{n}_2^T\mathbf{t}+d_2
\\
\mathbf{p}&= \begin{bmatrix}  
x
\\
y
\\
z
\end{bmatrix}  \\
\mathbf{n}_1&= \begin{bmatrix}  
n_{1,0}
\\
n_{1,1}
\\
n_{1,2}
\end{bmatrix} 
\end{aligned}
$$
将公式(10)带入(3)(9)有  
(11)$$
\begin{cases}
n_{1,0}x+n_{1,1}y+n_{1,2}z+d_1=0
\\
h_0x+h_1y+h_2z+g=0
\end{cases}$$

2.3.1 消去x
如果\(n_{1,0}\)为向量\(\mathbf{n}_1\)中的绝对值最大的元素,则在(11)中的约束变为  
(12)$$
\begin{cases}
x+a_xy+b_xz+c_x=0
\\
h_0x+h_1y+h_2z+g=0
\end{cases}
$$
上面公式中\(a_x\)、\(b_x\)、\(c_x\)定义如下  
(13)$$
\begin{aligned}
a_x &=\dfrac{n_{1,1}}{n_{1,0}}
\\
b_x &=\dfrac{n_{1,2}}{n_{1,0}}
\\
c_x &=\dfrac{d_1}{n_{1,0}}
\end{aligned}
$$
在(12)中消去\(x\)有  
(14)$$
(h_1-h_0a_x)y+(h_2-h_0b_x)z+(g-h_0c_x)=0
$$
由于\(y\)、\(z\)取任意值,均满足(14)算式,因此可得到如下约束方程  
(15)$$
\begin{cases}
h_1=h_0a_x
\\
h_2=h_0b_x
\\
g=h_0c_x
\end{cases}$$

2.3.2 消去y
如果\(n_{1,1}\)为向量\(\mathbf{n}_1\)中的绝对值最大的元素,则在(11)中的约束变为  
(16)$$
\begin{cases}
a_yx+y+b_yz+c_y=0
\\
h_0x+h_1y+h_2z+g=0
\end{cases}
$$
上面公式中\(a_y\)、\(b_y\)、\(c_y\)定义如下  
(17)$$
\begin{aligned}
a_y &=\dfrac{n_{1,0}}{n_{1,1}}
\\
b_y &=\dfrac{n_{1,2}}{n_{1,1}}
\\
c_y &=\dfrac{d_1}{n_{1,1}}
\end{aligned}
$$
在(12)中消去\(y\)有  
(18)$$
(h_0-h_1a_y)x+(h_2-h_1b_y)z+(g-h_1c_y)=0
$$
由于\(x\)、\(z\)取任意值,均满足(18)算式,因此可得到如下约束方程  
(19)$$
\begin{cases}
h_0=h_1a_y
\\
h_2=h_1b_y
\\
g=h_1c_y
\end{cases}$$

2.3.3 消去z
如果\(n_{1,2}\)为向量\(\mathbf{n}_1\)中的绝对值最大的元素,则在(11)中的约束变为  
(20)$$
\begin{cases}
a_zx+y+b_zy+c_z=0
\\
h_0x+h_1y+h_2z+g=0
\end{cases}
$$
上面公式中\(a_z\)、\(b_z\)、\(c_z\)定义如下  
(21)
$$
\begin{aligned}
a_z &=\dfrac{n_{1,0}}{n_{1,2}}
\\
b_z &=\dfrac{n_{1,1}}{n_{1,2}}
\\
c_z &=\dfrac{d_1}{n_{1,2}}
\end{aligned}
$$
在(12)中消去\(z\)有  
(22)
$$
(h_0-h_2a_z)x+(h_1-h_2b_z)y+(g-h_2c_z)=0
$$
由于\(x\)、\(y\)取任意值,均满足(22)算式,因此可得到如下约束方程  
(23)$$
\begin{cases}
h_0=h_2a_z
\\
h_1=h_2b_z
\\
g=h_2c_z
\end{cases}$$

PDF页面合并提取小工具

1. 背景

有时我们需要提取PDF文件指定页面,有时我们需要将一些PDF文件进行合并。一个比较常见的场景是,某天我们需要将一个扫描文件(图片形式), 将它嵌入或者追加到一个已有PDF文件里,这时就可以使用这个小工具进行处理。

 

2. 解决

除了商业软件可解决背景里提到的问题外,一些免费的在线PDF工具也提供了类似功能,如果想使用一个免费且又不想文件外流的工具,那就可以使用本页面提供的这个小工具。这个小工具只提供PDF文件的分割以及合并。如果会一点编程知识,使用Python或者其它语言库也能快速解决。这个工具没有多大技术含量,就是调用了PDFSharp提供的几个接口封装而成。

 

3. 下载

PDF合并提取小工具